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

判断手指滑动方向 -- Android 学习之路

2016-08-19 22:35 447 查看

通过onTouchEvent 事件实现判断手指滑动方向

今天在做2048的时候遇到的一个知识点,这里做一下总结

用到的知识点

Android屏幕坐标系

常用的触发事件

判断滑动方向

获取手指触屏时的坐标

Android 屏幕坐标系

看张图 一目了然:



整个屏幕就是一个坐标系 ,左上角是 0.0 右下角是 X轴最大值和Y轴的最大值

常用的触屏事件

MotionEvent.ACTION_DOWN: 这个按下手指时触发的

MotionEvent.ACTION_MOVE: 移动时触发 ,我测试发现 按着不动也会触发

MotionEvent.ACTION_UP: 抬起时触发

MotionEvent.ACTION_CANCEL: 取消触发事件 这个系统 不会自动调用 由代码来执行

这里我只用到了按下(MotionEvent.ACTION_DOWN)抬起(MotionEvent.ACTION_UP)

判断滑动方向

先来看一张右划轨迹图



通过上面这个图可以看出滑动轨迹 ,我可以通过 比较 X轴和Y轴的移动距离 来判断是沿哪个轴移动的,哪个轴上的移动距离大就是沿哪个轴移动,拿上面这个右划动 示例:X轴的移动距离明显比Y轴大 ,所以得出是沿X轴移动 那么不是左划就是右划 ,那具体是左还是右呢,我可以让抬起时的X坐标减去 按下时的坐标 8-4 =4 是正数 那么就是 右划动 相反 负数就是左滑动

贴代码

package com.skymxc.demo.toucheventdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

private float downX ;    //按下时 的X坐标
private float downY ;    //按下时 的Y坐标
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

/**
* 触屏事件
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
String action = "";
//在触发时回去到起始坐标
float x= event.getX();
float y = event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//将按下时的坐标存储
downX = x;
downY = y;
Log.e("Tag","=======按下时X:"+x);
Log.e("Tag","=======按下时Y:"+y);
break;
case MotionEvent.ACTION_UP:
Log.e("Tag","=======抬起时X:"+x);
Log.e("Tag","=======抬起时Y:"+y);

//获取到距离差
float dx= x-downX;
float dy = y-downY;
//防止是按下也判断
if (Math.abs(dx)>8&&Math.abs(dy)>8) {
//通过距离差判断方向
int orientation = getOrientation(dx, dy);
switch (orientation) {
case 'r':
action = "右";
break;
case 'l':
action = "左";
break;
case 't':
action = "上";
break;
case 'b':
action = "下";
break;
}
Toast.makeText(MainActivity.this, "向" + action + "滑动", Toast.LENGTH_SHORT).show();
}
break;
}
return super.onTouchEvent(event);
}

/**
* 根据距离差判断 滑动方向
* @param dx X轴的距离差
* @param dy Y轴的距离差
* @return 滑动的方向
*/
private int getOrientation(float dx, float dy) {
Log.e("Tag","========X轴距离差:"+dx);
Log.e("Tag","========Y轴距离差:"+dy);
if (Math.abs(dx)>Math.abs(dy)){
//X轴移动
return dx>0?'r':'l';
}else{
//Y轴移动
return dy>0?'b':'t';
}
}

}


项目地址:https://github.com/sky-mxc/TouchEvent

暂时就这些吧。哪里不对的地方,欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: