我如何确定手势的方向?用例显示在图像链接中。什么是正确的逻辑,用于检测人在哪个方向试图在圆形路径中移动球?我已经在移动手势中调用了方向方法......有人可以帮我调整一下这个......?
http://www.shrenikvikam.com/wp-content/uploads/2011/04/214e422a43E11S3.png-150x134.png
private String getDirection(float firstTouchX, float finalTouchX){
if((firstTouchX - finalTouchX)>0)
return "Left";
else
return "Right";
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
// MotionEvent class constant signifying a finger-down event
case MotionEvent.ACTION_DOWN: {
Log.d("ACTION DOWN","Value ->");
final float x = event.getX();
final float y = event.getY();
initialTouchX = x;
initialTouchY = y;
break;
}
// MotionEvent class constant signifying a finger-drag event
case MotionEvent.ACTION_MOVE: {
final float x = event.getX();
final float y = event.getY();
final String direction = getDirection(initialTouchX,x);
Log.d("ACTION MOVE","diff in initial and cur value of x ->" + direction + (initialTouchX - x) + initialTouchX + "y->" + initialTouchY);
break;
}
// MotionEvent class constant signifying a finger-up event
case MotionEvent.ACTION_UP: {
Log.d("ACTION UP","Value ->");
break;
}
}
return true;
}
答案 0 :(得分:2)
似乎两个触摸点形成的线的斜率应该等于该点处圆的切线。这个链接的大部分数学都是为了追求这样的solution
我已经使用角度与圆心点之间的差异取得了很好的成功。这可能也是一种方式。
答案 1 :(得分:1)
如果您正在尝试确定将球移动到圆圈周围的方式,getDirection
返回"Left"
和"Right"
没有意义,它应该与"Clockwise"
和"Counterclockwise"
。例如,考虑当球位于图像中的20标记处时:此时圆圈上的每个点都是"Right"
您现在所处的位置......
为了确定球是顺时针还是逆时针移动,您需要同时考虑触点的x
和y
坐标,仅x
坐标还不够。您还需要知道圆心的位置。我建议为了确定移动方向,你可以计算出触摸点和圆心之间的角度。
答案 2 :(得分:0)
prevTouchX = event.getHistoricalX(event.getHistorySize()-1);
currentTouchX = event.getX();
if(currentTouchX<prevTouchX){
Log.d("LEFT",event.getX()+" and "+event.getY());
}
if(currentTouchX>prevTouchX){
Log.d("RIGHT",event.getX()+" and "+event.getY());
}
同样适用于UP / DOWN
答案 3 :(得分:0)
我使用此代码来旋转视图。它工作得很好。看看这个;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
firstX = event.getX();
firstY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
int dx =(int) (event.getX() - firstX);
int dy =(int) (event.getY() - firstY);
Log.d("Distance Rotate Touch",Integer.toString((int) (firstX-dx)));
if (signView.getRotation()<180){
if (firstX - dx > 15 && firstY - dy > 15 ){
View.setRotation(signView.getRotation()-5);
}else if(firstX - dx < -15 && firstY - dy < 15 ){
View.setRotation(signView.getRotation()+5);
}
}else {
if (firstX - dx > 10 && firstY - dy < -10 ){
View.setRotation(signView.getRotation()+5);
}else if(firstX-dx < -10 && firstY - dy < -15 ){
View.setRotation(signView.getRotation()-5);
}
}
break;
default: return true;
}