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);
}