Android onClick блокирует onFling - PullRequest
       27

Android onClick блокирует onFling

6 голосов
/ 22 ноября 2010

У меня есть действие, в котором реализован детектор жестов, чтобы поймать пользовательский ввод данных для перехода на другие экраны.Это работало нормально - но - я недавно обновил класс, производный от BaseActivity, чтобы добавить функцию onClick, и теперь это событие click, кажется, блокирует попадание onFling.OnClick привязан к области TextView (в LinearLayout) у меня на экране.Метод resultsClick связан с TextView, используя его свойство onClick в макете XML.

Я попытался изменить возвращаемые значения в onSingleTapUp и onDown без удачи.Я также попытался добавить операторы журнала ко всем функциям ниже.Ни один из них не срабатывает, когда я переключаюсь в область TextView, но они работают в других областях экрана.

Возможно, я использую неправильные условия поиска, но я не могу найти пример, который решает эту проблему -все же я уверен, что эта проблема была решена раньше.

public class DerivedActivity extends BaseActivity
{
   ...
   /**
    * resultsClick - The user clicked on the Results area
    * @param v
    */
   public void resultsClick(View v)
   {
      try
      {
         Log.i(this.toString(), "resultsClick");
         startActivity(new Intent(this, Results_TabHost.class ));
      }
      catch (Exception e)
      {
         Log.e(this.toString(), "Exception" + e.toString());
      }

   }// end resultsClick
   ...
}

Вот базовый класс, который реализует код GestureListener

public class BaseActivity extends    ActivityGroup 
                          implements OnGestureListener
{
   ...
   private static final int SWIPE_MIN_DISTANCE = 120;
   private static final int SWIPE_MAX_OFF_PATH = 250;
   private static final int SWIPE_THRESHOLD_VELOCITY = 200;

   public boolean onFling(MotionEvent e1, 
                          MotionEvent e2, 
                          float velocityX, 
                          float velocityY)
   {
      try
      {
         Log.i(this.toString(), "onFling");

         // jump right out if not a swipe/fling
         if (Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH)
         {
            return false;
         }

         // right to left swipe
         if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && 
             Math.abs(velocityX)   > SWIPE_THRESHOLD_VELOCITY )
         {
            Log.i(this.toString(), "fling left");
            rightArrowClick(null);

         }
         else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && 
                  Math.abs(velocityX)   > SWIPE_THRESHOLD_VELOCITY )
         {
            Log.i(this.toString(), "fling right");
            leftArrowClick(null);
         }
      }
      catch (Exception e)
      {
         Log.e(this.toString(), "Exception" + e.toString());
      }

      return true;

   }// end onFling

   // These next methods we are required to have - even if unused - 
   // in order for the Gesture Handling to work

   @Override
   public boolean onTouchEvent(MotionEvent motionEvent)
   {
      return this.gestureDetector.onTouchEvent(motionEvent);
   }

   @Override
   public void onLongPress(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
   }

   @Override
   public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

   @Override
   public void onShowPress(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
   }

   @Override
   public boolean onSingleTapUp(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

   @Override
   public boolean onDown(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }
...
}

Ответы [ 4 ]

4 голосов
/ 23 марта 2012

Обратите внимание на эту функцию:

@Override
   public boolean onDown(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

Пожалуйста, измените возвращаемое значение на ложное.

4 голосов
/ 22 ноября 2010

Ваша реализация onTouchEvent неверна. Вы просто возвращаете значение результата gestDector.

Если ваш детектор жестов, однако, не обнаруживает никаких жестов, вы говорите звонящему: «Мне здесь нечего делать», и событие касания никогда не будет отправлено детям Действия.

Вам нужно позвонить super.onTouchEvent(), если ваш детектор жестов не обработал событие.

@Override
public boolean onTouchEvent(MotionEvent motionEvent)
{
  if(this.gestureDetector.onTouchEvent(motionEvent))
  {
      return true;
  }
  //no gesture detected, let Activity handle touch event
  return super.onTouchEvent(motionEvent);
}
1 голос
/ 03 мая 2011

Вы можете просто вернуть false, когда ваш код ничего не делает ... Это позволит системе событий движения управлять всем самостоятельно. Верните true, если вы хотите остановить событие, которое будет отправлено в представление других детей ..

0 голосов
/ 05 июня 2018
imageView.setOnTouchListener(new View.OnTouchListener() {
                                        @Override
                                        public boolean onTouch(View v, MotionEvent event) {
                                            if (mDetector.onTouchEvent(event)) {
                                                return true;
                                            }

                                            return HomeScreen.super.onTouchEvent(event);
                                        }
                                    });

public class JGestureDetector extends GestureDetector.SimpleOnGestureListener {
        private static final int SWIPE_MIN_DISTANCE = 120;
        private static final int SWIPE_MAX_OFF_PATH = 250;
        private static final int SWIPE_THRESHOLD_VELOCITY = 200;

        private SwipeHandler handler;

        public SwipeHandler getHandler() {
            return handler;
        }

        public void setHandler(SwipeHandler handler) {
            this.handler = handler;
        }

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;

            // left
            if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                if (handler != null) {
                    handler.onLeft();

                    return true;
                }

                // right
            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                if (handler != null) {
                    handler.onRight();

                    return true;
                }
            }

            return super.onFling(e1, e2, velocityX, velocityY);
        }

        public static abstract class SwipeHandler {
            public void onLeft() {
            }

            public void onRight() {
            }
        }
    }
...