开发自定义的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对象 // 第一个是bitmap的x坐标,第二个是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); } }