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

通过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
暂时就这些吧。哪里不对的地方,欢迎指正

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佛系编码i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值