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;
    }
}
Другие вопросы по тегам