標籤:android style blog color io ar strong sp div
這三個事件的調用順序是:
onTouch->onLongClick->onClick
先看這三個事件的處理函數:
- public boolean onTouch(View v, MotionEvent event);
- public boolean onLongClick(View v);
- public void onClick(View v);
看到三個函數的傳回值,只有onClick是void,而onTouch和onLongClick是boolean,原因是系統對這些事件的處理是有條件,必須滿足條件才會觸發相應的事件處理函數。
事件在事件鏈中進行傳遞,如果一級沒有處理,將向下一級傳遞,直到傳遍整個事件鏈。
onTouch如果返回true,則表明對該事件做了處理,不會繼續傳遞該事件在事件鏈中;onLongClick如果返回true,則表名對該事件做了處理,不會繼續傳遞該事件在事件鏈中。
如果希望View中onClick事件和onTouch事件並存,且這兩個事件在一個按鈕上分別觸發,則可以直接去掉onClick事件,直接在onTouch事件中細分,如果按下的位置和抬起的位置相同,即startX==lastX時,認為是onClick事件;代碼如下:
@Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:{ //記錄按下的點的X座標 startX = event.getRawX(); break; } case MotionEvent.ACTION_UP: //記錄抬起的點的X座標, 若兩次相等,觸發了點擊事件,否則是滑動事件 float LastX = event.getRawX(); if(startX == LastX){ Toast.makeText(getApplication(), "點擊了", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getApplication(), "滑動了", Toast.LENGTH_SHORT).show(); } break; case MotionEvent.ACTION_MOVE:{ break; } } return false; }
Android View的onTouch和onClick和onLongClick事件