当前位置: 代码迷 >> Android >> Android - 触摸屏模拟兑现方向键
  详细解决方案

Android - 触摸屏模拟兑现方向键

热度:51   发布时间:2016-05-01 20:01:53.0
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 [email protected] #ACTION_DOWN} and [email protected] #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;		}	}
  相关解决方案