Обработка сенсорных событий в родительских и дочерних пользовательских представлениях Android

сегодня у меня возникла проблема с обработкой сенсорных событий в пользовательских представлениях Android. В этом случае я создал вызов родительского представления weekview и chiled call weekdayview. Я хочу реализовать сенсорное событие, такое как singleTap, LongPress, только в дочернем представлении и когда я прокручиваю родительский или дочерний Я хочу прокрутить родительский вид. Когда я реализую сенсорное событие в обоих представлениях, оно не работает.

введите здесь описание изображения

может ли кто-нибудь помочь мне в этом. Это действительно полезно для меня. Спасибо


person Sanath    schedule 12.09.2012    source источник
comment
Я думаю, что если событие касания находится в дочернем представлении, родительское представление никогда не получит уведомление. Так что лучше используйте GestureDetector, внутри вашего дочернего представления, onTouchEvent, вы отправляете событие на жест и обрабатываете его в родительском представлении.   -  person Tom    schedule 12.09.2012
comment
Я использую GestureDetector в обеих частях прокрутки представления, выполняемых в родительском представлении, и это нормально. Но я хочу сделать что-то в дочернем представлении. Я возвращаю false в методе onDown в дочернем представлении. не работает   -  person Sanath    schedule 12.09.2012


Ответы (2)


class ChildView extends View {


    public void setGestureDetector (GestureDetector g)
    {
        gesture = g;
    }

    @Override
    public boolean onTouchEvent (....)
    {
        return gesture.onTouchEvent (....); // touch event will dispatch to gesture
    } 
}

class ParentView extends View implements GestureDetector.OnGestureListener {

    gesture = new GestureDetector (this);

    child = new ChildView (...);
    child.setGestureDetector (gesture);

    @Override
    public boolean onTouchEvent (..)
    {
       // handle your parent touch event here
    }

    public boolean onDown (...)
    {
       return true;
    }

    public boolean fling (...) 
    {
       // here to handle child view fling
    }


}

Это песо-код (не настоящий Android java), чтобы показать вам концепцию использования GestureDetector, вы можете обрабатывать все события из вашего дочернего представления в родительском представлении. Как я тестировал на своем телефоне Android, onTouchEvent в ChildView не очень хорошо распознавал ACTION_UP, поэтому даже если вы пролистнули свой Child View, иногда бросок не сработает (это зависит от ACTION_UP).

Поэтому, если вы хотите написать более точное смахивание в своем дочернем представлении, лучше напишите свой класс обнаружения жестов Оуэна, и в своем дочернем представлении вы можете сделать это -

float oldX;
float distanceX;

public boolean onTouchEvent (MotionEvent event...)
{
     if (event.getAction == MotionEvent.ACTION_DOWN) {
        // handle down
        oldX = event.getX ();
     }

     if (event.getAction == MotionEvent.ACTION_MOVE {
        // handle move
        distanceX = event.getX() - oldX; // more accurate

        gesture.onSwipe (distanceX); // your own gesture class
     }


}
person Tom    schedule 12.09.2012
comment
Я использую что-то очень близкое к этой реализации. Я создал детектор жестов для родителя и ребенка. Это отличается от вашего метода. - person Sanath; 12.09.2012
comment
Я думаю, что дочернее представление отправит событие в ваше родительское представление, поэтому вы можете иметь дело с прокруткой (пролистыванием), а также в родительском представлении onouchevent, вы также можете иметь дело с пролистыванием, возвращая true в своем событии onDown. Я сделал подобное, и я знаю, что у броска есть ошибка, иногда в моем телефоне Android onTouchEvent не может очень хорошо распознать ACTION_UP, поэтому на этот раз бросок не сработает. - person Tom; 12.09.2012

Установите скорость прокрутки (чтобы определить намерение пользователя провести пальцем) и переопределите onTouchEvent() в дочернем представлении. Здесь вызовите super.onTouchEvent() и return, который вызывает ваше родительское представление. Обрабатывайте события в родительском представлении.

person knvarma    schedule 12.09.2012