onClickListener не позволяет триггеру onFling
У меня есть 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 onFling), но не нашел подходящего ответа.
1 ответ
Вы должны попробовать использовать onInterceptTouchEvent()
(или, может быть dispatchTouchEvent()
, на данный момент я не уверен, что подойдет лучше) из Button
Родитель (или что-то еще выше в иерархии), чтобы решить, следует ли направить касание на кнопку или детектор жестов.
Если MotionEvent
координаты принадлежат Button
прям и ACTION_DOWN
сопровождается ACTION_UP
в ближайшее время, это щелчок и должен быть направлен на Button
, но если вы получите ACTION_MOVE
и движение продолжается до такой степени, что вы знаете, что это удар - это должно быть обработано детектором жестов.
UPD Вот ответ, который объясняет метод /questions/14590375/kak-provesti-razlichie-mezhdu-broskom-i-prikosnoveniem/14590379#14590379