模仿小米的进度控件

模仿小米的进度控件_第1张图片
图片发自App

废话少说,咱们先上效果图:

github地址:https://github.com/niniloveyou/GradeProgressView

欢迎前去点个赞(star)

这个效果的使用场景并不多,主要是各种检测的时候,比如垃圾清理,手机安全检测, 当然如果你不嫌弃这个效果丑, 也可以用作进度条。哈哈。

下面说点干货分析下这个效果怎么实现:

拿到这个效果首先想想主要有哪些技术难点:

1.进度条

2.中间的指针怎么弄

.

.

.

.

1.进度条

有人说进度条还不容易吗? 就这样写:

mPaint.setPathEffect(newDashPathEffect(newfloat[]{dashWith, dashSpace}, 。。。));

canvas.drawArc(mRectF,135,270, false,mPaint);

mPaint.setColor(Color.WHITE);canvas.drawArc(mRectF,135, degree, false, mPaint);


设置个PathEffect

然后画个圆弧,给画笔设置颜色然后根据进度,算出角度, 然后再画出一个圆弧,覆盖第一个圆弧的部分不就行了。废话这么多。

不过我想说的too young too simple. 当时我也是这样想的,于是就实现吧! 做好了先画个50% (也就是第二个圆弧覆盖第一个圆弧的一半)试试,不错啊perfect看来是这样的, 再来个30%试试尼玛不对啊, 怎么小格子没有重合,有点错位啊。MDZZ

后来想了一个简单点的办法,不覆盖,画两个圆弧, 但是这两个圆弧是对接起来的。 比如第一个圆弧,画一半,第二个画一半。

//draw background arc

canvas.drawArc(mRectF,135+ degree,270- degree,false, mPaint);

//draw progress arc

canvas.drawArc(mRectF,135, degree,false, mProgressPaint);

2.中间的指针怎么弄

先画出指针的路径

mPointerPath = new Path();

mPointerPath.moveTo(centerX + pointRadius, centerY -7);

mPointerPath.lineTo(centerX + pointRadius, centerY +7);

mPointerPath.lineTo(mRectF.right- pointGap - lineWidth /2,centerY);

mPointerPath.lineTo(centerX + pointRadius, centerY -7);

mPointerPath.close();

在中心draw一个小圆

然后draw指针,这样当画布旋转时指针自然也就旋转了,不懂得要去看看canvas.save(), canvas.restore()的作用

//draw pointer

canvas.drawCircle(centerX, centerY, pointRadius,mInnerCirclePaint);

canvas.save();

canvas.rotate(135+ degree, centerX, centerY);

canvas.drawPath(mPointerPath, mPointerPaint);

canvas.restore();


github地址:https://github.com/niniloveyou/GradeProgressView

欢迎前去点个赞(star)

你可能感兴趣的:(模仿小米的进度控件)