我有一个实现手势检测器的 Activity 来捕获用户输入以导航到其他屏幕。那工作得很好 - 但是 - 我最近更新了一个派生自 BaseActivity 的类以添加一个 onClick 函数,现在点击事件似乎阻止了 onFling 被击中。onClick 绑定到我屏幕上的 TextView 区域(在 LinearLayout 中)。resultsClick 方法使用 XML 布局中的 onClick 属性连接到 TextView。
我尝试更改 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;
}
...
}