安卓垂直进度条

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);
    }

    @Override
    protected 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);
    }

    @Override
    public 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中:

<路径.VerticalSeekBar
                android:id="@+id/seekBar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

在代码中

    binding.seekBar.apply {
            setMaxProgress(100f)
            progress = 50f
            setOnProgressChangedListener {
               
            }
        }

你可能感兴趣的:(android)