自定义View其实很简单,当然实现比较复杂的View算法比较复杂,接下来就说一下最简单的自定义View方法
首先是写一个继承View的类,类中最基本的要包括两个构造方法,onMeasure方法和onDraw方法
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//这个构造方法一般是用不到的
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//测量View大小,实际上就是通过父类View的setMeasuredDimension方法设置MyView的大小
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//通过canvas参数画出自定义View的内容
}
}
前端使用自定义View,对应到自定义View的文件项目位置即可
<com.example.myapplication.MyView
android:id="@+id/myView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/black"/>
最后放上写的一个很简单的自定义View代码:
public class MyView extends View {
Paint paint;
int y = 0;
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(200,200);//设置自定义View的大小
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(50,y,25,paint);
getHandler().postDelayed(runnable,5);
}
public void init(){
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
}
Runnable runnable = new Runnable() {
@Override
public void run() {
y+=15;
if(y>200)y=0;
invalidate();
}
};
}