处理android屏幕滑动事件onTouchEvent

/**
* 当用户每次触摸时,会产生多个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;
	}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值