2

Во всех моих макетах эффекты пульсации FloatingActionButtons сохраняются, если пользователь поднимает палец за пределы просмотра FAB. то есть пользователь нажимает белый FAB, пульсация приводит к тому, что FAB серый, пользователь отталкивает палец от кнопки и поднимает его, а кнопка остается серой.FAB Эффект пульсации, сохраняющийся за пределами видимых окон

Вот пример ФАБ XML:

<android.support.design.widget.FloatingActionButton 
      android:id="@+id/fab_pinfav" 
      android:layout_width="@dimen/fab_size" 
      android:layout_height="@dimen/fab_size" 
      android:src="@drawable/icon_unfavd" 
      app:elevation="8dp" 
      android:elevation="8dp" 
      android:layout_gravity="bottom|end" 
      android:layout_marginRight="@dimen/spacingMedium" 
      android:layout_marginEnd="@dimen/spacingMedium"/> 

И все FABs являются прямыми потомками различных основных CoordinatorLayouts, т.е.

<android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

Испытано на различных устройствах, начиная от Android 5.1 до Android 7.1, с та же проблема для каждого.

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

EDIT: Связанные Google Выпуск https://code.google.com/p/android/issues/detail?id=218956 (см 'Выпуск № 2') Проблема присутствует в Design Library v25.0.0 и нет в v23.4.0

FINAL EDIT: Эта ошибка была исправлена ​​с Библиотека поддержки 25.1.0 release https://developer.android.com/topic/libraries/support-library/revisions.html# Если вы столкнулись с этой проблемой, обновите версию своей поддерживающей библиотеки до 25.1.0.

ответ

5

Я полагаю, что это связано с тем, что исправление слилось, чтобы исправить FloatingActionButton в области с кликом в версиях до Lollipop. Это исправление переопределяет метод onTouchEvent() для возврата false, если касание происходит за пределами области содержимого. К сожалению, это приводит к прекращению любых дополнительных событий касания, доставляемых в View, поэтому он никогда не принимает ACTION_UP и поэтому не обновляет свое нажатое состояние соответственно.

Мы должны быть в состоянии исправить это исправить с помощью подклассов FloatingActionButton, перекрывая onTouchEvent() себя, проверяя возвращение от super вызова и настройки залипшей правильно, если событие оставило область содержимого.

public class CustomFAB extends FloatingActionButton { 

    public CustomFAB(Context c, AttributeSet a) { 
     super(c, a); 
    } 

    // Additional constructors as needed 
    // ... 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     boolean result = super.onTouchEvent(ev); 
     if (!result) { 
      setPressed(false); 
     } 
     return result; 
    } 
} 
+0

Это сработало, спасибо. Таким образом, ошибка находится в библиотеке поддержки, а не в моем коде; будет ли ваше решение вызывать какие-либо проблемы с поддержкой до левшей? Кроме того, было бы лучшим промежуточным решением просто вернуться к использованию старой версии библиотеки поддержки? Приветствия. – Demonsoul

+1

Я просто быстро проверил, что у меня есть в продаже в эту минуту, это мое устройство KitKat, и оно работает так, как ожидалось в этой версии. Я не предвижу никаких серьезных проблем с другими версиями, хотя, конечно, я не тестировал всюду. Вы, конечно, можете вернуться к более старой версии библиотеки, но я не уверен, что проблема с «кликабельной областью» была, так как комментарий о слиянии является неопределенным, поэтому на самом деле это может быть менее желательное поведение. Я также не уверен, сколько времени может быть промежуточным, так как похоже, что они еще не рассмотрели проблему даже в самом последнем источнике, который я могу найти. Ура! –

+1

Я откопал связанную с этим проблему в Google Tracker Issue Tracker здесь: https://code.google.com/p/android/issues/detail?id=218956 Кто-то сообщает об ошибке, представленной в v23.4.0, поэтому вместо вернитесь, я буду использовать это решение CustomFAB. Я считаю, что ваше решение лучше, чем то, что люди предложили там, если вы хотите распространить его. Благодаря! – Demonsoul

Смежные вопросы