FAB Ripple эффект сохраняется за пределами видимости
На всех моих макетах волновые эффекты моего FloatingActionButtons сохраняются, если пользователь поднимает палец за пределами представления 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"/>
И все FAB являются прямыми потомками различных базовых CoordinatorLayouts, т.е.
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
Протестировано на различных устройствах от Android 5.1 до Android 7.1, с одинаковыми проблемами на каждом.
Я не видел подобных случаев на других моих взглядах, поскольку они реагируют на сенсорные эффекты.
РЕДАКТИРОВАТЬ: Связанная проблема Google https://code.google.com/p/android/issues/detail?id=218956 (см. "Проблема № 2"). Эта проблема присутствует в Библиотеке дизайна v25.0.0 и отсутствует в v23.4,0
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Эта ошибка была исправлена в выпуске библиотеки поддержки 25.1.0 https://developer.android.com/topic/libraries/support-library/revisions.html Если вы столкнулись с этой проблемой, обновите версию своей библиотеки поддержки до 25.1.0.
1 ответ
Я считаю, что это связано с исправлением, слитым, чтобы исправить 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;
}
}