前言
最近接到一个需求,第一眼看到ui交互效果时,瞬间想对产品小哥说“尼玛,这么会玩,你咋不上天”。确认了具体交互细节,喝了两口农夫三拳,开始了两耳不闻窗外事,一心只想撸代码的过程。
先上ui效果
说明:
- 外圈弧形上面是进度的标记点,默认在12点位置,也是progress 0
- 在圆环范围内,可以任意拖拽进度的标记点,当拖拽结束松手的时候,会自动吸附在外圈弧形对应的progress位置
- 如果进度标记点拖拽的坐标位置在圆环以外,那么标记点的位置自动限制在外圈弧形上面
下面是整个自定义view的代码:
public class RoundProgressView extends View {
/**context*/
private Context mContext;
/**整个view的宽度*/
private int mViewWidth;
/**整个view的高度*/
private int mViewHeight;
/**整个view的中心X坐标*/
private float mCenterX;
/**整个view的中心y坐标*/
private float mCenterY;
/**圆环距离view的间距*/
private float mOuterMargin;
/**外层弧线画布*/
private RectF mDashRect = new RectF();
/**外层弧线的画笔*/
private Paint mDashPaint;
/**外层圆的画笔*/
private Paint mOuterPaint;
/**外层圆半径*/
private float mOuterRadius;
/**内层圆的画笔*/
private Paint mInnerPaint;
/**内层圆半径*/
private float mInnerRadius;
/**中心点画布*/
private RectF mCenterRect = new RectF();
/**中心点的画笔*/
private Paint mCenterPaint;
/**中心点背景图*/
private Bitmap mCenterBitmap;
/**进度标记icon的半径*/
private static final int PROGRESS_RADIUS = 15;
/**进度标记画布*/
private RectF mProgressRect = new RectF();
/**进度标记画笔*/
private Paint mProgressPaint;
/**进度标记*/
private Bitmap mProgressBitmap;
/**进度标记的半径*/
private int mProgressRadius;
/**进度条最大值*/
private static final int MAX_PROGRESS = 100;
/**当前的百分值*/
private int mProgress;
/**进度条标志移动后的角度, 0 ~ 360*/
private int mAngle = 0;
/**进度标记开始位置的x坐标*/
private float mProgressPointX;
/**进度标记开始位置的y坐标*/
private float mProgressPointY;