展示
页面布局
- 用于存放图片的容器(帧布局)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
继承自View的自定义组件类
-
LogoView.cs
using Android.Content;
using Android.Graphics;
using Android.Views;
namespace android_by_csharp
{
public class LogoView : View
{
public float BitmapX;
public float BitmapY;
public LogoView(Context context) : base(context)
{
// 初始化图形要出现的坐标位置
BitmapX = 0;
BitmapY = 0;
}
// 重写OnDraw方法
protected override void OnDraw(Canvas canvas)
{
base.OnDraw(canvas);
// 画笔
var paint = new Paint();
// 生成位图对象
var bitmap = BitmapFactory.DecodeResource(Resources, Resource.Drawable.mini_logo);
if (bitmap == null) return;
// 绘制位图
canvas.DrawBitmap(bitmap, BitmapX - (float)bitmap.Width / 2, BitmapY - (float)bitmap.Height / 2, paint);
// 判断图片是否回收,木有回收的话强制收回图片
if (!bitmap.IsRecycled)
bitmap.Recycle();
}
}
}
在主类中引入自定义的组件类并想布局中添加图片
using Android.App;
using Android.OS;
using Android.Widget;
namespace android_by_csharp
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
// 获取帧布局
var frame = (FrameLayout)FindViewById(Resource.Id.FrameLayout1);
var logo = new LogoView(this);
logo.Touch += (s, e) =>
{
if (e.Event == null) return;
logo.BitmapX = e.Event.GetX();
logo.BitmapY = e.Event.GetY();
// 调用重绘方法
logo.Invalidate();
};
// 添加logo图标
frame?.AddView(logo);
}
}
}
总结
- step 1: 创建空白的布局
FrameLayout
- step 2: 新建一个
继承View类的自定义组件类
,在构造方法中初始化view的初始坐标
- step 3:
重写onDraw()方法
,实例化一个空的画笔类Paint
- step 4: 调用
BitmapFactory.DecodeResource生成位图对象
- step 5: 调用
canvas.DrawBitmap绘制位图对象
- step 6: 判断
图片是否回收
,否则强制回收图片
- step 7: 在
主类
中获取帧布局对象
,并且实例化一个自定义组件的类
- step 8: 在
自定义组件对象
上添加一个触摸事件的监听器
获取手指(x, y)坐标
,用Invalidate()进行重绘
- step 9: 将
自定义组件对象添加到布局中