Селектор реагирует медленно — иногда вообще не срабатывает перед началом следующего действия

#android

#Android

Вопрос:

У меня определен этот селектор:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- PRESSED -->
    <item android:state_pressed="true"
          android:drawable="@drawable/backarrow_blueshiny" />

    <!-- FOCUSED --> 
    <item android:state_focused="true"
          android:drawable="@drawable/backarrow_blackshiny" />

    <!-- DEFAULT -->
    <item android:drawable="@drawable/backarrow_blackshiny" />

</selector>
  

и он используется с этой кнопкой:

     <RelativeLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:background="@drawable/bottomborder_glossy">

        <!-- BACK -->
        <ImageButton
        android:id="@ id/filter_button_back"
        android:layout_width="90dip" 
        android:layout_height="wrap_content" 
        android:src="@drawable/selector_back_button"
        android:background="#00000000"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"/>

    </RelativeLayout>
  

и событие onTouch состоит из:

 public boolean onTouch(View v, MotionEvent event)
{
    final int actionPerformed = event.getAction();
    final int widgetID = v.getId();

    if (actionPerformed == MotionEvent.ACTION_UP)
    {
        switch (widgetID)
        {
            case R.id.filter_button_back:
            {
                this.finish();
                break;
            }

        }

    }

    return false;
}
  

что делает эта кнопка, так это завершает текущее действие this.finish()
Однако в моем тестировании кнопка не всегда переключается на «backarrow_blueshiny», а именно при очень быстром нажатии.

Итак, проблема в том, что селектор срабатывает медленнее, чем onTouch (MotionEvent.Событие ACTION_UP).

Могу ли я что-нибудь сделать, чтобы убедиться, что селектор не «лагает»?

Ответ №1:

Попробуйте установить свой вид как нажатый программно в OnTouchListener:

 @Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            button.setPressed(true);
            break;
        case MotionEvent.ACTION_UP:
            // optional, should work without next line
            // button.setPressed(false); 
            break;
    }

    return false;
}
  

Комментарии:

1. Отлично, это сработало! Эта задержка сводила меня с ума.

Ответ №2:

У меня была такая же проблема. В эмуляторе даже не изменился цвет кнопки. Это вызвано «onTouch». Если вы используете OnClickListener вместо OnTouchListener, он будет реагировать так, как ожидалось.

Как я вижу, вы не используете никаких возможностей мультитач, поэтому почему бы вам не использовать onClick и не избавиться от

    if (actionPerformed == MotionEvent.ACTION_UP)
  

Ответ №3:

Вы имеете в виду более медленное, чем типичное поведение Android-селектора? По моему опыту, всегда была небольшая задержка между нажатием кнопки и ее выбором — я предполагаю, что это для того, чтобы избежать отображения события касания, когда вы просто хотите прокрутить, но меня это всегда раздражало. Если это больше, чем обычное поведение, попробуйте использовать просто кнопку с android:background установленным значением селектора, а не ImageButton с android:src установленным значением селектора.

например

 <Button
    android:layout_width="90dip"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_back_button"
    android:layout_alignParentLeft="true"
    android:layout_alignParentBottom="true" 
    />
  

Комментарии:

1. ваш предлагаемый метод, похоже, обладает той же скоростью реакции, которую я уже получал. Я все еще могу нажимать очень быстро, и пользовательский интерфейс не реагирует, но событие ACTION_UP уже запущено.

2. Я отмечу ваш ответ как ответ, поскольку, похоже, вряд ли вы получите больше ответов

3. Дайте людям время. 🙂 Вам не обязательно принимать это так скоро, прошло всего четыре часа. Тем не менее, поведение, которое вы описываете, абсолютно нормально. Визуально вы не увидите, что щелчки происходят так быстро, как вы нажимаете на него, но все события должны запускаться нормально. Это просто особенность Android; каждый телефон (Droid, Droid 2, Incredible, Droid X), который я использовал, демонстрирует такое поведение.