您的位置:首页 > 其它

可以手动拖动的扇形进度条

2017-04-06 16:43 169 查看
最近公司需要做一个扇形可拖动进度条,如图:



在自定义view中有drawArc方法,可以进行画扇形,然后其中startAngle参数为设置起点,所以我们将起点设置到我们想要的角度,我设置到左下角。

sweepAngle为划过的角度,这个根据我们需要设置成我们想要的角度,

canvas.drawArc(this.mArcRectF, minRadian, mSeekBarDegree, false, mSeekbarProgressPaint);

从图中我们可以看到最外层大圈,我们需要画一个背景扇形,划过的一个扇形,和可拖动的Drawable,我们通过计算拖动的Drawable的宽高和当前扇形的弧度得出Drawable的位置。
private void setThumbPosition(double radian) {
if(DEBUG) Log.v(TAG, "setThumbPosition radian = " + radian);

double x = mSeekBarCenterX + mSeekBarRadius * Math.cos(radian);
double y = mSeekBarCenterY + mSeekBarRadius * Math.sin(radian);
// if(DEBUG) Log.v(TAG, "setThumbPosition radian = " + x + "$$$" + y);
mThumbLeft = (float) (x - mThumbWidth / 2);
mThumbTop = (float) (y - mThumbHeight / 2);
}其次就是我们需要在此view上加入手势:
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
seekTo(eventX, eventY, false);
break ;

case MotionEvent.ACTION_MOVE:
seekTo(eventX, eventY, false);
break ;

case MotionEvent.ACTION_UP:
seekTo(eventX, eventY, true);
break ;
}
return true;
}

根据手势中的x,y计算得出我们的弧度,大致思路是这个样子,文末会有demo地址,一定要注意弧度和角度的问题。

demo地址:
https://github.com/HeinzLip/EllipseSeekbar
大家多多star,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息