Android上滑手势触发和不增长布局层级扩大点击区域

    最近项目中须要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,而后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但若是有对单独的View设置点击监听,在该View上的手势上滑会失效。ide

    若是这个View自己就是专门用于点击的,那并无什么问题,惋惜的是,这个View的尺寸不大,因此要求扩大点击区域。布局

    咱们首先能想到的方法就是用一个容器将该View包起来,相似RelativeLayout,LinearLayout等,但这样布局的层级就会再加多一层。编码

    咱们可否想到不用增长层级也能实现点击区域扩大的方法呢?spa

    GestureDetector是Android提供的手势操做类,它提供了单击,双击,长按等操做,而且会将这些事件传给onTouch,所以咱们能够利用这个来判断触发单击事件的究竟是哪一个控件。code

    可是咱们的问题是扩大点击区域,而不是识别控件,所以须要知道用户的点击动做究竟是落在哪一个区域。blog

    所幸,MotionEvent提供了事件发生时候的坐标,这样咱们就能知道单击时候的坐标,进一步肯定是否在指定的区域范围内。索引

    MotionEvent是Android中触控方面编码的一个相当重要的类,它提供了用户在屏幕上的触控信息。咱们能够经过MotionEvent获取到触控的事件类型,触控的坐标,而且如今已经支持多点触碰,还能进一步获取触控的索引信息。接口

    咱们先上代码:事件

 1     @Override
 2     public boolean onTouch(View v, MotionEvent event) {
 3         if(event.getAction() == MotionEvent.ACTION_DOWN){
 4             int downX = (int)event.getX();
 5             int[] location = new int[2];
 6             ivMore.getLocationInWindow(location);
 7             if(Math.abs(downX - location[0]) <= 50){
 8                  ...
 9             }
10         }
11         return gestureDetector.onTouchEvent(event);
12     }

    咱们先经过MotionEvent的getAction,获取到触控的事件类型,单击的类型为ACTION_DOWN,而后经过MotionEvent的getX获取到点击的x坐标,而后经过getLocationInWindow获取指定的View的坐标,这里指定该组件的x轴坐标正负50(表示左右范围)内为触发范围。get

    咱们如今能够不增长布局层级也能扩大点击范围了。

    利用GestureDetector实现上滑判断是很简单的,只要实现OnGestureListener接口,在对应的回调中进行咱们指定的操做,不过由于GestureDetector自己并不捕获触控事件,因此要再实现onTouch事件,并调用GestureDetector的onTouchEvent,将对应的事件传过去。

    滑动的操做是在onFling回调中进行的,该回调会传进两个历史记录的MotionEvent,咱们只要判断它们的Y轴坐标是否有变化便可。

    Android的触控是一个至关大的话题范围,咱们只要在明确本身需求的前提上,去寻找对应的快捷解决方案。

相关文章
相关标签/搜索