android多点触摸,手势处理

1.事件的监听方式

使用 onTouchEvent事件监听器或者使用 setOnTouchEventListener监听触摸事件

2.事件类型的判断

event.getAction()或者event.getActionMask(),注意,前者包含后者,后者判断起来比较精确

3.事件的生命周期  Action_DOWN(按下) ---> Action_MOVE(移动) --->Action_UP/Action_CANCELED(抬起手指或者滑出屏幕)

在一些事件,如Click,LongClick等事件按照该周期的时间长度和 移动位置来决定的

4.事件传递的3个阶段


第一阶段是  分发/拦截阶段 ondispatchEvent和onInteceptorEvent(一般在此阶段处理事件,可能导致事件无法传递)

第二阶段是 向下传递阶段 onTouchEvent


学过javascript的读者可能会发现,这种事件的传递和js的十分类似,不过少了一个阶段就是 目标View处理阶段,按照javascript的划分,

第一个阶段 捕获阶段(无论如何处理,事件总会传递到目标控件)

第二个阶段 目标控件事件处理阶段

第三个阶段 冒泡阶段(这个阶段处理事件的比较多,可终止冒泡)


很显然,android的事件传递阶段似乎很不友好,因为此阶段捕获导致很多处理冲突,甚至目标控件无法得到事件,比如ViewGroup拦截事件之后,将直接把事件交给自己的onTouchEvent进行处理,造成子View上的事件处理程序一直无法执行,很多时候由于这种事件分发问题导致的错误非常多,因此对于这种问题的处理要务必格外小心,如果遇到这种冲突,一般的做法是 2个联系密切的 View控件分别绑定事件,并调用getParent().requestDisallowInterceptTouchEvent(true),但这种方法也是由局限性的,希望有更好想法的读者指正一下。  


5.多点触摸事件的处理,对于多点触摸,可以使用

event.getPointersCount()或者触摸点的数量,然后通过 event.getX(index) ,event.getY(index)获得触摸点的坐标



public class MultiTouchActivity extends Activity
{

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

    public boolean onTouchEvent(MotionEvent event)
    {
    	//  ֻ2个手指
    	if(event.getPointerCount() == 2)
    	{
    		if(event.getAction() == MotionEvent.ACTION_MOVE)
    		{
    			int historySize = event.getHistorySize();
    			if(historySize == 0)
    				return true;
    			//第1个手指的Y坐标
    			float currentY1 = event.getY(0);
    			//第1个手指的历史纵坐标 
    			float historyY1 = event.getHistoricalY(0, historySize - 1);
    			//第二个手指的的Y坐标
    			float currentY2 = event.getY(1);
    			//第2个手指的历史纵坐标 
    			float historyY2 = event.getHistoricalY(1,historySize - 1);
    			
    			float distance =  Math.abs(currentY1 - currentY2);
    			float historyDistance = Math.abs(historyY1 - historyY2);
    			
    			if(distance > historyDistance)
    			{
    				Log.d("status", "放大");
    				
    			}
    			else if(distance < historyDistance)
    			{
    				Log.d("status", "缩小");
    			}
    			else
    			{
    				Log.d("status", "平行移动");
    			}
    				
    			
    			
    		}
    	}
    	return true;
    }


}





你可能感兴趣的:(android多点触摸,手势处理)