Не удается обнаружить событие касания в представлении и событие щелчка, обнаруженное в родительском представлении - PullRequest
1 голос
/ 03 апреля 2012

У меня есть макет '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;
    }
}

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

onTouch() потребляет событие, вы должны в своем методе onTouch(), возвращать false вместо true

public boolean onTouch(View v , MotionEvent motionEvent) {
  // your code 
  return false;
}

РЕДАКТИРОВАТЬ:

измените метод onTouch () следующим образом:

public boolean onTouch(View v, MotionEvent event) 
    {  
        return contentGestureDetector.onTouchEvent(event);
    }
0 голосов
/ 19 апреля 2012

Я бы попробовал

  • вернуть false в onTouch => вызывается onClick
  • в Home.onInterceptTouchEvent вы можете вернуть true, если обнаружите «бросок» (сравнивая значения x / y входящего действия MOVE)

При возврате true события в направлении layout_base будут отменены, и в этом случае не будет происходить onClick.

0 голосов
/ 14 апреля 2012

Я столкнулся с тем же. Вам нужно возвращать true в событии onTouch down, чтобы получать события перемещения и вверх (и заставить работать жесты). Затем вам нужно реализовать одну из функций , о которой здесь говорили , чтобы остальные работали. Надеюсь, это поможет.

...