我同时拥有onClickListener
和onFling
(使用GestureDetector
)。
如果我点击按钮,onClickListener
将会触发。
如果我扔在屏幕的主体上,那么onFling
会发射。
但是,如果我从按钮开始投掷,则不会发射。
布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/myButton"
android:layout_margin="50dp"
android:layout_height="100dp"
android:layout_width="match_parent"
android:text="Button"/>
</LinearLayout>
代码如下:
public class myLayout extends Activity implements GestureDetector.OnGestureListener {
private GestureDetector gDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myLayout);
gDetector = new GestureDetector(getBaseContext(), this);
findViewById(R.id.myButton).setOnClickListener(button_OnClickListener);
}
final View.OnClickListener button_OnClickListener = new View.OnClickListener() {
public void onClick(final View buttonView) {
Toast.makeText(getApplicationContext(), "button pressed", Toast.LENGTH_LONG).show();
}
};
@Override
public boolean onDown(MotionEvent motionEvent) {
return true;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent start, MotionEvent finish, float v, float v2) {
if (start.getRawY() < finish.getRawY()) {
Toast.makeText(getApplicationContext(), "Fling detected", Toast.LENGTH_LONG).show();
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent me) {
Log.i("Touch", "onTouchEvent");
return gDetector.onTouchEvent(me);
}
}
如何让onFling
先运行?
我已查看其他帖子(例如onClick blocking onFling)但未找到合适的答案。
答案 0 :(得分:0)
您应该尝试使用onInterceptTouchEvent()
(或者,dispatchTouchEvent()
,此时我不确定哪个更适合Button
的父母(或更高级别的东西)在层次结构中)决定是否将触摸路由到按钮或手势检测器。
如果MotionEvent
的坐标属于Button
的矩形而ACTION_DOWN
后面紧跟ACTION_UP
,则只需点击一下即可将其路由到{ {1}},但是如果您收到Button
并且移动继续到您知道滑动的程度 - 它应该由手势检测器处理。
UPD 以下是解释技术https://stackoverflow.com/a/3834952/375929
的答案