处理android屏幕滑动事件onTouchEvent
2013-05-18 21:18
239 查看
/**
* 当用户每次触摸时,会产生多个MotionEvent事件
* 其中包含1个 ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
* 以下我以我做的一个大家熟知的俄罗斯方块为例,它通常有左移动,右移动,下加速,和变换。
*
![](https://img-blog.csdn.net/20130518212913830)
* 通常我们在按下的时候记录按下的X,Y坐标,这个事件会在一次触屏的过程中触发一次
* 然后在我们滑动的过程中,会触发很多次MotionEvent.ACTION_MOVE事件,
* 其间隔的时间有机子的硬件和你滑动的速度来决定(还有待商议)
* 我们会记录此时的X,Y的坐标,很明显我们可以用此时的X,Y和MotionEvent.ACTION_DOWN按下的进行比较,
* 看是X方向变化大,还是Y方向变化大,并且在每次MotionEvent.ACTION_MOVE的最后,我们要把新的X,Y坐标赋值给旧的X,Y坐标,
*
* 如果是X方向变化大:并且新的X坐标大于旧的X坐标,那就是向右边移动:如果是新的X坐标小于旧的X坐标,那肯定是向左边移动
* 如果是Y方向变化大:并且新的Y坐标大于旧的Y坐标,那么就想下加速,否则不做处理(因为不可能向上移动)
* 那有一个重要的问题是:怎么处理用户滑动了多少?我们可以定义一个在X方向的增加量addX,把每次X方向的改变量加到上面去,
* 并且如果大于了一个方块,我们就让了移动一个方块。
* 然后当我们滑屏完毕后,会触发一个MotionEvent.ACTION_UP事件,此时我们依然可以记录它的X,Y坐标,
* 如果和刚按下的坐标的X,Y的差都很小,假如小于10像素,我们可以认为是用户点击了屏幕,然后让方块变换。
*/
以下为代码:
* 当用户每次触摸时,会产生多个MotionEvent事件
* 其中包含1个 ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
* 以下我以我做的一个大家熟知的俄罗斯方块为例,它通常有左移动,右移动,下加速,和变换。
*
* 通常我们在按下的时候记录按下的X,Y坐标,这个事件会在一次触屏的过程中触发一次
* 然后在我们滑动的过程中,会触发很多次MotionEvent.ACTION_MOVE事件,
* 其间隔的时间有机子的硬件和你滑动的速度来决定(还有待商议)
* 我们会记录此时的X,Y的坐标,很明显我们可以用此时的X,Y和MotionEvent.ACTION_DOWN按下的进行比较,
* 看是X方向变化大,还是Y方向变化大,并且在每次MotionEvent.ACTION_MOVE的最后,我们要把新的X,Y坐标赋值给旧的X,Y坐标,
*
float xChange = Math.abs(newx - oldx); float yChange = Math.abs(newy - oldy);
* 如果是X方向变化大:并且新的X坐标大于旧的X坐标,那就是向右边移动:如果是新的X坐标小于旧的X坐标,那肯定是向左边移动
* 如果是Y方向变化大:并且新的Y坐标大于旧的Y坐标,那么就想下加速,否则不做处理(因为不可能向上移动)
* 那有一个重要的问题是:怎么处理用户滑动了多少?我们可以定义一个在X方向的增加量addX,把每次X方向的改变量加到上面去,
* 并且如果大于了一个方块,我们就让了移动一个方块。
* 然后当我们滑屏完毕后,会触发一个MotionEvent.ACTION_UP事件,此时我们依然可以记录它的X,Y坐标,
* 如果和刚按下的坐标的X,Y的差都很小,假如小于10像素,我们可以认为是用户点击了屏幕,然后让方块变换。
*/
以下为代码:
float xDown = 0, yDown = 0, xUp = 0, yUp = 0; //分别是:在按下、离开屏幕的X、Y坐标 float oldx,oldy,newx,newy; //连续2个ACTION_MOVE之间的X、Y坐标,第一次是相同的,第二次开始就不一样了。 float addx = 0, addy = 0; //连续2个ACTION_MOVE之间的X、Y坐标的增量。 boolean canDown; //用来消除第一次向下移动太多而作用于第二个方块的下降 public boolean onTouchEvent(MotionEvent me) { if (me.getAction() == MotionEvent.ACTION_DOWN) { xDown = me.getX(); yDown = me.getY(); oldx = me.getX(); oldy = me.getY(); canDown = true; } else if (me.getAction() == MotionEvent.ACTION_MOVE) { newx = me.getX(); newy = me.getY(); float xChange = Math.abs(newx - oldx); float yChange = Math.abs(newy - oldy); if (xChange >= yChange ) { //x方向上移动 addx += xChange; if (newx > oldx && addx >= TetrisUtil.BLOCK_SIZE) { for (int i = TetrisUtil.BLOCK_SIZE; i <= addx;) { right(); postInvalidate(); addx -= TetrisUtil.BLOCK_SIZE; } }else if(newx < oldx && addx >= TetrisUtil.BLOCK_SIZE){ for (int i = TetrisUtil.BLOCK_SIZE; i <= addx;) { left(); postInvalidate(); addx -= TetrisUtil.BLOCK_SIZE; } } }else if (canDown && xChange < yChange && newy > oldy){ //y方向上移动 addy += yChange; if (addy >= TetrisUtil.BLOCK_SIZE) { for (int i = TetrisUtil.BLOCK_SIZE; i <= addy;) { down(); if (y == 0) { canDown = false; } postInvalidate(); addy -= TetrisUtil.BLOCK_SIZE; } } } oldx = newx; oldy = newy; } else if (me.getAction() == MotionEvent.ACTION_UP) { xUp = me.getX(); yUp = me.getY(); if (Math.abs(xUp - xDown) <= TetrisUtil.BLOCK_SIZE && Math.abs(yUp - yDown) <= TetrisUtil.BLOCK_SIZE) { turn(); //变换 postInvalidate(); //刷新 } } return true; }
相关文章推荐
- android手势操作滑动效果触摸屏事件处理
- android onTouchEvent 左右手势滑动事件处理
- android手势操作滑动效果触摸屏事件处理
- Android平台的事件处理机制和手指滑动例子
- Android实现手势滑动的事件处理方法
- Android平台的事件处理机制和手指滑动例子
- android onTouchEvent 左右手势滑动事件处理
- Android处理滑动与点击事件的冲突
- android onTouchEvent 左右手势滑动事件处理
- Android 屏幕滑动事件
- Android 屏幕滑动事件
- Android平台的事件处理机制和手指滑动例子
- Android手势识别——上下左右滑动、屏幕上下左右中区域处理
- android 滑动事件冲突解决 Touch事件处理机制
- 菜鸟都能理解的Android中View的事件分发机制及滑动冲突处理
- Android:实现手势滑动的事件处理方法
- Android 滑动与点击事件冲突的处理
- android 屏幕触摸事件及处理机制解读
- Android的事件处理机制和滑动
- (Android) 单击屏幕事件和滑动屏幕事件共存的解决方案