0
点赞
收藏
分享

微信扫一扫

Android(六):随手指移动的图片


展示

Android(六):随手指移动的图片_位图

页面布局

  • 用于存放图片的容器(帧布局)

<?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: 将​​自定义组件对象添加到布局中​


举报

相关推荐

0 条评论