Android View的onTouchEvent和OnTouch區別


還是以自定義的TestButton為例。

我們可以通過重寫onTouchEvent方法來處理諸如down move up的消息:

 

  1. public class TestButton extends Button {  
  2.   
  3.     public TestButton(Context context) {  
  4.         super(context);  
  5.         // TODO Auto-generated constructor stub  
  6.     }  
  7.       
  8.     public TestButton(Context context, AttributeSet attributeSet) {  
  9.         super(context, attributeSet);  
  10.         // TODO Auto-generated constructor stub  
  11.     }  
  12.       
  13.     @Override  
  14.     public boolean onTouchEvent(MotionEvent event) {  
  15.         boolean value = super.onTouchEvent(event);  
  16.         System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());  
  17.         return value;  
  18.     }  
public class TestButton extends Button {

	public TestButton(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
	
	public TestButton(Context context, AttributeSet attributeSet) {
		super(context, attributeSet);
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		boolean value = super.onTouchEvent(event);
		System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());
		return value;
	}

也可以通過實現OnTouchListener的接口,然后設置TestButton的onTouchListener可以達到同樣的目的

  1.   class OnTouchListenerTest implements View.OnTouchListener{  
  2. @Override  
  3. public boolean onTouch(View v, MotionEvent event) {  
  4.     return false;  
  5. }  
  6.       
  7.   }  
    class OnTouchListenerTest implements View.OnTouchListener{
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			return false;
		}
    	
    }
  1. TestButton b = (TestButton)findViewById(R.id.button);  
  2. OnTouchListenerTest listener = new OnTouchListenerTest();  
  3. b.setOnTouchListener(listener);  
        TestButton b = (TestButton)findViewById(R.id.button);
        OnTouchListenerTest listener = new OnTouchListenerTest();
        b.setOnTouchListener(listener);

但上述兩種監聽有什么區別呢?

 

先看一下Android源碼中對於View中dispatchTouchEvent的實現:

 

  1. public boolean dispatchTouchEvent(MotionEvent event){  
  2.     ... ...  
  3.     if(onFilterTouchEventForSecurity(event)){  
  4.         ListenerInfo li = mListenerInfo;  
  5.         if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED  
  6.             && li.mOnTouchListener.onTouch(this, event)) {  
  7.             return true;  
  8.         }  
  9.         if(onTouchEvent(event)){  
  10.             return true;  
  11.         }  
  12.     }  
  13.     ... ...  
  14.     return false;  
  15. }  
 
//源碼:
public boolean dispatchTouchEvent(MotionEvent event){ ... ... if(onFilterTouchEventForSecurity(event)){ ListenerInfo li = mListenerInfo; if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { return true; } if(onTouchEvent(event)){ return true; } } ... ... return false; }


可以看到onTouchListener的接口的優先級是要高於onTouchEvent的,假若onTouchListener中的onTouch方法返回true,

 

表示此次事件已經被消費了,那onTouchEvent是接收不到消息的。

因為Button的performClick是利用onTouchEvent實現,假若onTouchEvent沒有被調用到,那么Button的Click事件也無法響應。


綜合來講:

onTouchListener的onTouch方法優先級比onTouchEvent高,會先觸發。

假如onTouch方法返回false會接着觸發onTouchEvent,反之onTouchEvent方法不會被調用。

內置諸如click事件的實現等等都基於onTouchEvent,假如onTouch返回true,這些事件將不會被觸發。

 

 

 

//------------布局文件--------------------

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"

tools:context="myontouch.bwie.com.myontouch.MainActivity">

<myontouch.bwie.com.myontouch.TestButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點擊"
android:id="@+id/button"/>
</RelativeLayout>

//--------------自定義TextButton--------------------------

public class TestButton extends Button{
public TestButton(Context context, AttributeSet attrs) {
super(context, attrs);
}

public TestButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
boolean value = super.onTouchEvent(event);
System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());
Log.i("我是onTouchEvent","onTouchEvent");
return value;

}

}


//----------------主Activity-------------
public class MainActivity extends AppCompatActivity {

private TestButton button;

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

private void initView() {
button = (TestButton) findViewById(R.id.button);

OnTouchListenerTest listener = new OnTouchListenerTest();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("我是OnClickListener","OnClickListener");
}
});
button.setOnTouchListener(listener);

}



class OnTouchListenerTest implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("我是onTouch","onTouch");
return false;
}

}



//---------------下面是我的OnTouch 返回false 時,的打印----------

12-14 13:52:51.550 8752-8752/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 13:52:51.553 8752-8752/myontouch.bwie.com.myontouch I/System.out: super.onTouchEvent: true event: 0
12-14 13:52:51.554 8752-8752/myontouch.bwie.com.myontouch I/我是onTouchEvent: onTouchEvent
12-14 13:52:51.565 8752-8752/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 13:52:51.566 8752-8752/myontouch.bwie.com.myontouch I/System.out: super.onTouchEvent: true event: 2
12-14 13:52:51.566 8752-8752/myontouch.bwie.com.myontouch I/我是onTouchEvent: onTouchEvent
12-14 13:52:51.649 8752-8752/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 13:52:51.649 8752-8752/myontouch.bwie.com.myontouch I/System.out: super.onTouchEvent: true event: 1
12-14 13:52:51.649 8752-8752/myontouch.bwie.com.myontouch I/我是onTouchEvent: onTouchEvent
12-14 13:52:51.656 8752-8752/myontouch.bwie.com.myontouch I/我是OnClickListener: OnClickListener

 

 

//-------------------下面是 onTouch 返回 true時的打印-------------------------

12-14 14:03:33.399 19886-19886/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 14:03:33.415 19886-19886/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 14:03:33.429 19886-19886/myontouch.bwie.com.myontouch I/我是onTouch: onTouch


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM