У меня есть макет 'layout_base', который заполняет экран, и дочерний вид 'home'.Я установил OnClickListener
для 'layout_base', чтобы выполнить какое-либо действие (закройте всплывающее окно, если оно открыто), и OnTouchListener
для 'home', чтобы выполнить какое-то другое действие (перевести на fling).
Моя проблема в том, что я могу выполнить действие только в том случае, если верну true
в методе onTouch
«домашнего» сенсорного прослушивателя.Если я возвращаю false
, onFling не вызывается.Зачем?Из документа, который я прочитал, это означает только то, что событие потребляется, то есть, насколько я понимаю, оно не передается другому слушателю.
Итак:
если я возвращаю true
в onTouch
, вызывается onFling
, но тогда не вызывается onClick в onClickListener родительского представления layout_base.
, если я возвращаюсьfalse
в onTouch
, onFling
не вызывается, но затем вызывается onClick в onClickListener родительского представления layout_base.
Как получить оба моихОбнаружение onFling работает на «home», а мое обнаружение onClick работает на «layout_base»?
Спасибо вам
layout_base = findViewById(R.id.layout_base);
layout_base.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
closePopup(); // never called
}
});
contentGestureDetector = new GestureDetector(new ContentGestureListener());
contentGestureListener = new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
contentGestureDetector.onTouchEvent(event);
return true; // onFling only called if return true
}
};
home.setOnTouchListener(contentGestureListener);
class ContentGestureListener extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
final int SWIPE_MIN_DISTANCE = 120;
final int SWIPE_MAX_OFF_PATH = 250;
final int SWIPE_THRESHOLD_VELOCITY = 200;
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
if(e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if(!mMenuOpen){
mOpenMenuAnim.start();
mMenuOpen = true;
}
}
else if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if(mMenuOpen){
mCloseMenuAnim.start();
mMenuOpen = false;
}
}
return false;
}
}