FAB 波纹效果在视界外持续存在
FAB Ripple effect persisting outside of viewbounds
在我的所有布局中,如果用户将手指移出 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 都是各种基本 CoordinatorLayout 的直接子代,即
<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(参见 'Issue #2')设计库 v25.0.0 中存在该问题,v23.4.0
中不存在该问题
最终编辑:此错误已通过支持库 25.1.0 版本修复https://developer.android.com/topic/libraries/support-library/revisions.html#
如果您遇到此问题,请将您的支持库版本更新到 25.1.0。
我认为这是由于合并了一个修复程序以更正 Lollipop 之前版本中 FloatingActionButton
的可点击区域。如果触摸发生在内容区域之外,此修复会将 onTouchEvent()
方法覆盖为 return false
。不幸的是,这会阻止任何进一步的触摸事件被传送到 View
,因此它永远不会收到 ACTION_UP
,因此不会相应地更新其按下状态。
我们应该能够通过子类化 FloatingActionButton
、覆盖 onTouchEvent()
我们自己、检查 super
调用中的 return 并设置按下状态来修复此修复如果事件已经离开内容区域,则正确。
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;
}
}
在我的所有布局中,如果用户将手指移出 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 都是各种基本 CoordinatorLayout 的直接子代,即
<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(参见 'Issue #2')设计库 v25.0.0 中存在该问题,v23.4.0
中不存在该问题最终编辑:此错误已通过支持库 25.1.0 版本修复https://developer.android.com/topic/libraries/support-library/revisions.html# 如果您遇到此问题,请将您的支持库版本更新到 25.1.0。
我认为这是由于合并了一个修复程序以更正 Lollipop 之前版本中 FloatingActionButton
的可点击区域。如果触摸发生在内容区域之外,此修复会将 onTouchEvent()
方法覆盖为 return false
。不幸的是,这会阻止任何进一步的触摸事件被传送到 View
,因此它永远不会收到 ACTION_UP
,因此不会相应地更新其按下状态。
我们应该能够通过子类化 FloatingActionButton
、覆盖 onTouchEvent()
我们自己、检查 super
调用中的 return 并设置按下状态来修复此修复如果事件已经离开内容区域,则正确。
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;
}
}