绘制圆弧,根据进度改变整个圆弧的颜色

进度颜色:设置了从红色到绿色渐变


自定义view代码:

最重要的一个方法是

package com.sprdrise.mylockscreenview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.graphics.drawable.ArgbEvaluator;
import android.util.AttributeSet;
import android.view.View;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by Administrator on 2018/5/4.
 */

public class MyAnimView extends View {
    private int imgWidth;
    private int imgHeight;
    private TimerTask timerTask;
    private Timer timer = new Timer();
    private Paint mPaint;
    private float endAngle;
    private RectF mProgressRect = new RectF();
    private Paint mProgressBgPaint;
    private Paint mProgressPaint;

    private int mStartColor;
    private int mEndColor;
    //圆环渐变颜色值
    private int processDefaultColor;  /*默认颜色*/

    public MyAnimView(Context context) {
        super(context);
        init();
        initColor();
    }

    public MyAnimView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
        initColor();
    }

    public MyAnimView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }


    private void init() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);

        mProgressBgPaint = new Paint();
        mProgressBgPaint.setAntiAlias(true);
//        mProgressBgPaint.setColor(Color.LTGRAY);
        mProgressBgPaint.setColor(getResources().getColor(R.color.ProgressBgColor));
        mProgressBgPaint.setStyle(Paint.Style.STROKE);
        mProgressBgPaint.setStrokeWidth(5);

        //进度条画笔
        mProgressPaint = new Paint();
        mProgressPaint.setAntiAlias(true);
        mProgressPaint.setColor(Color.BLUE);
        mProgressPaint.setStyle(Paint.Style.STROKE);
        mProgressPaint.setStrokeWidth(5);

        imgWidth = 200;
        imgHeight = 200;
        mProgressRect.set(5, 5,  imgWidth -5,  imgHeight -5);

        //每三十毫秒发送一个massage更新
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = 0;
                mHeader.sendMessage(message);
            }
        }, 0, 30);
    }

    private void initColor() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            processDefaultColor = this.getContext().getColor(R.color.colorPrimary);
            //获取开始的颜色值和结束的颜色值
            mStartColor = this.getContext().getColor(R.color.startColor); //红色
            mEndColor = this.getContext().getColor(R.color.endColor);//绿色
        } else {
            processDefaultColor = getResources().getColor(R.color.colorPrimary);
            mStartColor = getResources().getColor(R.color.startColor);
            mEndColor = getResources().getColor(R.color.endColor);
        }
    }

    private final Handler mHeader = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    endAngle += 5;
                    if (endAngle > 360) {
                        endAngle = 0;
                    }
                    setEndAngle(endAngle);
                    setProcessColor();
                    break;
                case 1:
                    break;
                default:
                    break;
            }
            super.handleMessage(msg);
        }
    };

    public void setProcessColor() {
        ArgbEvaluator argbEvaluator = new ArgbEvaluator();
        //根据偏移量获取颜色值,并设置到paint中
        int currentColor = (int) (argbEvaluator.evaluate((endAngle / 360), mStartColor, mEndColor));
        mProgressPaint.setColor(currentColor);
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(5 + imgWidth / 2, 5 + imgHeight / 2, imgWidth / 2 - 5, mProgressBgPaint);
        //画进度条  第二个参数 是圆弧开始的角度。因为默认起始点是从水平开始(3点钟方向),所以若要从12点钟开始,必须旋转270度。
        canvas.drawArc(mProgressRect, 270, endAngle, false, mProgressPaint);
    }

    public void setEndAngle(float endAngle) {
        if (endAngle > 360) {
            endAngle = 0;
        }
        this.endAngle = endAngle;
        invalidate();
    }
}
最重要的一个方法:
这个方法 
   public void setProcessColor() {
        ArgbEvaluator argbEvaluator = new ArgbEvaluator();
        //根据偏移量获取颜色值,并设置到paint中
        int currentColor = (int) (argbEvaluator.evaluate((endAngle / 360), mStartColor, mEndColor));
        mProgressPaint.setColor(currentColor);
        invalidate();
    }

public Object evaluate(float fraction, Object startValue, Object endValue)这个方法有三个参数。 

第一个,一个float值,0~1.0f;代表进度。 
第二个,开始颜色 
第三个,结束颜色。

第一个参数其实就是个offset从0~1,返回值int,就是从第一个颜色,到结束样式一系列过渡颜色。


颜色渐变得原理:

红色:(255,255,0)

绿色:(255, 0 , 255)

从红色 --->绿色,分成100份,

R: (255-255)/100 = 0

G: (0-255)/100 = -2.55

B: (255-0)/100 = 2.55

然后红色每加一次,颜色就变更一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值