场景
实现效果如下
注:
实现
新建Android项目,首先打开activity_main.xml
修改其为FrameLayout帧布局管理器,并添加Id属性和背景照片
然后在包下新建自定View类dog类
使其继承View类,然后声明两个float变量来存储其位置。在其构造方法中对位置进行初始化。
然后重写onDraw方法,根据指定的位置进行重绘view
package com.badao.defineview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;public classDogView extends View {public floatbitmapX;public floatbitmapY;publicDogView(Context context) {
super(context);
bitmapX= 290;
bitmapY= 130;
}
@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);//新建画笔对象
Paint paint = newPaint();//获取照片
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.dog);//绘制照片
canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);//回收图片
if(bitmap.isRecycled())
{
bitmap.recycle();
}
}
}
然后回到MainActivity,获取layout,声明自定义的view并设置触摸事件监听器,将触摸位置的坐标赋值给自定义view的位置,然后重绘view,并将其添加到layout中
package com.badao.defineview;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;public classMainActivity extends AppCompatActivity {
@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//获取layout
FrameLayout frameLayout =(FrameLayout) findViewById(R.id.frameLayout);//声明自定义View
final DogView dogView = new DogView(this);//设置触摸事件监听器
dogView.setOnTouchListener(newView.OnTouchListener() {
@Overridepublic boolean onTouch(View v, MotionEvent event) {//获取触摸位置的X的坐标
dogView.bitmapX = event.getX();//获取触摸位置Y的坐标
dogView.bitmapY = event.getY();//需要重绘view
dogView.invalidate();return true;
}
});//将自定义view添加到layout中
frameLayout.addView(dogView);
}
}