package 你的包名;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;public class VerticalSeekBar extends View {private Paint paint;private float progressHeight;private float progress = 0;private float maxProgress = 100;private int trackColor = Color.WHITE; // 背景颜色private int progressColor = Color.parseColor("#FF0365FF"); // 进度条颜色private float cornerRadius = 20; // 圆角半径private OnProgressChangedListener progressChangedListener; // 回调接口public VerticalSeekBar(Context context) {this(context, null);}public VerticalSeekBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public VerticalSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.FILL);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);float width = getWidth();float height = getHeight();// 画背景条:圆角矩形paint.setColor(trackColor);RectF backgroundRect = new RectF(0, 0, width, height);canvas.drawRoundRect(backgroundRect, cornerRadius, cornerRadius, paint);// 画进度条:圆角矩形paint.setColor(progressColor);float progressTop = height - progressHeight;RectF progressRect = new RectF(0, progressTop, width, height);canvas.drawRoundRect(progressRect, cornerRadius, cornerRadius, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:// 计算进度float height = getHeight();progressHeight = height - y;if (progressHeight < 0) progressHeight = 0;if (progressHeight > height) progressHeight = height;progress = (maxProgress * progressHeight) / height;invalidate(); // 重绘视图// 调用回调方法,传递进度变化if (progressChangedListener != null) {progressChangedListener.onProgressChanged(progress);}return true;}return super.onTouchEvent(event);}// 获取当前的进度public float getProgress() {return progress;}// 设置进度public void setProgress(float progress) {this.progress = progress;invalidate();}// 设置最大进度public void setMaxProgress(float maxProgress) {this.maxProgress = maxProgress;}// 设置颜色public void setTrackColor(int color) {this.trackColor = color;}public void setProgressColor(int color) {this.progressColor = color;}// 设置圆角半径public void setCornerRadius(float radius) {this.cornerRadius = radius;}// 设置回调接口public void setOnProgressChangedListener(OnProgressChangedListener listener) {this.progressChangedListener = listener;}// 定义回调接口public interface OnProgressChangedListener {void onProgressChanged(float progress);}
}
在activity中:
<路径.VerticalSeekBarandroid:id="@+id/seekBar"android:layout_width="match_parent"android:layout_height="match_parent"/>
在代码中
binding.seekBar.apply {setMaxProgress(100f)progress = 50fsetOnProgressChangedListener {}}