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

小菜鸟战斗机 2018-3-27 462

通过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';
        }
    }


}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889

项目地址:https://github.com/sky-mxc/TouchEvent 
暂时就这些吧。哪里不对的地方,欢迎指正


最新回复 (0)
返回