确定多个视图中哪个VIEW有手势(双击、向左滑动、向右滑动等)?
Determine which VIEW in multiple views has gesture (double click, swipe left, swipe right, etc)?
我有一个滚动视图,其中有多个水平相对布局视图...一个数据库中的每条记录...以编程方式创建。
我需要确定哪个视图受某些手势影响...单击、双击和 left/right 滑动。
当然,我能够获得的点击:
RelativeLayout rlView = new RelativeLayout(this);
rlView.setId(10000+myrecordid);
rlView.setOnClickListener(myviewclick);
和 myviewclick:
private View.OnClickListener myviewclick = new View.OnClickListener() {
public void onClick(View v) {
Integer i=v.getId()-10000;
// Do some processing on this view
}
};
根据我在网上找到的,我尝试这样得到手势:
rlView.setOnTouchListener(myviewtouch);
使用此代码:
private View.OnTouchListener myviewtouch = new View.OnTouchListener(){
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.i("MYLOG","double tap");
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("MYLOG","SingleTapConfirmed");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Log.i("MYLOG","LongPress");
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getX()<e2.getX())
Log.i("MYLOG","Fling Right");
else
Log.i("MYLOG","Fling Left");
return true;
}
});
};
根据我的日志,我正在根据需要获得适当的手势。问题是,我不知道如何获取手势所在的视图 ID。我知道它在 onTouch
中,但调用 gestureDetector.OnTouchEvent
来确定动作......我我迷路了。
我在 Whosebug 和其他网站上搜索了几个小时……它们都显示了如何确定手势的差异……但是我找不到任何关于使用我可以使用的多个视图的信息。
如有任何帮助,我们将不胜感激。
我想我明白了。可能不是最优雅的方式,并且可能还有其他 "issues" 因为以这种方式处理它,但现在它可以工作。但是如果其他人发现了这个问题,我是这样解决的:
这是我修改后的代码的运行方式。我添加了一个名为 vTouch
:
的 public 变量
private View.OnTouchListener myviewtouch = new View.OnTouchListener(){
public View vTouch;
public boolean onTouch(View v, MotionEvent event) {
vTouch=v;
return gestureDetector.onTouchEvent(event);
}
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
Integer viewId=vTouch.getId();
Log.i("MYLOG","double tap in view: "+viewId);
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Integer viewId=vTouch.getId();
Log.i("MYLOG","SingleTapConfirmed in view: "+viewId);
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Integer viewId=vTouch.getId();
Log.i("MYLOG","LongPress in view: "+viewId);
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Integer viewId=vTouch.getId();
if (e1.getX()<e2.getX())
Log.i("MYLOG","Fling Right in view: "+viewId);
else
Log.i("MYLOG","Fling Left in view: "+viewId);
return true;
}
});
};
通过使用内部 public 变量 vTouch
我现在可以在每个手势事件中引用视图,其中需要 "view" 手势恰好在其中。
我有一个滚动视图,其中有多个水平相对布局视图...一个数据库中的每条记录...以编程方式创建。
我需要确定哪个视图受某些手势影响...单击、双击和 left/right 滑动。
当然,我能够获得的点击:
RelativeLayout rlView = new RelativeLayout(this);
rlView.setId(10000+myrecordid);
rlView.setOnClickListener(myviewclick);
和 myviewclick:
private View.OnClickListener myviewclick = new View.OnClickListener() {
public void onClick(View v) {
Integer i=v.getId()-10000;
// Do some processing on this view
}
};
根据我在网上找到的,我尝试这样得到手势:
rlView.setOnTouchListener(myviewtouch);
使用此代码:
private View.OnTouchListener myviewtouch = new View.OnTouchListener(){
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.i("MYLOG","double tap");
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("MYLOG","SingleTapConfirmed");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Log.i("MYLOG","LongPress");
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getX()<e2.getX())
Log.i("MYLOG","Fling Right");
else
Log.i("MYLOG","Fling Left");
return true;
}
});
};
根据我的日志,我正在根据需要获得适当的手势。问题是,我不知道如何获取手势所在的视图 ID。我知道它在 onTouch
中,但调用 gestureDetector.OnTouchEvent
来确定动作......我我迷路了。
我在 Whosebug 和其他网站上搜索了几个小时……它们都显示了如何确定手势的差异……但是我找不到任何关于使用我可以使用的多个视图的信息。
如有任何帮助,我们将不胜感激。
我想我明白了。可能不是最优雅的方式,并且可能还有其他 "issues" 因为以这种方式处理它,但现在它可以工作。但是如果其他人发现了这个问题,我是这样解决的:
这是我修改后的代码的运行方式。我添加了一个名为 vTouch
:
private View.OnTouchListener myviewtouch = new View.OnTouchListener(){
public View vTouch;
public boolean onTouch(View v, MotionEvent event) {
vTouch=v;
return gestureDetector.onTouchEvent(event);
}
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
Integer viewId=vTouch.getId();
Log.i("MYLOG","double tap in view: "+viewId);
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Integer viewId=vTouch.getId();
Log.i("MYLOG","SingleTapConfirmed in view: "+viewId);
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Integer viewId=vTouch.getId();
Log.i("MYLOG","LongPress in view: "+viewId);
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Integer viewId=vTouch.getId();
if (e1.getX()<e2.getX())
Log.i("MYLOG","Fling Right in view: "+viewId);
else
Log.i("MYLOG","Fling Left in view: "+viewId);
return true;
}
});
};
通过使用内部 public 变量 vTouch
我现在可以在每个手势事件中引用视图,其中需要 "view" 手势恰好在其中。