进度颜色:设置了从红色到绿色渐变
自定义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
然后红色每加一次,颜色就变更一次。