您的位置:首页 > 其它

带梯度效果的圆形进度View

2015-12-02 20:00 239 查看
带梯度效果的圆形进度View



public class GradientProgressView extends View {

private static final String TAG = GradientProgressView.class.getSimpleName();

private static final float MAX_PROGRESS = 100f;
private static final float CIRCLE_STROKE_WIDTH = 7.0F;
private static final float CIRCLE_WIDTH = 210.0F;
private static int GRADIENT = 100;
private Paint mActivePaint;
private int mCenterX;
private int mCenterY;
private Context mContext;
private Paint mIdlePaint;
private int mProgress;
private int mRadius;

public GradientProgressView(Context context) {
super(context);
initVariable(context);
}

public GradientProgressView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
initVariable(context);
}

public GradientProgressView(Context context, AttributeSet attributeSet, int defStyleAttr) {
super(context, attributeSet, defStyleAttr);
initVariable(context);
}

private int dip2px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}

private void drawActiveArc(Canvas canvas, int progress) {
float f1 = mCenterX - mRadius;
float f2 = mCenterY - mRadius;
float f3 = 2 * mRadius;
float f4 = 2 * mRadius;
float f5 =  progress * 360 / MAX_PROGRESS;
canvas.drawArc(new RectF(f1, f2, f1 + f3, f2 + f4), 0, f5, false, mActivePaint);
}

private void drawIdleArc(Canvas paramCanvas) {
float f1 = mCenterX - mRadius;
float f2 = mCenterY - mRadius;
float f3 = 2 * mRadius;
float f4 = 2 * mRadius;
paramCanvas.drawArc(new RectF(f1, f2, f1 + f3, f2 + f4), -90f, 360f, false, mIdlePaint);
}

private void initPaint() {
float[] intervals = new float[4];
float circumference = (float)(2 * Math.PI * mRadius);
float pathLineWidth = circumference / GRADIENT * 0.4f;
float pathSpaceWidth = circumference / GRADIENT * 0.6f;
intervals[0] =  pathLineWidth;
intervals[1] = pathSpaceWidth;
intervals[2] = pathLineWidth;
intervals[3] = pathSpaceWidth;
DashPathEffect localDashPathEffect = new DashPathEffect(intervals, 0F);

mActivePaint = new Paint();
mActivePaint.setAntiAlias(true);
mActivePaint.setStyle(Paint.Style.STROKE);
mActivePaint.setColor(Color.BLACK);
mActivePaint.setStrokeWidth(dip2px(mContext, CIRCLE_STROKE_WIDTH));
mActivePaint.setPathEffect(localDashPathEffect);

mIdlePaint = new Paint();
mIdlePaint.setAntiAlias(true);
mIdlePaint.setStyle(Paint.Style.STROKE);
mIdlePaint.setColor(Color.BLUE);
mIdlePaint.setStrokeWidth(dip2px(mContext, CIRCLE_STROKE_WIDTH));
mIdlePaint.setPathEffect(localDashPathEffect);
}

private void initVariable(Context context) {
mContext = context;
mRadius = (dip2px(context, CIRCLE_WIDTH) / 2);
initPaint();
}
protected void onDraw(Canvas paramCanvas) {
super.onDraw(paramCanvas);
drawIdleArc(paramCanvas);
drawActiveArc(paramCanvas, mProgress);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mCenterX = View.MeasureSpec.getSize(widthMeasureSpec) / 2;
mCenterY = View.MeasureSpec.getSize(heightMeasureSpec) / 2;
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
MeasureSpec.getSize(heightMeasureSpec));
Log.d(TAG, "width--->" + View.MeasureSpec.getSize(widthMeasureSpec));
Log.d(TAG, "height-->"+View.MeasureSpec.getSize(heightMeasureSpec));
}

public void updateProgress(int progress) {
if (progress > MAX_PROGRESS) return;
mProgress = progress;
invalidate();
}
}


测试:

private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mProgressView.updateProgress(++currentProgress);
sendEmptyMessageDelayed(1, 100);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mProgressView = new GradientProgressView(this);
setContentView(mProgressView);
mProgressView.updateProgress(currentProgress);
handler.sendEmptyMessageDelayed(1,100);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息