android自定义支持横竖方向切换seekbar控件

先上运行效果截图
这是运行的样式

下面贴上java代码

public class RodSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener {         private final String TAG="RodSeekBar";    private final String VERTICAL = "vertical";    private final String HORIZONTAL = "horizontal";    private final String TOP = "top";    private final String BOTTOM = "bottom";    private String direction = HORIZONTAL;    private String verticalDirection = BOTTOM;    private int progressDisabledColor;    private int progressForeColor;    private int progressBackColor;    private int thumbEnableColor;    private int thumbDisableColor;    private OnSeekBarChangeListener mOnSeekBarChangeListener;    public RodSeekBar(Context context) {             super(context);    }    public RodSeekBar(Context context, AttributeSet attrs) {             super(context, attrs);        initData(attrs);    }    public RodSeekBar(Context context, AttributeSet attrs, int defStyle) {             super(context, attrs, defStyle);        initData(attrs);    }    private void initData( AttributeSet attrs) {             TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.RodSeekBar);        if (typedArray != null) {                 progressDisabledColor = typedArray.getColor(R.styleable.RodSeekBar_progress_disable_color, Color.parseColor("#ffffff"));            progressBackColor = typedArray.getColor(R.styleable.RodSeekBar_progress_background_color, Color.parseColor("#232939"));            thumbEnableColor = typedArray.getColor(R.styleable.RodSeekBar_thumb_enable_color, Color.parseColor("#ffffff"));            thumbDisableColor = typedArray.getColor(R.styleable.RodSeekBar_thumb_disable_color, Color.parseColor("#ffffff"));            verticalDirection = typedArray.getString(R.styleable.RodSeekBar_rod_progress_vertical_direction);            direction = typedArray.getString(R.styleable.RodSeekBar_rod_progress_direction);            progressForeColor = typedArray.getColor(R.styleable.RodSeekBar_progress_enable_color, Color.parseColor("#00aa00"));            if (!VERTICAL.equals(direction) && !HORIZONTAL.equals(direction)) {                     direction = HORIZONTAL;            }            if (!TOP.equals(verticalDirection) && !BOTTOM.equals(verticalDirection)) {                     verticalDirection = BOTTOM;            }            typedArray.recycle();        }        Logger.d(TAG,""+direction);        setProgressDrawable(null);        setThumb(drawThumb(isEnabled()));        setThumbOffset(0);        setPadding(0, getPaddingTop(), 0, getBottom());        setSplitTrack(false);        super.setOnSeekBarChangeListener(this);    }    /**     * thumb的drawable     *     * @param isEnable     * @return     */    private Drawable drawThumb(final boolean isEnable) {             //画thumb        return new Drawable() {                 @Override            public void draw(Canvas canvas) {                     int height = RodSeekBar.this.getHeight();                int width = RodSeekBar.this.getWidth();                int max = RodSeekBar.this.getMax();                int progress = RodSeekBar.this.getProgress();                Paint paint = new Paint();                //是否可用颜色                if (isEnable) {                         paint.setColor(thumbEnableColor);                } else {                         paint.setColor(thumbDisableColor);                }                paint.setAntiAlias(true);                //根据方向绘制                if (HORIZONTAL.equals(direction)) {                         float radius = (float) (height / 2.0);                    float offset = (float) ((width - height) * 1.0 / max);                    float x = progress * offset + radius;                    canvas.drawCircle(x, radius, radius, paint);                } else {                         float radius = (float) (width / 2.0);                    float offset = (float) ((height - width) * 1.0 / max);                    float y = progress * offset + radius;                    //根据垂直方向绘制,从上开始、从下开始                    if (TOP.equals(verticalDirection)) {                             canvas.drawCircle(y, -radius, radius, paint);                    } else {                             canvas.drawCircle(height - y, -radius, radius, paint);                    }                }            }            @Override            public void setAlpha(int alpha) {                 }            @Override            public void setColorFilter(ColorFilter colorFilter) {                 }            @Override            public int getOpacity() {                     return PixelFormat.UNKNOWN;            }        };    }    @SuppressLint("DrawAllocation")    @Override    protected void onDraw(Canvas canvas) {             int width = getWidth();        int height = getHeight();        int max = getMax();        int progress = getProgress();        Paint paint = new Paint();        paint.setColor(progressBackColor);        paint.setAntiAlias(true);        RectF rect = new RectF(0, 0, width, height);        //根据方向绘制        if (HORIZONTAL.equals(direction)) {                 //画背景色            canvas.drawRoundRect(rect, height, height, paint);            //画前景色            if (isEnabled()) {                     paint.setColor(progressForeColor);            } else {                     paint.setColor(progressDisabledColor);            }            float offset = (float) ((width - height) * 1.0 / max * progress + height);            rect = new RectF(0, 0, offset, height);            canvas.drawRoundRect(rect, height, height, paint);        } else {                 //画背景色            canvas.drawRoundRect(rect, width, width, paint);            //画前景色            if (isEnabled()) {                     paint.setColor(progressForeColor);            } else {                     paint.setColor(progressDisabledColor);            }            float offset = (float) ((height - width) * 1.0 / max * progress + width);            //根据垂直方向绘制,从上开始、从下开始            if (TOP.equals(verticalDirection)) {                     rect = new RectF(0, 0 , width, offset);            } else {                     rect = new RectF(0, height, width, height - offset);            }            canvas.drawRoundRect(rect, width, width, paint);            canvas.rotate(90);        }        super.onDraw(canvas);    }    @SuppressLint("ClickableViewAccessibility")    @Override    public boolean onTouchEvent(MotionEvent event) {             if (!isEnabled()) {                 return false;        }        if (VERTICAL.equals(direction)) {                 switch (event.getAction()) {                     case MotionEvent.ACTION_DOWN:                case MotionEvent.ACTION_MOVE:                case MotionEvent.ACTION_UP:                    //根据垂直方向响应,从上开始、从下开始                    if (TOP.equals(verticalDirection)) {                             setProgress((int) (getMax() * event.getY() / getHeight()));                    } else {                             setProgress((int) ((int) getMax() - (getMax() * event.getY() / getHeight())));                    }                    break;                default:                    return super.onTouchEvent(event);            }        } else {                 return super.onTouchEvent(event);        }        return true;    }    @Override    protected void onAttachedToWindow() {             super.onAttachedToWindow();    }    @Override    protected void onDetachedFromWindow() {             super.onDetachedFromWindow();    }    @Override    public void setEnabled(boolean enable) {             super.setEnabled(enable);        setThumb(drawThumb(enable));        invalidate();    }    @Override    public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {             mOnSeekBarChangeListener = l;    }    @Override    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {             if (mOnSeekBarChangeListener != null) {                 mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser);        }    }    @Override    public void onStartTrackingTouch(SeekBar seekBar) {             if (mOnSeekBarChangeListener != null) {                 mOnSeekBarChangeListener.onStartTrackingTouch(seekBar);        }    }    @Override    public void onStopTrackingTouch(SeekBar seekBar) {             if (mOnSeekBarChangeListener != null) {                 mOnSeekBarChangeListener.onStopTrackingTouch(seekBar);        }    }    public int getProgressDisabledColor() {             return progressDisabledColor;    }    public void setProgressDisabledColor(int progressDisabledColor) {             this.progressDisabledColor = progressDisabledColor;        invalidate();    }    public int getProgressForeColor() {             return progressForeColor;    }    public void setProgressForeColor(int progressForeColor) {             this.progressForeColor = progressForeColor;        invalidate();    }    public int getProgressBackColor() {             return progressBackColor;    }    public void setProgressBackColor(int progressBackColor) {             this.progressBackColor = progressBackColor;        invalidate();    }    public int getThumbEnableColor() {             return thumbEnableColor;    }    public void setThumbEnableColor(int thumbEnableColor) {             this.thumbEnableColor = thumbEnableColor;        invalidate();    }    public int getThumbDisableColor() {             return thumbDisableColor;    }    public void setThumbDisableColor(int thumbDisableColor) {             this.thumbDisableColor = thumbDisableColor;        invalidate();    }}

然后是attrs.xml文件内容

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="RodSeekBar">        <attr name="progress_enable_color" format="color" />        <attr name="progress_disable_color" format="color" />        <attr name="progress_background_color" format="color"/>        <attr name="thumb_enable_color" format="color" />        <attr name="thumb_disable_color" format="color" />        <attr name="rod_progress_direction" format="string"/>        <attr name="rod_progress_vertical_direction" format="string"/>    </declare-styleable></resources>

使用方法
app:rod_progress_direction=“horizontal” 横向
app:rod_progress_direction=“vertical” 竖向
app:rod_progress_vertical_direction="top"竖向时thumb开始的方向top、bottom
app:progress_enable_color 进度条可用颜色
app:progress_disable_color 进度条不可用颜色
app:progress_background_color 背景色
app:thumb_enable_color 小圆点可用颜色
app:thumb_disable_color 小圆点不可用颜色

更多相关文章

  1. Android水平进度条颜色和样式
  2. PC&移动平台设备检测库(平台、版本、操作系统、方向)
  3. android中实现背景图片颜色渐变方法
  4. Android常用颜色大全
  5. Android常用布局颜色值大全
  6. android 常用颜色表
  7. android设置toolbar的menu itemTextView颜色 set toolbar menu i
  8. Android ListView拖动时背景颜色会变成黑色 的解决办法
  9. android 颜色搭配表

随机推荐

  1. Android的OutOfMemory解决
  2. 探讨NDK编译错误ld.exe: Dwarf Error: ma
  3. JAVA代码执行shell命令 并解析
  4. Android2.3编译
  5. Mac下编译FFMPEG for Android
  6. Android(安卓)中TransitionDrawable的使
  7. 编译Android(安卓)9.0内核源码并刷入手机
  8. Android(安卓)OpenGL ES(四):关于EGL
  9. android shape渐变详解
  10. 浅谈Android系统的基本体系结构与内存管