自定义view,跟随手指的小兔子

开发自定义的view

一.一般用帧布局管理器framelayout,

二.Java中继承View类(android.view包中的),至少要有一个构造方法,一般还要重写onDraw方法,在这个方法中绘制组件

三.创建自定义的view后,还要在activity中实例化这个自定义的view,然后添加到帧布局管理器中



activity_main中的代码

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="@mipmap/img003"
    android:id="@+id/mylayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">



</FrameLayout>


RabbitView.java代码

package com.example.myview;

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 class RabbtView extends View { //继承View,会出现红色波浪线错误提醒,提醒我们写构造函数,按alt+ 回车
//    然后错误就会消失
//    在构造方法中设置(图标)兔子默认显示位置,
    public float bitmapX; //图标的x坐标,全局变量
    public float bitmapY; //图标的Y坐标
    public RabbtView(Context context) {
        super(context);
        bitmapX=290;
        bitmapY=130;
    }
//    还要从写ondrad方法,点右键generate..,然后点override methods..然后输入ondraw就可以找到大概位置

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//        在这个方法中通过小兔子的图片绘制小兔子

//       实例化画笔对象paint
//        设置位图对象bitmap
        Paint paint=new Paint();
        Bitmap bitmap= BitmapFactory.decodeResource(this.getResources(), R.mipmap.rabbit);
//        有两个入口参数,第一个参数是recouse对象
//        第二个参数是图像资源id


//        接下来绘制这只兔子,快捷键ctrl+p  参数提示
        canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);
//                第一个参数bitmap对象
//        第一个是bitmapx坐标,第二个是y坐标
//        第四个参数是画笔对象

//       强制回收图片

//        判断bitmap对象是否被回收
        if(bitmap.isRecycled()){
//            在其中强制回收图片
            bitmap.recycle();

        }
    }
}
 
 


MainActivity.java中的代码

package com.example.myview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        获取布局文件的布局管理器,然后把兔子图标添加到布局管理器中

        FrameLayout frameLayout =findViewById(R.id.mylayout);

//         实例化rabbitview,参数为上下文对象this
        final RabbtView rabbtView=new RabbtView(this);

//        为了兔子能跟随手指移动而移动,设置触摸事件监听器,(就是这个类的一个方法),方法参数是触摸事件监听器,
// 用匿名内部类来进行指定,(android studio会自动帮我们重写ontouch方法)

        rabbtView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
//                让兔子坐标等于手指坐标
                rabbtView.bitmapX=motionEvent.getX();  //写到这里时,final RabbtView rabbtView =new RabbtView(this);这句代码多了finall这个单词

                rabbtView.bitmapY=motionEvent.getY();

//                然后重绘这只兔子
                rabbtView.invalidate();

//                return返回true
                return true;
            }
        });

//        别忘了把兔子添加到布局管理器中
        frameLayout.addView(rabbtView);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38309980/article/details/80858198
今日推荐