2012-01-28 3 views
0

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

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

Эти 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); 
    } 
} 

другой подход может накладываться изображение propely в нужном месте; но когда я добавляю реализацию DoubleTap в «View» вместо Activity .., то doubleTap/geastureListeners никогда бы не срабатывали .... Только изменение, которое я сделал в этом случае, заключалось в том, чтобы получить реализацию onTouchEvent() - и corrsponding в представлении "класс ....

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; 
    } 
    } 
} 

ответ

0

Это ПОСТАНОВИЛИ сейчас ... !! Кажется, что лучший способ решения проблемы заключается в создании класса gestureDetector и реализовать «SimpleOnGestureListener» ..

мне пришлось подправить реализация немного ... но скелет кода гораздо больше похожа на то, что описано здесь в этом посте ... Fling gesture detection on grid layout

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

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

+0

Просьба отметить это как ответ на ваш вопрос – Niels

0

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

@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*/