我在使用GestureDetector和同时点击RelativeLayout时遇到问题。当我的RelativeLayout无法点击时,应用程序可以完美识别每个手势,但是当我将布局设置为可点击时,应用程序不会识别手势。 有没有办法同时使用两者?
答案 0 :(得分:0)
不幸的是,onClick()& onTouch()在一起使用时无法正常运行。 我使用onTouch来解决点击问题。 我不确定如何使用手势检测器。 我将分享我的代码..没有手势检测器它工作正常。如果它不起作用,请告诉我。
初始化您的听众:
GestureDetector gdt;
View.OnTouchListener touchListener;
private void initializeListener()
{
gdt = new GestureDetector(mContext,new GestureListener());
touchListener = new View.OnTouchListener() {
float startX;
float startY;
float CLICK_ACTION_THRESHOLD = 5;
//Uses the touched coordinates recorded through MOTION_DOWN & MOTION_UP to detect whether the action performed was a click
private boolean isAClick(float startX, float endX, float startY, float endY) {
if(isLoadingView)
return false;
float differenceX = Math.abs(startX - endX);
float differenceY = Math.abs(startY - endY);
return !(differenceX > CLICK_ACTION_THRESHOLD || differenceY > CLICK_ACTION_THRESHOLD);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_UP: {
float endX = event.getX();
float endY = event.getY();
if (isAClick(startX, endX, startY, endY))
{
switch (v.getId())
{
case R.id.view_id:
break
}
}
}
break;
}
gdt.onTouchEvent(event);
return true;
}
};
}
向视图添加侦听器:
private void addTouchListenerToView(View v) {
v.setOnTouchListener(touchListener);
}
示例手势监听器类:
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
private final int SWIPE_MIN_DISTANCE = 153;
private final int SWIPE_THRESHOLD_VELOCITY = 20;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
{
return false; // Right to left
}
else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE ) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
{
return false; // Left to right
}
if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE)// && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)
{
return false; // Bottom to top
}
else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE)// && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)
{
return false; // Top to bottom
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE*10 ) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
{
return false; // Right to left
}
else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE*10 ) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
{
return false; // Left to right
}
return true;
}
}