自定义View(四)之提取和封装自定义View

前言

自定义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()方法即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值