這幾天遇到點關于Android的觸摸事件相關的,還跟onClick有關,暫且記下:
LinearLayout分別設置了onTouchListener,onClickListener,onLongClickListener及onTouchEvent回調
1、在屏幕上觸摸之后基本的執行流程如下:
onTouch,action=0onTouchEvent,action=0onTouch,action=2onTouchEvent,action=2onTouch,action=2onTouchEvent,action=2onTouch,action=1onTouchEvent,action=1onClick
也就是先說onTouchListener是最先被觸發的,然后是本身的onTouchEvent回調;當最后的up事件發生并被onTouchEvent處理后才會觸發onClickListener。
2、把onTouchEvent回調中的super.onTouchEvent去除,直接返回true;則流程如下:
onTouch,action=0onTouchEvent,action=0onTouch,action=2onTouchEvent,action=2onTouch,action=2onTouchEvent,action=2onTouch,action=1onTouchEvent,action=1
可以看到onClickListener永遠無法被觸發,也側面說明了對onClick的觸發是在onTouchEvent回調中來實現的。
3、長按屏幕,流程如下:
onTouch,action=0onTouchEvent,action=0onTouch,action=2onTouchEvent,action=2onTouch,action=2onTouchEvent,action=2onLongClickonTouch,action=2onTouchEvent,action=2onTouch,action=2onTouchEvent,action=2onTouch,action=1onTouchEvent,action=1onClick
當長按的時候,無需到up就會觸發onLongClick的響應,但之后也會繼續觸發onClick的響應。
4、但如果在onLongClick中返回true,則流程如下,即只在中間觸發了onLongClick,之后會繼續響應touch,但當up的時候就不會再觸發onClick
onTouch,action=0onTouchEvent,action=0onTouch,action=2onTouchEvent,action=2onTouch,action=2onTouchEvent,action=2onLongClickonTouch,action=2onTouchEvent,action=2onTouch,action=2onTouchEvent,action=2onTouch,action=1onTouchEvent,action=1
測試代碼如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout frame = (FrameLayout)findViewById(R.id.container); LinearLayoutTest line = new LinearLayoutTest(this); line.setOnClickListener(new ClickListener()); line.setOnLongClickListener(new LongClickListener()); line.setOnTouchListener(new TouchListener()); line.setLongClickable(true); frame.addView(line); } public class ClickListener implements OnClickListener { @Override public void onClick(View v) { Log.e("test","onClick"); } } public class LongClickListener implements OnLongClickListener{ @Override public boolean onLongClick(View v) { Log.e("test","onLongClick"); return true; } } public class TouchListener implements OnTouchListener{ @Override public boolean onTouch(View v, MotionEvent event) { Log.e("test","onTouch,action="+event.getAction()); return false; } } }public class LinearLayoutTest extends LinearLayout{ public LinearLayoutTest(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent event) { Log.e("test","onTouchEvent,action="+event.getAction()); return super.onTouchEvent(event); }}以上這篇詳談Android中onTouch與onClick事件的關系(必看)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。
新聞熱點
疑難解答