安卓触屏事件--对象,监听器,属性,行为,多点触摸,MoMotionEvent常用方法

1.触屏事件对象

是通过MotionEvent 对象进行封装的,常用的事件类型是定义在MotionEvent 中的常量。我们通过getActionMasked() 方法。

getAction()getActionMasked()
getAction()getActionMasked()都是用来获取事件的信息。
不同的是getAction()可以获得事件的指针ID和类型信息。
getActionMasked()只简单返回事件类型的信息,正如其名称,
它“屏蔽”了某些信息的返回,但我们可以通过getPointerIndex()在同一个事件中获取相应指针信息。
指针作用的实质是匹配事件到接触点的一种方式。
这两个方法返回值是一个位字段,即事件类型和指针信息包含在返回的
同一个整型数据中,安卓有定义可以提取它的信息。
举个例子:
getAction() 返回 0x0105.
getActionMasked() 返回 0x0005, 它包含了 0x0105 和 ACTION_MASK 信息。
1.ACTION_MASK的值为0xFF。它掩盖了以下措施。
    ACTION_DOWN 0, UP 1, MOVE 2
    ACTION_POINTER_DOWN 5, UP 6
2.ACTION_POINTER_ID_MASK的值是为0xFF00。它从以下已过时常量掩盖指针ID。
    ACTION_POINTER_1_DOWN 0x0005
    ACTION_POINTER_2_DOWN 0x0105
    ACTION_POINTER_3_DOWN 0x0205
    ...
那么有什么区别呢?在使用getAction()时,我们经常需要分离出返回值中的信息,
可通过getActionMasked()getActionIndex()
获取其中的信息,因此当它被分离,可能要较高的运行成本,
因为这两个独立的方法又被调用。另外touch API也存储了近期触摸事件历史信息,
所以返回的数据中可能包含更多的信息。

2.点击监听器(onClickListener)

使用view.performClick ()方法可以调用view的onClickListener监听器对象,当其有定义的时候。当指定的onClickListener()存在时,返回true.否则返回false。它会执行一切与点击有关的动作。

@Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        view.performClick();
        int actionType = motionEvent.getActionMasked();
        int index = motionEvent.getActionIndex();
        switch(actionType){
            case MotionEvent.ACTION_DOWN:
                ...
                return true;
            case MotionEvent.ACTION_MOVE:
                //由于ACTION_MOVE包含较多的信息,因此自定义一个方法专门处理该事件
                handleMove(motionEvent);
                return true;
            case MotionEvent.ACTION_UP:
                ...
                return true;
            case MotionEvent.ACTION_POINTER_DOWN:
                ...
                return true;
            case MotionEvent.ACTION_POINTER_UP:
                ...
                return true;
        }
        return false;
    }

3.MotionEvent属性

MotionEvent 通过动作代码和数值集合来叙述事件。动作代码指定状态改变,数值集描述座标和其他运动属性。
MotionEvent定义了一些常量来指示运动状态:ACTION_DOWN,ACTION_UP,ACTION_POINTER_DOWN,ACTION_POINTER_UP等等
ACTION_DOWN和ACTION_UP分别是屏幕上的第一个指针,和最后一个指针
而ACTION_POINTER_DOWN和ACTION_POINTER_UP则是其中后续加入或倒数退出的指针
另外在一个运动事件中每个指针出现的顺序是不一定连续的,指针ID是有指针第一次触及到屏幕时就分配的唯一的ID,而指针索引随着指针运动的变化而变化,它的范围是从0到MotionEvent.getPointerCount()-1之间,而且最后的一个指针索引都是0,比如第一个指针先触及到屏幕,系统分配给它的指针索引是0,第二个指针后触及到屏幕,系统分配给它的指针索引是1。当我们先把第一个指针从屏幕移开后,屏幕上只剩下第二根指针,这时第二根的指针就不再是1,而是0,指针索引会随着手指的按下和提起不断变化。

4.MotionEvent行为

事件通过实现onTouchListener接口监听触屏行为,View.OnTouchListener 的定义是在触摸事件调度到组件时调用回调接口,这个回调会在触摸到事件前被调用。onTouch()是当事件调度到组件时被调用,它允许监听器获得一个机会响应在触发目标组件之前。在onTouch()方法中通过View.performClick()方法调用View的OnTouchLishtener接口。

public boolean onTouch(View v,MotionEvent event){
    v.performClick();
    ...
}

onTouch函数返回值如果为true,则表示该事件已经被组件处理,不需要将这个事件分发给其他处理;如果返回false,则表示这个组件未处理,安卓应该将该事件分发给其它处理。

onTouch() vs onTouchEvent()
onTouch()需要两个参数(View v, MotionEvent e)可以在任何类中使用时,需要3个步骤:
1.实现onTouchListener接口 
2.这个类使用view.setOnTouchListener(foo)注册监听器 
3.重写onTouch()方法。
而onTouchEvent只需要一个参数(MotionEvent e),它需要在view类和其派生类中使用,使用它时比onTouch()少1和2两个步骤,
它是由安卓系统实现的,因此直接重写onTouchEvent()方法即可。
此外:onTouch()的优先级比onTouchEvent()的优先级更高,当onTouch返回false时才会把事件交付到onTouchEvent来处理。

5.多点触摸

在多点触摸情况下处理TOUCH_MOVE动作代码,因为你可能在单一事件中有多个指针,为了获取正确的指针ID,你需要遍历存在的指针,需使用下面的代码:

for(int i = 0; i < event.getPointerCount(); i++){
    int curPointerId = event.getPointerId(i);
}

历史点:对于ACTON_MOVE事件,不仅指针有一系列事件,同时从你最后调用方法以来也产生了更多的ACTION_MOVE事件。Android缓存了这期间onTouchEvent方法为ACTION_MOVE动作的后续调用发生的事件,为了获得这些事件,你必须使用下面的代码:

for(int j = 0; j < event.getHistorySize(); j++)
{
    for(int i = 0; i < event.getPointerCount(); i++)
    {
        int curPointerId = event.getPointerId(i);
         //   为了得到该事件的历史数据
        //    你必须使用getHistorical...方法
        int x = event.getHistoricalX(i, j);       
    }
}

MotionEvent中常用到的方法:

getPointerCount():返回MotionEvent中表示了多少手指数
getPointerId(int pointerIndex): 返回指针索引关联的指针ID
getY(int pointerIndex):返回指定指针索引的当前的Y座标位置
getX(int pointerIndex):返回指定指针索引的当前的X座标位置
getHistorySize():返回某根手指触摸事件的历史位置的记录数,发生在MotionEvent.ACTION_MOVE事件的一次移动的之间
getHistoricalX (int pointerIndex, int pos):返回指定指针索引的手指上一次的X座标位置,只针对移动事件。参数pos是指第几个旧位置,这个值不能超过getHistorySize()返回的值
getHistoricalY (int pointerIndex, int pos):返回指定指针索引的手指上一次的Y座标位置,只针对移动事件。参数pos是指第几个旧位置,这个值不能超过getHistorySize()返回的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章