前言
自定义View在Android中使用非常普遍,实现复杂的效果,其代码也比较多,所以就需要我们将View中绘制和逻辑控制进行提取和封装,使我们的代码更加清晰简洁。
这里以绘制一个文本,并实现跑马灯效果为例来展示一下。
展示
这里我们写一个BaseView继承View:
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Admin on 2016/6/27.
*/
public abstract class BaseView extends View {
private Thread thread;
public BaseView(Context context) {
super(context);
}
public BaseView(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected abstract void drawSub(Canvas canvas);//绘制
protected abstract void logic();//逻辑控制
@Override
protected final void onDraw(Canvas canvas) {//这里加入final修饰符,防止子类重写onDraw()方法
if(thread==null){
thread=new MyThread();
thread.start();
}else{
drawSub(canvas);
}
}
@Override
protected void onDetachedFromWindow() {//当view离开屏幕的时候调用
super.onDetachedFromWindow();
running=false;
}
private boolean running=true;
class MyThread extends Thread{
@Override
public void run() {
while (running) {
logic();
postInvalidate();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
然后具体的使用
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import java.util.Random;
/**
* Created by Admin on 2016/6/27.
*/
public class MyView extends BaseView {
private Paint paint = new Paint();
private float rx = 0;
private RectF rectF = new RectF(0, 60, 100, 160);
private float sweepAngle = 0;
private Random random = new Random();
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void drawSub(Canvas canvas) {
paint.setTextSize(30);
canvas.drawText("自定义View", rx, 30, paint);
canvas.drawArc(rectF, 0, sweepAngle, true, paint);
}
@Override
protected void logic() {
rx += 3;
if (rx > getWidth()) {//如果横坐标大于view的宽度,则重置横坐标
rx = -paint.measureText("自定义View");
}
sweepAngle++;
if (sweepAngle > 360) {//如果角度大于360,重置
sweepAngle = 0;
}
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
paint.setARGB(255, r, g, b);//随机改变颜色
}
}
首先我们写一个BaseView的抽象类,然后给两个抽象方法drawSub()和logic(),分别进行绘制和逻辑处理。然后我们在使用的时候,只需继承BaseView,重写drawSub()和logic()方法即可。