我正在尝试编写一个需要拦截触摸事件的自定义Behavior
。 documentation表示我应该从onInterceptTouchEvent()
返回true以接管事件流,然后只要我想继续接收事件,就从onTouchEvent()
返回true。执行此操作时,仅接收ACTION_DOWN
和ACTION_CANCEL
个事件。
以下是我如何搞定所有事情:
//==============================================================================
public class CustomBehavior extends CoordinatorLayout.Behavior<View> {
//--------------------------------------------------------------------------
public CustomBehavior( Context context, AttributeSet attrs ) {
super( context, attrs );
Log.d( "AppTag", "SlidingCardBehavior" );
}
//--------------------------------------------------------------------------
@Override public boolean onInterceptTouchEvent( CoordinatorLayout coordinator, View child, MotionEvent event ) {
Log.d( "AppTag", "onInterceptTouchEvent() "
+ MotionEvent.actionToString( event.getAction() ));
return true;
}
//--------------------------------------------------------------------------
@Override public boolean onTouchEvent( CoordinatorLayout coordinator, View child, MotionEvent event ) {
Log.d( "AppTag", "onTouchEvent() "
+ MotionEvent.actionToString( event.getAction() ));
return true;
}
//--------------------------------------------------------------------------
}
//------------------------------------------------------------------------------
布局xml:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HomeActivity">
<FrameLayout android:id="@+id/back"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.v7.widget.CardView
android:id="@+id/front"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="tv.shuriken.android.behavior.CustomBehavior" />
</android.support.design.widget.CoordinatorLayout>
当我对此进行测试时,会按预期收到ACTION_DOWN
,但不会发生ACTION_MOVE
或ACTION_UP
个事件。当我再次触摸时,我会立即收到ACTION_CANCEL
,然后是另一个ACTION_DOWN
。
文档让它听起来如此简单,我确信我错过了一些东西。如何在onTouchEvent()
中获得连续的事件流?
答案 0 :(得分:2)
尝试将clickable =“true”添加到xml中的自定义视图中。 也不要拦截第一个ACTION_DOWN,拦截ACTION_MOVE。