Android 之手势识别

终于进入到公司了,目前在做一个播放器的lib,需要用到手势识别,以前学过,但是忘得差不多了,现在再学习下,做个总结

在每个应用运行时,用户每次按下触摸屏幕在这个位置的view都会产生MotionEvent事件,该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象。通过创建GestureDetector(手势识别)对象 ,然后用它的onTouchEvent可以转发这个MotionEvent对象至OnGestureListener,从而会触发一系列事件,调用一谢方法。
现在来做个测试,这个测试的大概情况是这样的,有一个textview,当我们左滑时,它上面的数字减少,右滑时数字增加。
来看代码:

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private LinearLayout relativeLayout;
    private GestureDetector gestureDetector;
    private int progess=3306;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.test);
        relativeLayout = (LinearLayout) findViewById(R.id.relativeLayout);
        gestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                if (distanceX>0){
                    progess--;
                }else {
                    progess++;
                }
                textView.setText(""+progess);
                return super.onScroll(e1, e2, distanceX, distanceY);
            }
        });
        relativeLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                boolean bool =  gestureDetector.onTouchEvent(motionEvent);
                return true;

            }
        });
//        relativeLayout.setLongClickable(true);
    }
}

可以看到,第一步,初始化view;
第二步,创建gestureDetector对象,并且重写它的监听事件中的onScroll方法,当左滑时减少,右滑时增加。
第三步,将relativeLayout的触发事件传递给gestureDetector。
这就可以达到我们想要的结果了。

在gestureDetector重写的事件中,

按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。

抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。

长按(onLongPress): 手指按在持续一段时间,并且没有松开。

滚动(onScroll): 手指在触摸屏上滑动。

按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。

抬起(onSingleTapUp):手指离开触摸屏的那一刹那。

任何手势动作都会先执行一次按下(onDown)动作。
长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。
按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。
长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。

在这儿有个问题,就是gestureDetector.onTouchEvent(motionEvent)返回的是false;
然后若在onTouch事件里将它的返回值直接return,是达不到效果的,就是滑动的时候数据不会变化,但是,在后面加这一句话时 relativeLayout.setLongClickable(true);就能达到效果了,所以要么return true;即按照上面的方法;要么

        relativeLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return gestureDetector.onTouchEvent(motionEvent);

            }
        });
        relativeLayout.setLongClickable(true);

这个不是太懂,望看懂的大神指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值