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 {}}