转载请注明出处,谢谢http://blog.csdn.net/metalseed/article/details/8014758 by---MetalSeed

VerticalSeekBar demo

网上介绍较多,但完整的java代码较少,所以直接上源码咯~

demo:(其中穿插了蓝牙demo,但是VerticalSeekBar的布局设置,及设置监听还是比较清晰的,个人觉得不影响学习性)

http://blog.csdn.net/metalseed/article/details/7988945

VerticalSeekBar.java

package com.example.seed2;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;    }}


更多相关文章

  1. Android(安卓)蓝牙耳机录音以及蓝牙耳机播放
  2. Android的语言设置(一)
  3. Android(安卓)PendingIntent.getBroadcast intent数据不更新问题
  4. Android(安卓)WebView 软键盘遮挡输入框问题的解决方法
  5. android权限列表
  6. clearTaskOnLaunch的使用
  7. Android(安卓)RFCOMM connect() faild 记录(未解决)
  8. Android(安卓)PopupWindow使用详解
  9. android信得过的退出程序设置

随机推荐

  1. Android(安卓)Studio 更换debug.keystore
  2. 双击运行Android模拟器、创建SDcard、AVD
  3. android线程间通信之handler
  4. 【eoeAndroid社区索引】Android二维码知
  5. Android(安卓)Telephony启动过程源码分析
  6. Android大图片裁剪终极解决方案(中:从相册
  7. Django服务器与App(Android)客户端的简单实
  8. Android(安卓)用户界面(User Interface)概
  9. Android解析WindowManagerService(二)WMS的
  10. Android(安卓)Handler Looper