手势滑动识别

需求:判断是向左滑动还是向右滑动

package com.jiangtea.gesturedemo;
import android.os.Bundle;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector.SimpleOnGestureListener;

public class MainActivity extends AppCompatActivity {

    protected static final String TAG = "MainActivity";
    //private GestureDetector mDetector; //已过时
    private GestureDetectorCompat mDetector; //v4包的类,能支持更低的版本
    //滑动事件的最小滑动距离
    private float FLING_DISTANCE_MIN;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 手势监听器 SimpleOnGestureListener
        mDetector = new GestureDetectorCompat(this, mListener);
        //获取屏幕宽信息
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = metrics.widthPixels;//屏幕宽
        FLING_DISTANCE_MIN = screenWidth / 4;
        //屏幕宽的1/4为滑动最小距离
        Log.d(TAG, "FLING_DISTANCE_MIN = " + FLING_DISTANCE_MIN);
        //另一种获取屏幕宽高的方法
        //getWindowManager().getDefaultDisplay().getWidth();
    }

    // 监听触摸事件
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 手动调用监听器的onTouchEvent
        mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    // 手势监听器
    private OnGestureListener mListener = new SimpleOnGestureListener() {
        // 滑动事件,内部自己做了一些判断,滑动距离过小则不会回调
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            // (MotionEvent e1 按下的位置信息, MotionEvent e2 手指抬起的位置信息, floatvelocityX x轴方向上的滑动速度
            // x与rawX的区别,x是相对于控件父节点的坐标,rawX是相对于手机屏幕的坐标
            float x1 = e1.getRawX();
            float y1 = e1.getRawY();
            float x2 = e2.getRawX();
            float y2 = e2.getRawY();
            Log.d(TAG, "onFling(), e1(" + x1 + "," + y1 + "), e2(" + x2 + ","+ y2 + ")");
            //计算滑动距离
            float offsetX = Math.abs(x2 - x1);
            float offsetY = Math.abs(y2 - y1);

            if (offsetX < FLING_DISTANCE_MIN) {
                Log.w(TAG, "滑动距离太小,不处理!");
                return false;
            }

            if (offsetY > offsetX) {
                Log.w(TAG, "滑动倾斜度太大,不处理!");
                return false;
            }

            //判断滑动方向
            if (x2 > x1) {
                //向右滑动
                Log.d(TAG, "向右滑动");
            }else{
                //向左滑动
                Log.d(TAG, "向左滑动");
            }
            return false;
        }
    };
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值