要做的功能是做一个可以随意拖动的物件
首先在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);

最后效果是这样

android 自定义view绘制四边形 android 自定义drawable_布局管理器


那个小方块可以自由拖动,只要把素材换成其他就可以使画面非常和谐