SurfaceView实现进度条

package com.example.testprogreebar;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @author writing
 * @time 2019/8/5 12:37
 * @note ${TODO}
 */
public class TestProgreebar extends SurfaceView implements SurfaceHolder.Callback {

    private int viewWidth;
    private int viewHeight;
    private Paint paint1;
    private Paint paint2;
    private ScheduledExecutorService scheduledExecutorService;
    private boolean stop = false;
    private float progress;
    private int speed = 1;
    private SurfaceHolder holder;
    private RectF r2;

    public TestProgreebar(Context context) {
        this(context, null);
    }

    public TestProgreebar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TestProgreebar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        inits();
    }

    private void inits() {
        holder = this.getHolder();
        holder.addCallback(this);
        paint1 = new Paint();
        paint1.setAntiAlias(true);
        paint1.setColor(Color.GREEN);
        paint2 = new Paint();
        paint2.setAntiAlias(true);
        paint2.setColor(Color.BLUE);

        setZOrderOnTop(true);
        getHolder().setFormat(PixelFormat.TRANSLUCENT);

        setFocusable(true); // 设置焦点
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        viewWidth = MeasureSpec.getSize(widthMeasureSpec);
        viewHeight = MeasureSpec.getSize(heightMeasureSpec);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        r2 = new RectF();
        r2.left = 0;
        r2.right = viewWidth;
        r2.top = 0;
        r2.bottom = viewHeight;

        canvas.drawRoundRect(r2, 10, 10, paint2);
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        Log.i("zhang_xin", "创建");
        stop = false;
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(new ScrollThread(), 1000,
                10, TimeUnit.MILLISECONDS);

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        stop = true;
        scheduledExecutorService.shutdown();
    }

    class ScrollThread implements Runnable {

        @Override
        public void run() {
            while (!stop) {
                draw(progress);
                if(progress>viewWidth){
                    stop = true;
                }
                Log.i("zhang_xin", "绘制中" + (progress));
                progress = progress + speed;
            }
        }
    }

    private synchronized void draw(float v) {
        Canvas canvas = holder.lockCanvas();
        r2.left = 0;
        r2.right = v;
        r2.top = 0;
        r2.bottom = viewHeight;

        canvas.drawRoundRect(r2, 10, 10, paint1);
        holder.unlockCanvasAndPost(canvas);
    }
}

你可能感兴趣的:(SurfaceView实现进度条)