安卓 垂直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.MotionEvent;

import androidx.appcompat.widget.AppCompatSeekBar;

/** * @author zhangwei on 2019/12/11. */public class VerticalSeekBar extends AppCompatSeekBar {

    private Drawable mThumb;    private OnSeekBarChangeListener mOnSeekBarChangeListener;

    public VerticalSeekBar(Context context) {        super(context);    }

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

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

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

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

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

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

        super.onDraw(c);    }

    @Override    public synchronized void setProgress(int progress) {        super.setProgress(progress);        onProgressRefresh(getProgress() / (float) getMax(), true);    }

    @Override    public void setProgress(int progress, boolean animate) {        super.setProgress(progress, animate);        onProgressRefresh(getProgress() / (float) getMax(), true);    }

    public 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();

        int thumbPos = (int) (scale * available + 0.5f);

        // int topBound = getWidth() / 2 - thumbHeight / 2 - getPaddingTop();        // int bottomBound = getWidth() / 2 + thumbHeight / 2 - getPaddingTop();        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    public void setThumb(Drawable thumb) {        mThumb = thumb;        super.setThumb(thumb);    }

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

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

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

    @Override    public boolean onTouchEvent(MotionEvent event) {        if (!isEnabled()) {            return false;        }        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                setPressed(true);                onStartTrackingTouch();                if (!getThumb().getBounds().contains(getHeight() - (int) event.getY(), (int) event.getX())) {                    setProgress(getMax() - (int) (getMax() * event.getY() / getHeight()));                }                break;

            case MotionEvent.ACTION_MOVE:                attemptClaimDrag();                if (!getThumb().getBounds().contains(getHeight() - (int) event.getY(), (int) event.getX())) {                    setProgress(getMax() - (int) (getMax() * event.getY() / getHeight()));                }                break;            case MotionEvent.ACTION_UP:            case MotionEvent.ACTION_CANCEL:                onStopTrackingTouch();                setPressed(false);                break;            default:        }        return true;    }}

自定义progress.xml进度条颜色添加阴影效果

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@android:id/background"
        android:gravity="center_vertical|fill_horizontal">
        <layer-list>
            <item>
                <shape>
                    <corners android:radius="5dp" />
                    <gradient
                        android:centerColor="#3d4C9DE6"
                        android:endColor="#1f000000"
                        android:startColor="#1f000000" />
                </shape>
            </item>
            <item
                android:bottom="1dp"
                android:left="1dp">
                <shape>
                    <corners android:radius="5dp" />
                    <size android:height="10dp" />
                    <gradient
                        android:centerColor="#ffC6D9E6"
                        android:endColor="#ffCCDDE7"
                        android:startColor="#FFE0F3FF" />
                </shape>
            </item>
        </layer-list>

    </item>

    <item
        android:id="@android:id/progress"
        android:gravity="center_vertical|fill_horizontal">
        <clip>
            <layer-list>
                <item>
                    <shape>
                        <corners android:radius="5dp" />
                        <gradient
                            android:endColor="#1f000000"
                            android:startColor="#1f000000" />
                    </shape>
                </item>
                <item
                    android:bottom="1dp"
                    android:left="1dp">
                    <shape>
                        <size android:height="10dp" />
                        <corners android:radius="5dp" />
                        <gradient
                            android:centerColor="#FF589EFF"
                            android:endColor="#FF589EFF"
                            android:startColor="#FF589EFF" />
                    </shape>
                </item>
            </layer-list>
        </clip>
    </item>

</layer-list>

布局中使用

    <com.boe.mhealth.myview.seekbar.VerticalSeekBar
        android:id="@+id/massager_home_power_seekBar"
        android:layout_width="wrap_content"
        android:layout_height="281dp"
        android:duplicateParentState="true"
        android:max="15"
        android:paddingStart="10dp"
        android:paddingEnd="12dp"
        android:progressDrawable="@drawable/progress_bg"
        android:splitTrack="false"
        android:thumb="@mipmap/icon_thumb"
        app:layout_constraintEnd_toEndOf="@id/massager_home_power_value"
        app:layout_constraintStart_toStartOf="@id/massager_home_power_value"
        app:layout_constraintTop_toBottomOf="@id/massager_home_power_value" />

