Обнаружение DoubleTap в компоненте Android View

Здесь мне нужно добиться следующего: 1) наложить прозрачную «точку» на изображение PNG; где пользователь щелкнул. 2) наложить прозрачный «Большой круг», когда пользователь долго держит касание. 3) после Doble нажмите "Очистить экран"

В первую очередь я использую «onTouchEvent» для обнаружения событий щелчка... и «geasureDetector» для обнаружения двойного касания... но не получаю желаемого результата.

Это 2 реализации, которые я пробую

Этот первый подход работает нормально... Но сгенерированное событие щелчка имеет некоторое отклонение... Я имею в виду, что захваченное событие щелчка всегда смещено примерно на 50 пикселей в направлении Y.... Я не могу понять, почему это должно случиться..

class Tileview extends Activity implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener {

onCreate(){
  //add the View Thing here.
}

@Override
public void onLongPress(MotionEvent e) {
   // "longPress Detected"
}

@Override
public boolean onDoubleTap(MotionEvent e) {
  // "longPress Detected"
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    final int action = event.getActionMasked();
    switch(action){
    case MotionEvent.ACTION_DOWN:           
        mClickX = event.getX();
        mClickY = event.getY();     

    }
    myTileView.invalidate();
    return mGestureDetector.onTouchEvent(event);
}



private class MyTileView extends View{

protected void onDraw(Canvas canvas){
   // Canvas & Paint stuff - for translucent cicle 
   c.drawCircle(mClickX, mClickY, 75.0f, p);
   }
}

Другой подход позволяет правильно накладывать изображение в нужном месте; но когда я добавляю реализацию DoubleTap в «Просмотр» вместо «Активность».., doubleTap/geasureListeners никогда не срабатывает…. Единственное изменение, которое я сделал в этом случае, заключалось в том, чтобы получить onTouchEvent() — и соответствующую реализацию в «представлении» учебный класс....

class TileActivity extends Activity {

   OnCreate()
          { 
          // Bla Bla Bla       
          }

    private class TileView extends View implements OnDoubleTapListener, OnGestureListener{
            @override
            onTouchEvent(){
                    // get co-ordinates here from MotionEvent
            }

    @Override
    public boolean onDoubleTap(MotionEvent e) {

                  // THIS WON'T EVEN GET FIRED
                  // In this case the doubleTap detection is not working

        clearEntireScreen = true;
        return false;
    }
    }
}

person Pranav    schedule 28.01.2012    source источник


Ответы (2)


Может быть, проблема в том, что onTouchEvent не возвращает значение true, когда детектор жестов не обнаруживает двойное нажатие или длительное нажатие? Я бы поместил вызов mGestureDetector.onTouchEvent в начало onTouchEvent и продолжил бы обработку ACTION_DOWN только в том случае, если он возвращает false. И в этом случае onTouchEvent обязательно должен вернуть true:

@Override
public boolean onTouchEvent
  (
    MotionEvent event
  )
  {
    boolean Handled = mGestureDetector.onTouchEvent(event);
    if (!Handled)
      {
        final int action = event.getActionMasked();
        switch(action)
          {
        case MotionEvent.ACTION_DOWN:           
            mClickX = event.getX();
            mClickY = event.getY();
            Handled = true;
        break;
          } /*switch*/
        myTileView.invalidate();
      } /*if*/
    return
        Handled;
  } /*onTouchEvent*/
person Lawrence D'Oliveiro    schedule 29.01.2012

Это РЕШЕНО сейчас...!! Кажется, лучший способ решить эту проблему — создать класс жестдетектор и реализовать «SimpleOnGestureListener».

Мне пришлось немного подправить реализацию... но скелетный код гораздо больше похож на то, что объясняется здесь, в этом посте... Обнаружение жестов Fling в сетке

Мне пришлось переопределить методы LongPress/onDoubleTap/onSigleTapUp/onSingletapconfirmed для достижения желаемых результатов...

Спасибо за помощь... !!

person Pranav    schedule 02.02.2012