Android 安卓onClick阻塞onFling

Android 安卓onClick阻塞onFling,android,android-activity,onclick,gesture-recognition,Android,Android Activity,Onclick,Gesture Recognition,我有一个活动,它实现了一个手势检测器来捕捉用户的输入,以便导航到其他屏幕。这很好——但是——我最近更新了一个从BaseActivity派生的类,添加了onClick函数,现在click事件似乎阻止了onFling被命中。onClick绑定到屏幕上的文本视图区域(在线性布局中)。ResultClick方法在XML布局中使用其onClick属性连接到TextView 我尝试过在onSingleTapUp和onDown中更改返回值,但没有运气。我还尝试将日志语句添加到下面的所有函数中。当我在文本视图区

我有一个活动,它实现了一个手势检测器来捕捉用户的输入,以便导航到其他屏幕。这很好——但是——我最近更新了一个从BaseActivity派生的类,添加了onClick函数,现在click事件似乎阻止了onFling被命中。onClick绑定到屏幕上的文本视图区域(在线性布局中)。ResultClick方法在XML布局中使用其onClick属性连接到TextView

我尝试过在onSingleTapUp和onDown中更改返回值,但没有运气。我还尝试将日志语句添加到下面的所有函数中。当我在文本视图区域中弹出时,它们都不会开火,但它们会在屏幕的其他区域开火

也许我使用了错误的搜索词,但我似乎找不到解决这个问题的例子——但我相信这个问题以前已经解决了

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

您对onTouchEvent的实现不正确。 您只需返回gestureDector结果的值

但是,如果您的手势检测器没有检测到任何手势,您会告诉来电者“我在这里没有任何事情要做”,触摸事件将永远不会发送给活动的孩子

如果手势检测器没有处理该事件,则需要调用
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);
}

当代码没有执行任何操作时,您可以返回false…它将让运动事件系统自行管理所有内容。
返回true,当您要停止要发送到其他孩子视图的事件时。

请注意此函数:

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

请将返回值更改为false。

@CodeFusionMbile-感谢您的建议。我刚刚尝试使用上面的代码更新onTouchEvent,但它对我看到的行为没有任何影响。我在每个手势事件中添加了一个日志以确保。当我尝试在屏幕上滑动时,我会看到结果中的日志,但我没有看到其他任何日志。
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() {
            }
        }
    }