帮我写一个圆环形的seekbar
时间: 2023-07-16 17:15:14 浏览: 51
好的,以下是一个简单的圆环形的SeekBar的代码实现:
```
public class CircleSeekBar extends View {
private Paint mProgressPaint;
private Paint mBackgroundPaint;
private Paint mThumbPaint;
private RectF mRectF;
private float mProgress = 0;
private float mStrokeWidth = 20;
private float mRadius = 100;
private float mThumbRadius = 30;
private OnSeekBarChangeListener mListener;
public CircleSeekBar(Context context) {
super(context);
init();
}
public CircleSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mProgressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mProgressPaint.setStyle(Paint.Style.STROKE);
mProgressPaint.setStrokeWidth(mStrokeWidth);
mProgressPaint.setColor(Color.BLUE);
mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBackgroundPaint.setStyle(Paint.Style.STROKE);
mBackgroundPaint.setStrokeWidth(mStrokeWidth);
mBackgroundPaint.setColor(Color.GRAY);
mThumbPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mThumbPaint.setStyle(Paint.Style.FILL);
mThumbPaint.setColor(Color.BLUE);
mRectF = new RectF();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = (int) (mRadius * 2 + mStrokeWidth * 2 + mThumbRadius * 2);
int height = (int) (mRadius * 2 + mStrokeWidth * 2 + mThumbRadius * 2);
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float progressAngle = mProgress / 100 * 360;
canvas.drawArc(mRectF, -90, 360, false, mBackgroundPaint);
canvas.drawArc(mRectF, -90, progressAngle, false, mProgressPaint);
float thumbAngle = progressAngle - 90;
float thumbX = (float) (getWidth() / 2 + Math.cos(Math.toRadians(thumbAngle)) * (mRadius + mThumbRadius));
float thumbY = (float) (getHeight() / 2 + Math.sin(Math.toRadians(thumbAngle)) * (mRadius + mThumbRadius));
canvas.drawCircle(thumbX, thumbY, mThumbRadius, mThumbPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
float dx = x - getWidth() / 2;
float dy = y - getHeight() / 2;
float angle = (float) Math.toDegrees(Math.atan2(dy, dx));
if (angle < 0) {
angle += 360;
}
float progress = angle / 360 * 100;
setProgress(progress);
break;
case MotionEvent.ACTION_UP:
if (mListener != null) {
mListener.onStopTrackingTouch(this);
}
break;
}
return true;
}
public void setProgress(float progress) {
if (progress < 0) {
progress = 0;
} else if (progress > 100) {
progress = 100;
}
if (progress != mProgress) {
mProgress = progress;
invalidate();
if (mListener != null) {
mListener.onProgressChanged(this, progress);
}
}
}
public void setOnSeekBarChangeListener(OnSeekBarChangeListener listener) {
mListener = listener;
}
public interface OnSeekBarChangeListener {
void onProgressChanged(CircleSeekBar seekBar, float progress);
void onStopTrackingTouch(CircleSeekBar seekBar);
}
}
```
使用方法:
```
CircleSeekBar seekbar = findViewById(R.id.seekbar);
seekbar.setProgress(50); // 设置进度为50%
seekbar.setOnSeekBarChangeListener(new CircleSeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(CircleSeekBar seekBar, float progress) {
// 进度改变时的回调
}
@Override
public void onStopTrackingTouch(CircleSeekBar seekBar) {
// 停止拖动时的回调
}
});
```
这个SeekBar可以在XML文件中使用,例如:
```
<com.example.yourpackage.CircleSeekBar
android:id="@+id/seekbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
```