触摸移动手势逻辑...如何确定2d中的移动方向?

时间:2011-05-14 07:10:06

标签: android algorithm graphics geometry

我如何确定手势的方向?用例显示在图像链接中。什么是正确的逻辑,用于检测人在哪个方向试图在圆形路径中移动球?我已经在移动手势中调用了方向方法......有人可以帮我调整一下这个......?

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;
    }

4 个答案:

答案 0 :(得分:2)

似乎两个触摸点形成的线的斜率应该等于该点处圆的切线。这个链接的大部分数学都是为了追求这样的solution

我已经使用角度与圆心点之间的差异取得了很好的成功。这可能也是一种方式。

答案 1 :(得分:1)

如果您正在尝试确定将球移动到圆圈周围的方式,getDirection返回"Left""Right"没有意义,它应该与"Clockwise""Counterclockwise"。例如,考虑当球位于图像中的20标记处时:此时圆圈上的每个点都是"Right"您现在所处的位置......

为了确定球是顺时针还是逆时针移动,您需要同时考虑触点的xy坐标,仅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;
        }