Android(安卓)- 触摸屏模拟实现方向键
16lz
2021-01-24
改写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, 而不是说手指往上划拉或往下划拉了一下。
代码如下,需要注意的是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 runningif (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 -> leftif (dx > 0.0f) {turnTo(EAST);} else {turnTo(WEST);}} else { // move from top -> bottom or bottom -> topif (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;}}
更多相关文章
- Android(安卓)弹性布局 FlexboxLayout(一) :flexDirection,flexWrap
- Android百度地图之方向感应和模式更改
- Android中padding与margin的区别
- android动态修改横竖屏
- 被裁员!大龄Android程序员面试惨败辛酸史,技术水平真的很重要!
- 安卓开发学习之002 LinearLayout之android:layout_gravity详解
- Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)
- Android5.0 材质设计(纸墨设计)中的z轴理念
- 这是什么水平