andriod开发自定义View实现系统亮度调节控件

1. 效果图如下所示:

image

方向是垂直方向上下可以滑动的 ,当然你也可以调整为水平方向左右滑动

2. 直接上代码,如下:

public class BrightnessBar extends View {

    private float mProgress = 80;
    private float mCornerRadius = 20;

    private final RectF mBackgroudRect = new RectF();
    private final Paint mBackgroundPaint = new Paint();

    private final RectF mProgressRect = new RectF();
    private final Paint mProgressPaint = new Paint();


    public BrightnessBar(Context context) {
        this(context, null);
    }

    public BrightnessBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context) {
        mBackgroundPaint.setColor(Color.parseColor("#252D2D"));
        mBackgroundPaint.setStyle(Paint.Style.FILL);
        mProgressPaint.setColor(Color.GRAY);
        mProgressPaint.setStyle(Paint.Style.FILL);
        mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mBackgroudRect.set(getPaddingLeft(), getPaddingTop(), w - getPaddingRight(), h - getPaddingBottom());
        updateProgressRect();
    }

    private void updateProgressRect() {
        float total = mBackgroudRect.bottom - mBackgroudRect.top;
        mProgressRect.set(mBackgroudRect.left, mBackgroudRect.top + total * (100 - mProgress) / 100, mBackgroudRect.right, mBackgroudRect.bottom);
        mCornerRadius = (mBackgroudRect.right - mBackgroudRect.left) / 2;
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        path.reset();
        path.addRoundRect(mBackgroudRect, mCornerRadius, mCornerRadius, Path.Direction.CCW);
        canvas.clipPath(path);
        canvas.drawRect(mBackgroudRect, mBackgroundPaint);

        path.reset();
        path.addRoundRect(mProgressRect, mCornerRadius, mCornerRadius, Path.Direction.CCW);
        canvas.clipPath(path);
        canvas.drawRect(mProgressRect, mProgressPaint);
    }

    // 设置进度
    public void setProgress(float progress) {
        setProgressInternal(progress, false);
    }

    private void setProgressInternal(float progress, boolean fromUser) {
        if (progress < 0) progress = 0;
        if (progress > 100) progress = 100;
        this.mProgress = progress;
        updateProgressRect();
        invalidate(); // 重新绘制
        if (mOnProgressChangeListener != null) {
            mOnProgressChangeListener.onProgressChanged(this, (int) progress, fromUser);
        }
    }

    public float getProgress() {
        return mProgress;
    }

    private final Path path = new Path();
    boolean mIsUserSeekable = true;
    private float mTouchDownX;
    private boolean mIsDragging;
    private int mScaledTouchSlop;

    public boolean inScrollingContainer() {
        ViewParent p = getParent();
        while (p != null && p instanceof ViewGroup) {
            if (((ViewGroup) p).shouldDelayChildPressedState()) {
                return true;
            }
            p = p.getParent();
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!mIsUserSeekable || !isEnabled()) {
            return false;
        }

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (inScrollingContainer()) {
                    mTouchDownX = event.getX();
                } else {
                    startDrag(event);
                }
                break;

            case MotionEvent.ACTION_MOVE:
                if (mIsDragging) {
                    trackTouchEvent(event);
                } else {
                    final float x = event.getX();
                    if (Math.abs(x - mTouchDownX) > mScaledTouchSlop) {
                        startDrag(event);
                    }
                }
                break;

            case MotionEvent.ACTION_UP:
                if (mIsDragging) {
                    trackTouchEvent(event);
                    onStopTrackingTouch();
                    setPressed(false);
                } else {
                    onStartTrackingTouch();
                    trackTouchEvent(event);
                    onStopTrackingTouch();
                }
                invalidate();
                break;

            case MotionEvent.ACTION_CANCEL:
                if (mIsDragging) {
                    onStopTrackingTouch();
                    setPressed(false);
                }
                invalidate(); 
                break;
        }
        return true;
    }

    private void startDrag(MotionEvent event) {
        setPressed(true);
        onStartTrackingTouch();
        trackTouchEvent(event);
        attemptClaimDrag();
    }

    void onStartTrackingTouch() {
        mIsDragging = true;
        if (mOnProgressChangeListener != null) {
            mOnProgressChangeListener.onStartTrackingTouch(this);
        }
    }

    void onStopTrackingTouch() {
        mIsDragging = false;
        if (mOnProgressChangeListener != null) {
            mOnProgressChangeListener.onStopTrackingTouch(this);
        }
    }

    private void attemptClaimDrag() {
        ViewParent mParent = getParent();
        if (mParent != null) {
            mParent.requestDisallowInterceptTouchEvent(true);
        }
    }

    private void trackTouchEvent(MotionEvent event) {
        final int y = Math.round(event.getY());
        final int height = getHeight();
        final int availableHeight = height - getPaddingTop() - getPaddingBottom();

        final float scale;
        float progress = 0.0f;
        if (y < getPaddingTop()) {
            scale = 0.0f;
        } else if (y > height - getPaddingTop()) {
            scale = 1.0f;
        } else {
            scale = (y - getPaddingTop()) / (float) availableHeight;
            progress = 0.0f;
        }
        final int range = 100;//进度条的范围100-0
        progress += scale * range;
        setProgressInternal(range - progress, true);
    }

    private OnProgressChangeListener mOnProgressChangeListener;

    public void setOnProgressChangeListener(OnProgressChangeListener listener) {
        mOnProgressChangeListener = listener;
    }

    public interface OnProgressChangeListener {

        void onProgressChanged(BrightnessBar brightnessBar, int progress, boolean fromUser);

        void onStartTrackingTouch(BrightnessBar brightnessBar);

        void onStopTrackingTouch(BrightnessBar brightnessBar);
    }
}
posted @ 2025-09-26 16:49  yongfengnice  阅读(4)  评论(0)    收藏  举报