原文地址:https://www.cnblogs.com/blogzhangwei/p/12106049.html

时间: 2024-11-25 12:55:14

安卓 垂直SeekBar的相关文章

android 打造变化多端的SeekBar(垂直和水平)

SeekBar相信用的人不是很多,一般都是用水平SeekBar就可以了.但是之前项目中考虑使用垂直的SeekBar,就要继承重写SeekBar才能用.而垂直SeekBar在百度搜了一下,关于这方面文章还是很少,有一些还是不全面.我又去了github找了一下,找到了一个垂直的效果以及源码,我就写了一个滚动SeekBar翻页listview的数据效果.所以这篇博客中源码下载中,有三个项目源码,干货多多. 下载地址:http://download.csdn.net/detail/qq_16064871

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

2016年最牛逼的分类Android项目源码免费一次性打包下载!

之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年开始不断整理源码区和其他网站上的安卓例子源码,目前总共有810套左右,根据实现的功能被我分成了100多个类,总共接近2.5G,还在不断更新.初学者可以快速方便的找到自己想要的例子,大神也可以看一下别人的方法实现.虽然的例子都是我一个人辛辛苦苦花了很多时间和精力整理的,但是既然这些例子是来自于社区那就让他们免费回归社区吧,(是的!特么的不要一分钱!最看不起那些挂羊头卖狗的)你可以在本帖里面按Ctrl+F查找你需要的关键字,

转--2014年最新810多套android源码2.46GB免费一次性打包下载

转载自:http://www.eoeandroid.com/thread-497046-1-1.html 感谢该博客主人无私奉献~~ 下面的源码是从今年3月份开始不断整理源码区和其他网站上的安卓例子源码,目前总共有810套左右,根据实现的功能被博主分成了100多个类,总共接近2.5G,还在不断更新.初学者可以快速方便的找到自己想要的例子,大神也可以看一下别人的方法实现.虽然的例子都是博主一个人辛辛苦苦花了很多时间和精力整理的,但是既然这些例子是来自于社区那就让他们免费回归社区吧,(是的!特么的不

ym——android源代码大放送(实战开发必备)

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 目录 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载很多其它源代码.url │  文件夹列表.txt │ ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobil

ym——android源码大放送(实战开发必备)

文件夹 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载更多源码.url │  目录列表.txt │ ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobileDemo1_1-master.zip │      Location1014.rar │ ├─anko │      

2014年最新720多套Android源码2.0GB免费一次性打包下载

之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年3月份开始不断整理源码区和其他网站上的android源码,目前总共有720套左右,根据实现的功能被我分成了100多个类,总共2G多,还在不断更新安卓源码.初学者可以快速方便的找到自己想要的例子,大神也可以看一下别人的方法实现.虽然的例子都是我一个人辛辛苦苦花了很多时间和精力整理的,但是既然这些例子是来自于社区那就让他们免费回归社区吧,(是的!特么的不要一分钱!最看不起那些挂羊头卖狗的)你可以在本帖里面按Ctrl+F查找你

垂直的SeekBar:VerticalSeekBar

这是我找到的一个比较好用的垂直的SeekBar代码: [java] view plaincopy在CODE上查看代码片派生到我的代码片 public class VerticalSeekBar extends AbsSeekBar { private Drawable mThumb; public interface OnSeekBarChangeListener { void onProgressChanged(VerticalSeekBar VerticalSeekBar, int prog

[安卓] 5、SeekBar拖动条

越来越发现这些控件用法大同小异了,这里注意几个函数:seekBar.setSecondaryProgress(0);设置初始进度为0,总共为0~99,对其监听用setOnSeekBarChangeListener. 1 public class MainActivity extends Activity { 2 private SeekBar seekBar; 3 private TextView tv; 4 5 @Override 6 public void onCreate(Bundle s