Прогресс панели поиска не работает должным образом

Прежде всего, я хотел бы сказать, что я не англичанин, поэтому извините меня за мои языковые ошибки. Ну, у меня есть две перекрывающиеся панели SeekBars, одна (seekbar2) с символом будильника в виде большого пальца, а другая (seekbar) с большим пальцем, который может быть «zzz» или косой чертой. Идея состоит в том, что когда вы перемещаете панель поиска вправо, вторая панель поиска устанавливает косую черту в качестве большого пальца, а альфа большого пальца увеличивается в зависимости от хода панели поиска, и она перекрывается с логотипом будильника на второй панели поиска, так что когда прогресс составляет 100%, конечным результатом является перечеркнутый будильник (символ отключения будильника) и точно такой же, но со значком «zzz» в другом направлении, так что, когда прогресс равен 0, результатом является символ повтора будильника. Ты знаешь, что я имею в виду? Дело в том, что это прекрасно работает в Lollipop (версия sdk 21), а в более старых версиях — нет. В более старых версиях вторая полоса поиска начинается в нужной точке, но она перемещается больше, чем вторая, поэтому конечным результатом является сигнал тревоги и косая черта (или «zzz»), и я не знаю, почему.

Это мой activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:background="#ffffff">

<SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/seekBar2"
    android:progress="50"
    android:thumb="@drawable/ic_thumb"
    android:secondaryProgress="@android:color/transparent"
    android:progressDrawable="@drawable/line"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginBottom="90dp"
    android:paddingRight="35dp"
    android:paddingLeft="35dp"/>

<SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/seekBar"
    android:progress="50"
    android:thumb="@drawable/ic_thumb"
    android:secondaryProgress="@android:color/transparent"
    android:progressDrawable="@drawable/line"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginBottom="90dp"
    android:paddingRight="35dp"
    android:paddingLeft="35dp"/>

This is my MainActivity.java:

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);
    final SeekBar seekBar2 = (SeekBar) findViewById(R.id.seekBar2);
    final Drawable dismiss = getResources().getDrawable(R.drawable.ic_dismiss);
    final Drawable snooze = getResources().getDrawable(R.drawable.ic_thumb_snooze);
    final Drawable alarm = getResources().getDrawable(R.drawable.ic_thumb);
    seekBar2.setMax(255);
    seekBar.setMax(255);
    seekBar.setProgress(seekBar.getMax()/2);
    seekBar2.setProgress(seekBar.getMax()/2);
    seekBar2.setEnabled(false);
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            seekBar2.setProgress(progress);
            if (progress >seekBar.getMax()/2 && fromUser && progress!=seekBar.getMax()){
                seekBar.setThumb(dismiss);
                dismiss.setAlpha((progress - (seekBar.getMax() / 2)) * 2);//*2*255
            }
            else if (progress <seekBar.getMax()/2 && fromUser && progress!=0){
                seekBar.setThumb(snooze);
                snooze.setAlpha(Math.abs((progress - (seekBar.getMax() / 2)) * 2));
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) { }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            Log.e("progress2",seekBar.getProgress()+"");
            int progress = seekBar.getProgress();
            if (progress <seekBar.getMax()/2) {
                if (progress < (seekBar.getMax() / 100 * 25)) {
                    ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(250);
                    Toast.makeText(MainActivity.this, "Snoozed!", Toast.LENGTH_LONG).show();
                    finish();
                } else {
                    seekBar.setProgress(seekBar.getMax() / 2);
                    seekBar.setThumb(alarm);
                }
            }else if (progress >seekBar.getMax()/2){
                if (progress >(seekBar.getMax())/100*98){
                    ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(250);
                    Toast.makeText(MainActivity.this,"Dismissed!",Toast.LENGTH_LONG).show();
                    finish();
                }
                else{
                    seekBar.setProgress(seekBar.getMax()/2);
                    seekBar.setThumb(alarm);
                }
            }
        }
    });
}

}

Есть идеи? Спасибо вам за советы на все ответы!

РЕДАКТИРОВАТЬ: Это видео показывает, как работает (работает правильно) в леденце на палочке (первая часть) и как работает (работает неправильно) в pre-lollipop (вторая часть): https://drive.google.com/file/d/0BzFDeTFWJtOLWnZOZG9OSHRfM0U/view?usp=sharing


person Romolo Caponera    schedule 13.04.2015    source источник


Ответы (1)


Попробуйте добавить эти две строки, прежде чем устанавливать OnSeekBarChangeListener для seekBar:

final Drawable seekBar2Thumb = getResources().getDrawable(
        R.drawable.line);
seekBar2.setThumb(seekBar2Thumb);

В документации по Android для SeekBar: http://developer.android.com/reference/android/widget/AbsSeekBar.html

для setThumb(Drawable thumb) это говорит о том, что когда вы устанавливаете действительный Drawable, изменяется смещение большого пальца, что происходило, когда вы устанавливали большой палец для seekBar.

person electrocrat    schedule 15.04.2015
comment
Добро пожаловать! Ваша идея использовать SeekBar с альфа-переходами тоже довольно крутая... - person electrocrat; 15.04.2015