Android开发教程: 触摸屏模拟实现方向键

改写Android的Snake例子,使之运行于我的三星手机上。判断规则如下:如果x方向移动距离大于y方向,则认为是水平移动,反之则是上下移动。如果水平移动,x移动正距离x-x0>0 则认为向右移动,负距离x-x0<0 则认为向左移动;上下移动的判断同理。

代码如下,需要注意的是MotionEvent的ACTION_DOWN, ACTION_UP 是这么理解的:

ACTION_DOWN - A pressed gesture has started, the motion contains the initial starting location.

ACTION_UP - A pressed gesture has finished, the motion contains the final release location as well as any intermediate points since the last down or move event.

ACTION_MOVE - A change has happened during a press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}). The motion contains the most recent point, as well as any intermediate points since the last down or move event. -

简而言之,ACTION_DOWN, ACTION_UP 类似于Javascript里面键盘事件OnKeyDown, OnKeyUp 或鼠标事件OnMouseDown, OnMouseUp, 而不是说手指往上划拉或往下划拉了一下。

/**    * Re write onKeyDown() for SAMSUNG    */   public boolean onTouchEvent(MotionEvent event) {        // Set the game status to running        if (event.getAction() == MotionEvent.ACTION_DOWN) {            if (mMode == READY | mMode == LOSE) {                initNewGame();                setMode(RUNNING);                update();                return true;            }               if (mMode == PAUSE) {                setMode(RUNNING);                update();                return true;            }        }           float x = event.getX();        float y = event.getY();           switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:            mX = x;            mY = y;            update();            return true;        case MotionEvent.ACTION_UP:            float dx = x - mX;            float dy = y - mY;            if (Math.abs(dx) >= TOUCH_TOLERANCE                    || Math.abs(dy) >= TOUCH_TOLERANCE) {                   if (Math.abs(dx) >= Math.abs(dy)) { // move from left -> right                                                        // or right -> left                    if (dx > 0.0f) {                        turnTo(EAST);                    } else {                        turnTo(WEST);                    }                   } else { // move from top -> bottom or bottom -> top                    if (dy > 0.0f) {                        turnTo(SOUTH);                    } else {                        turnTo(NORTH);                    }                }                update();                return true;            }        }           return super.onTouchEvent(event);    }       private void turnTo(int direction) {        if (direction == WEST & mDirection != EAST) {            mNextDirection = WEST;        }           if (direction == EAST & mDirection != WEST) {            mNextDirection = EAST;        }           if (direction == SOUTH & mDirection != NORTH) {            mNextDirection = SOUTH;        }           if (direction == NORTH & mDirection != SOUTH) {            mNextDirection = NORTH;        }    }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wywdsg.html