竖直seekbar

响应点击事件中三个函数的竖直seekbar

public class VerticalSeekBar extends AbsSeekBar {
private Drawable mThumb;

public interface OnSeekBarChangeListener {
    void onProgressChanged(VerticalSeekBar VerticalSeekBar, int progress, boolean fromUser);
    void onStartTrackingTouch(VerticalSeekBar VerticalSeekBar);
    void onStopTrackingTouch(VerticalSeekBar VerticalSeekBar);
}

private OnSeekBarChangeListener mOnSeekBarChangeListener;

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

public VerticalSeekBar(Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.seekBarStyle);
}

public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
    mOnSeekBarChangeListener = l;
}

void onStartTrackingTouch() {
    if (mOnSeekBarChangeListener != null) {
        mOnSeekBarChangeListener.onStartTrackingTouch(this);
    }
}

void onStopTrackingTouch() {
    if (mOnSeekBarChangeListener != null) {
        mOnSeekBarChangeListener.onStopTrackingTouch(this);
    }
}

void onProgressRefresh(float scale, boolean fromUser) {
    Drawable thumb = mThumb;
    if (thumb != null) {
        setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE);
        invalidate();
    }
    if (mOnSeekBarChangeListener != null) {
        mOnSeekBarChangeListener.onProgressChanged(this, getProgress(),
                isPressed());
    }
}

private void setThumbPos(int w, Drawable thumb, float scale, int gap) {
    int available = w - getPaddingLeft() - getPaddingRight();
    int thumbWidth = thumb.getIntrinsicWidth();
    int thumbHeight = thumb.getIntrinsicHeight();
    available -= thumbWidth;

    available += getThumbOffset() * 2;

    int thumbPos = (int) (scale * available);

    int topBound, bottomBound;
    if (gap == Integer.MIN_VALUE) {
        Rect oldBounds = thumb.getBounds();
        topBound = oldBounds.top;
        bottomBound = oldBounds.bottom;
    } else {
        topBound = gap;
        bottomBound = gap + thumbHeight;
    }
    thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);
}

@Override
protected void onDraw(Canvas c) {
    c.rotate(-90);
    c.translate(-getHeight(), 0);
    super.onDraw(c);
}

@Override
protected synchronized void onMeasure(int widthMeasureSpec,
        int heightMeasureSpec) {
    super.onMeasure(heightMeasureSpec, widthMeasureSpec);
    setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}

@Override
public void setThumb(Drawable thumb) {
    mThumb = thumb;
    super.setThumb(thumb);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(h, w, oldw, oldh);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (!isEnabled()) {
        return false;
    }
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            setPressed(true);
            onStartTrackingTouch();
            trackTouchEvent(event);
            break;
        }

        case MotionEvent.ACTION_MOVE: {
            trackTouchEvent(event);
            attemptClaimDrag();
            break;
        }

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

        case MotionEvent.ACTION_CANCEL: {
            onStopTrackingTouch();
            setPressed(false);
            invalidate();
            break;
        }

        default:
            break;
    }
    return true;
}

private void trackTouchEvent(MotionEvent event) {
    final int height = getHeight();
    final int available = height - getPaddingBottom() - getPaddingTop();
    int Y = (int) event.getY();
    float scale;
    float progress = 0;
    if (Y > height - getPaddingBottom()) {
        scale = 0.0f;
    } else if (Y < getPaddingTop()) {
        scale = 1.0f;
    } else {
        scale = (float) (height - getPaddingBottom() - Y)
                / (float) available;
    }
    final int max = getMax();
    progress = scale * max;
    setProgress((int) progress);
}

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值