六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 59|回复: 0

竖着的SeekBar(VerticalSeekBar)

[复制链接]

升级  12%

18

主题

18

主题

18

主题

秀才

Rank: 2

积分
68
 楼主| 发表于 2013-1-26 14:28:28 | 显示全部楼层 |阅读模式
竖着的Seekbar:
 

import android.content.Context;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.widget.AbsSeekBar;public class VerticalSeekBar extends AbsSeekBar {    private Drawable mThumb;    private int height;    private int width;    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(), fromUser);        }    }    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;        // The extra space for the thumb to move on the track        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);    }    protected void onDraw(Canvas c)    {            c.rotate(-90);            c.translate(-height,0);            super.onDraw(c);    }    //可以改变进度条的高和宽    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec)    {    width = 28;  height = View.MeasureSpec.getSize(heightMeasureSpec);//width = View.MeasureSpec.getSize(widthMeasureSpec);        this.setMeasuredDimension(width, height);    }@Overridepublic void setThumb(Drawable thumb){        mThumb = thumb;super.setThumb(thumb);}    protected void onSizeChanged(int w, int h, int oldw, int oldh)    {            super.onSizeChanged(h, w, oldw, oldh);    }       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);                break;                            case MotionEvent.ACTION_CANCEL:                onStopTrackingTouch();                setPressed(false);                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);        }    }    public boolean dispatchKeyEvent(KeyEvent event) {    if(event.getAction()==KeyEvent.ACTION_DOWN)    {    KeyEvent newEvent = null;    switch(event.getKeyCode())    {    case KeyEvent.KEYCODE_DPAD_UP:    newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_RIGHT);    break;    case KeyEvent.KEYCODE_DPAD_DOWN:    newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_LEFT);    break;    case KeyEvent.KEYCODE_DPAD_LEFT:    newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_DOWN);    break;    case KeyEvent.KEYCODE_DPAD_RIGHT:    newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_UP);    break;    default:    newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,event.getKeyCode());break;    }    return newEvent.dispatch(this);    }    return false;    }}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表