Android中onTouch與onClick事件的關係

這幾天遇到點關於Android的觸摸事件相關的,還跟onClick有關,暫且記下:

LinearLayout分別設置了onTouchListener,onClickListener,onLongClickListener及onTouchEvent回調


1、在屏幕上觸摸之後基本的執行流程如下:

onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
onClick

也就是先說onTouchListener是最先被觸發的,然後是本身的onTouchEvent回調;當最後的up事件發生並被onTouchEvent處理後纔會觸發onClickListener。


2、把onTouchEvent回調中的super.onTouchEvent去除,直接返回true;則流程如下:

onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1

可以看到onClickListener永遠無法被觸發,也側面說明了對onClick的觸發是在onTouchEvent回調中來實現的。


3、長按屏幕,流程如下:

onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onLongClick
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
onClick


當長按的時候,無需到up就會觸發onLongClick的響應,但之後也會繼續觸發onClick的響應。


4、但如果在onLongClick中返回true,則流程如下,即只在中間觸發了onLongClick,之後會繼續響應touch,但當up的時候就不會再觸發onClick

onTouch,action=0

onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onLongClick
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1




測試代碼如下:

[java] view plain copy
  1. public class MainActivity extends Activity {  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.activity_main);  
  6.         FrameLayout frame = (FrameLayout)findViewById(R.id.container);  
  7.         LinearLayoutTest line = new LinearLayoutTest(this);  
  8.         line.setOnClickListener(new ClickListener());  
  9.         line.setOnLongClickListener(new LongClickListener());  
  10.         line.setOnTouchListener(new TouchListener());  
  11.         line.setLongClickable(true);  
  12.         frame.addView(line);  
  13.     }  
  14.     public class ClickListener implements OnClickListener {  
  15.         @Override  
  16.         public void onClick(View v) {  
  17.             Log.e("test","onClick");  
  18.         }  
  19.     }  
  20.     public class LongClickListener implements OnLongClickListener{  
  21.         @Override  
  22.         public boolean onLongClick(View v) {  
  23.             Log.e("test","onLongClick");  
  24.             return true;  
  25.         }  
  26.     }  
  27.     public class TouchListener implements OnTouchListener{  
  28.         @Override  
  29.         public boolean onTouch(View v, MotionEvent event) {  
  30.             Log.e("test","onTouch,action="+event.getAction());  
  31.             return false;  
  32.         }   
  33.     }          
  34. }  

[java] view plain copy
  1. public class LinearLayoutTest extends LinearLayout{  
  2.     public LinearLayoutTest(Context context) {  
  3.         super(context);  
  4.     }  
  5.     @Override  
  6.     public boolean onTouchEvent(MotionEvent event) {  
  7.         Log.e("test","onTouchEvent,action="+event.getAction());  
  8.         return super.onTouchEvent(event);  
  9.     }  
  10. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章