要做的功能是做一个可以随意拖动的物件
首先在xml文件中加入背景图,并定义其ID
android:background="@mipmap/h1"
android:id="@+id/hhh">
在xml文件中新建一个类文件ItemView,继承自View类,定义两个变量Xlable与Y喇叭了。此时会报错,提示创建一个新的构造方法,在新建的构造方法里选择第一个只有一个参数的,之后的具体功能在构造方法里描述
public class ItemView extends View {
public float Xlable;
public float Ylable;
在新建的构造方法中设定Xlable与Ylable的值
public ItemView(Context context) {
super(context);
Xlable=290;
Ylable=130;
}
之后在分号后重载构造方法,在重载的构造方法中选中ondraw,即对默认的ondraw方法进行重新定义,下面的代码为自动生成
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
创建并实例化一个画画笔对象
Paint Item =new Paint();
再定义一个bipmap对象,通过BitmapFactory.decodResource方法实现,这种方法有两个参数,一个是resource,可以用this指向自己,另一个是图片ID,贴上xml文件中的ID
Bitmap weitu = BitmapFactory.decodeResource(this.getResources(),R.mipmap.h4);
然后开始绘制,这里用drawBitmap方法,这种方法需要四个参数,一个是bipmap对象,第二点是横纵坐标,第四个是画笔对象
canvas.drawBitmap(weitu,Xlable,Ylable,Item);
最后还需要回收bipmap,是为了减少内存使用
if(weitu.isRecycled()){
weitu.recycle();
到这里,一个新的View类就已经定义好,它继承自View类,构造方法重载自ondraw。到这里我有点感受到java的强大之处了,构造方法都是封装好,可以直接用关键字+参数的方法调用,封装好的同时又是可以重载,重载时又可以调用其他的构造方法。
返回MainActivity文件,新建一个帧布局管理器,通过findViewByld方法连接到xml,再用(FrameLayout)
强制转换
FrameLayout frameLayout =(FrameLayout)findViewById(R.id.hhh);
实例化刚才定义好的ItemView类,命名为itemview,参数为this指向自己。final关键字表示该类不可被继承。事实上我也不知道为什么要加一个final,但是不加的话,后面就会报错,迷
final ItemView itemView=new ItemView(this);
之后为itemview建立一个触摸事件监听器,该监听器的参数写为一个内部类OnTouchListener,之后会自动弹出代码来重写OnTouchListener
itemView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
在该类里将触摸的XY值赋给itemview的Xlable与Ylable,然后还要重新绘制一个小兔子,用invalidate关键字实现
itemView.Xlable=event.getX();
itemView.Ylable=event.getY();
itemView.invalidate();
return true;
最后不忘把view添加到布局管理器当中
frameLayout.addView(itemView);
最后效果是这样
那个小方块可以自由拖动,只要把素材换成其他就可以使画面非常和谐