Gestures(手势)

1、基本的手势事件主要有如下三个方法:
dispatchTouchEvent : 判断该事件是否需要下发。返回true表示需要下发给下级视图,返回false表示不需要下发(交给自身的onTouchEvent处理)。但是否最终下发,还需根据onInterceptTouchEvent的拦截结果。
onInterceptTouchEvent : 判断当前容器是否需要拦截该事件。返回true表示予以拦截(交给自身的onTouchEvent处理)、不放给下级视图,返回false表示不拦截该事件。
onTouchEvent : 判断该事件是否处理完毕。返回true表示处理完毕,则无需处理上级视图的onTouchEvent,一路返回结束流程。返回false表示该事件未完成,则返回继续处理上级视图的onTouchEvent,然后再根据上级onTouchEvent的返回值判断是直接结束还是由再上级处理。

2、手势方法的执行者

页面类:包括Activity及Activity的派生类。页面类可操作dispatchTouchEvent和onTouchEvent。注意Fragment不能操作基本手势方法,只能通过实现OnTouchListener接口来响应手势事件。

控件类:包括从View类派生出的各类控件,包括TextView、ImageView、Button等及它们的派生类。控件类可操作dispatchTouchEvent和onTouchEvent。

容器类:包括从ViewGroup类派生出的各类容器,如三个布局LinearLayout、RelativeLayout、FrameLayout,以及AdapterView派生出来的GridView、ListView、Spinner,还有ViewPager、ViewFlipper等等。容器类可操作dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。

上面可以看出,只有容器类才能操作onInterceptTouchEvent方法,这是因为该方法用于拦截发往下层视图的事件,而控件类已经位于底层只有被拦截的份没有拦截别人的份,同样页面类本身并不拥有下层视图。

3、手势事件的生命周期

控件响应
Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回true)->ViewGroup.onInterceptTouchEvent(返回false)->View.dispatchTouchEvent(返回true)->View.onTouchEvent(返回true)->结束

容器响应
方式一:Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回false)->ViewGroup.onTouchEvent(返回true)->结束

方式二:Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回true)->ViewGroup.onInterceptTouchEvent(返回true)->ViewGroup.onTouchEvent(返回true)->结束

方式三:Activity.dispatchTouchEvent(返回true)->ViewGroup.dispatchTouchEvent(返回true)->ViewGroup.onInterceptTouchEvent(返回false)->View.dispatchTouchEvent(返回true或false)->View.onTouchEvent(返回false)->ViewGroup.onTouchEvent(返回true)->结束

Activity响应
Activity.dispatchTouchEvent(返回false)->Activity.onTouchEvent(返回true)->结束

TouchEvent

4、下面是触摸事件的常用方法:
getAction : 获取当前的动作
getX : 获取当前在控件内部的相对坐标X
getY : 获取当前在控件内部的相对坐标Y
getRawX : 获取当前在屏幕上的相对坐标X
getRawY : 获取当前在屏幕上的相对坐标Y
getEventTime : 获取当前的事件时间



一、Android中手势交互的执行顺序
1.手指触碰屏幕时,触发MotionEvent事件!
2.该事件被OnTouchListener监听,可在它的onTouch()方法中获得该MotionEvent对象!
3.通过GestureDetector转发MotionEvent对象给OnGestureListener
4.我们可以通过OnGestureListener获得该对象,然后获取相关信息,以及做相关处理!

我们来看下上述的三个类都是干嘛的: MotionEvent: 这个类用于封装手势、触摸笔、轨迹球等等的动作事件。 其内部封装了两个重要的属性X和Y,这两个属性分别用于记录横轴和纵轴的坐标。 GestureDetector: 识别各种手势。OnGestureListener: 这是一个手势交互的监听接口,其中提供了多个抽象方法, 并根据GestureDetector的手势识别结果调用相对应的方法。

二、GestureListener详解:

1、GestureListener 他给我们提供了下述的回调方法:
按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。

2、知道了GestureListener的相关方法后,实现手势检测也很简单,步骤如下:
Step 1: 创建GestureDetector对象,创建时需实现GestureListener传入
Step 2: 将Activity或者特定组件上的TouchEvent的事件交给GestureDetector处理即可! 我们写个简单的代码来验证这个流程,即重写对应的方法:

代码如下:

public class MainActivity extends AppCompatActivity { 
    private MyGestureListener mgListener;
    private GestureDetector mDetector;
    private final static String TAG = "MyGesture"; 

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

          //实例化GestureListener与GestureDetector对象
          mgListener = new MyGestureListener();
          mDetector = new GestureDetector(this, mgListener); 
    } 

    @Override
     public boolean onTouchEvent(MotionEvent event) {
         return mDetector.onTouchEvent(event); 
    } 

    //自定义一个GestureListener,这个是View类下的
    private class MyGestureListener implements GestureDetector.OnGestureListener {...}

}

3、SimpleOnGestureListener来实现吧:

 //自定义一个GestureListener,这个是View类下的
 private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { 

    @Override
     public boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) { 
        if(e1.getY() - e2.getY() > MIN_MOVE){ 
            startActivity(new Intent(MainActivity.this, MainActivity.class)); 
            Toast.makeText(MainActivity.this, "通过手势启动Activity", Toast.LENGTH_SHORT).show(); 

        }else if(e1.getY() - e2.getY() < MIN_MOVE){ 
            finish(); 
            Toast.makeText(MainActivity.this,"通过手势关闭Activity",Toast.LENGTH_SHORT).show(); 
        } 
        return true;
        } 
}

三、手势添加与识别:
四个加载手势库的静态方法:

Gestures(手势)_第1张图片

相关方法:
1、public void addGesture (String entryName, Gesture gesture):添加一个名为entryName的手势
2、public Set getGestureEntries ():获得手势库中所有手势的名称
3、public ArrayList getGestures (String entryName):获得entryName名称对应的全部手势
4、public ArrayList recognize (Gesture gesture): 从当前手势库中识别与gesture匹配的全部手势
5、public void removeEntry (String entryName):删除手势库中entryName名称对应的手势
6、public void removeGesture (String entryName, Gesture gesture):删除手势库中entryName和gesture都匹配的手势
7、public abstract boolean save ():想手势库中添加手势或从中删除手势后调用该方法保存手势库

GestureOverlayView手势编辑组件:
Android为GestureOverlayView提供了三种监听器接口,如下,一般常用的是:OnGesturePerformedListener;用于手势完成时提供响应!

你可能感兴趣的:(Gestures(手势))