android seekbar垂直滚动,滑块开始不在开端,滑块大小改变等相关问题

本文详细介绍了如何实现Android SeekBar的垂直滚动效果,并解决滑块大小、起始位置及进度显示的问题。通过继承AppCompatSeekBar并调整onDraw方法实现垂直滚动条。滑块大小不正确可能是因为宽度设置不当或图片未正确旋转。去除背景图可以避免滑块和背景一起增大。使用android:thumbOffset解决进度颜色填充不足,设置android:paddingEnd和android:paddingStart确保滑块始于起点。对于垂直滚动条,需要重写setProgress方法来设置进度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、垂直的滚动条

原理:只需继承AppCompatSeekBar,在onDraw将横向滚动条旋转90度,在平移回来即可,可参照下面代码。

public class VerticalSeekBar extends android.support.v7.widget.AppCompatSeekBar {
    public VerticalSeekBar(Context context) {
        super(context);
    }

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

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

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

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

    @Override
    protected void onDraw(Canvas c) {
        //将SeekBar转转90度
        c.rotate(90);
        //将旋转后的视图移动回来
       // c.translate(-getHeight(),0);
        c.translate(0,-getWidth());
        super.onDraw(c);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (!isEnabled()) {
            return false;
        }

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                int i=0;
                //获取滑动的距离

                i=(int) (getMax() * event.getY() / getHeight());
                //设置进度
                setProgress(i);
                Log.i("Progress",getProgress()+"");
                //每次拖动SeekBar都会调用
                onSizeChanged(getWidth(), getHeight(), 0, 0);
                break;

            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return true;
    }

    @Override
    public synchronized void setProgress(int progress) {
        super.setProgress(progress);
        onSizeChanged(getWidth(), getHeight(), 0, 0);
    }

}

在布局的地方引用即可。如:

<com.yaxon.ebook.reader.view.VerticalSeekBar
    android:id="@+id/vertical_seekbar"
    android:layout_width="50dp"
    android:layout_height="@dimen/dip_181"
    android:layout_marginLeft="@dimen/dip_609"
    android:layout_marginTop="@dimen/dip_73"
    android:max="10000"
    android:thumb="@drawable/thumb"
    android:thumbOffset="0dp"
    android:paddingEnd="0dp"
    android:paddingStart="0dp"
    />

2.滑块相关问题

(1)滑块大小比原来小,达不到原来的尺寸。

a、该情况可能是由于自定义的seekbar种的android:layout_width设置的宽度小于thumb指定的图片,导致显示不全。解决办法:宽度设置比thumb的图片宽度大;同时如果有设置背景图,去除背景图(原因见(2))。

b、滑块切图是竖向图片没有跟着横向旋转(图1),导致滑块高度大于宽度,滑块没有呈现长方形滚动的滑块。图片旋转再加入res即可(图2)。

 

                                     

                             图1                                                                    图2

(2)seekbar宽度设置大时,背景图片和滑块跟着增大,达不到只是调整滑块图片大小。

如果只是想要滑块图片显示达到切图的大小,需要将seekbar的宽度大于thumb(滑块)的图片大小。如果seekbar指定了background,背景图也会跟着增加很大,这样就不符合滚动条宽度的要求,我们只是要增加滑块图片大小和滑块点击的区域,所以需要去除指定的background图片,即可。

(3)滑块滑动,进度显示的颜色离滑块有一定距离,没有填满。

 seekbar布局中 android:thumbOffset="0dp"属性设置这个即可。

(4)滑块初始开始时没有在最开始端。

seekbar布局中 android:paddingEnd="0dp" android:paddingStart="0dp"设置这两个属性即可。

(5)调用setProgress(int progress)失效,滚动条没有变化

垂直的滚动条滑动,用代码设置进度条需要重新改写setProgress(int progress)。如下所示:

@Override
public synchronized void setProgress(int progress) {
    super.setProgress(progress);
    onSizeChanged(getWidth(), getHeight(), 0, 0);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值