您的位置:首页 > 移动开发 > Android开发

处理android屏幕滑动事件onTouchEvent

2013-05-18 21:18 239 查看
/**
* 当用户每次触摸时,会产生多个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 onTouchEvent