我有一个Activity,它实现了一个Gesture Detector来捕获用户输入导航到其他屏幕的输入.这工作正常 – 但是 – 我最近更新了一个派生自BaseActivity的类来添加onClick函数,现在click事件似乎阻止onFling被击中. onClick与我在屏幕上的TextView区域(在LinearLayout中)相关联. resultsClick方法使用
XML布局中的onClick属性连接到TextView.
我试过在没有运气的情况下更改onSingleTapUp和onDown的返回值.我也尝试过将log语句添加到下面的所有函数中.当我在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,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结果的值即可.
您只需返回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); }