FAB涟漪效应持续在视界之外



在我所有的布局中,如果用户在FAB视图外抬起手指,我的FloatingActionButtons的涟漪效应将持续存在。即用户按下白色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的不同设备上测试,每个设备上都有相同的问题。

我在我的其他视图中没有看到任何类似的情况,因为它们对触摸效果有反应。

编辑:相关的谷歌问题https://code.google.com/p/android/issues/detail?id=218956(见'问题#2')问题存在于Design Library v25.0.0,而不存在于v23.4.0

FINAL EDIT:此错误已在支持库25.1.0版本https://developer.android.com/topic/libraries/support-library/revisions.html#中修复如果您遇到此问题,请将支持库版本更新到25.1.0。

我认为这是由于在pre-棒棒糖版本中FloatingActionButton的可点击区域的修复合并。这个修复覆盖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;
    }
}

最新更新