Виджет панели поиска Android: нет вертикальной ориентации? - PullRequest
3 голосов
/ 24 марта 2010

Не могу поверить, что нет способа изменить ориентацию виджета SeekBar. Я просматривал свойства этого виджета и не могу найти ничего, что позволило бы мне изменить его ориентацию на вертикальную.

Итак, я что-то упускаю из виду? Нужно ли писать собственную реализацию панели поиска, чтобы ее большой палец скользил вверх / вниз вместо левого / правого?

1 Ответ

1 голос
/ 18 апреля 2016

Есть два способа достичь цели

1- Uing xml Для API больше, чем API 11

<com.yourPackge.VerticalSeekBar
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_gravity="bottom"
             android:id="@+id/verticalseekbar"            
            android:max="10"
            android:rotation="270" 
           />

2 - создание настраиваемой вертикальной панели поиска

public class VerticalSeekBar extends SeekBar {
    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);}

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

    protected void onDraw(Canvas c) {
        c.rotate(-90);
        c.translate(-getHeight(), 0);
        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:
                setProgress(getMax() - (int) (getMax() * event.getY() /getHeight()));
                onSizeChanged(getWidth(), getHeight(), 0, 0);
                break;
            case MotionEvent.ACTION_CANCEL:
               break;
        }
        return true;
    }

    public BitmapDrawable writeOnDrawable(int drawableId, String text){

        Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId).copy(Bitmap.Config.ARGB_8888, true);
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.BLACK);
        paint.setTextSize(20);
        Canvas canvas = new Canvas(bm);
        canvas.drawText(text, 0, bm.getHeight()/2, paint);

        return new BitmapDrawable(bm);
    }}

, если вы хотите создать пользовательский индикатор и большой палец
В вашей деятельности, где вы хотите добавить seekbar

 <SeekBar
    android:progressDrawable="@drawable/progress"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:max="10"
    android:id="@+id/seekBar4"
    android:thumb="@drawable/tumb_shape"/>

tump_shap.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <gradient
        android:angle="270"
        android:endColor="#00ACE7"
        android:startColor="#0086B3" />

    <size
        android:height="20dp"
        android:width="20dp" />

</shape>

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:drawable="@drawable/background_fill"/>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/progress_fill" />
    </item>

</layer-list>
...