Android中一個控制項可以同時註冊多種事件,像一個Button,可以同時監聽觸摸事件、單擊事件、長按事件;在不同的情況下可以執行不同的操作,那麼是如何做到的呢?
首先,onTouch事件是最先發生的,該事件的返回值也決定了長按事件和單擊事件能否發生。觸屏操作由一些基本的事件組成:如down事件,up事件,move事件,scroll事件等等,經測試,各事件執行順序結果如下:
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "單擊事件", Toast.LENGTH_LONG).show(); }});button.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stub// Toast.makeText(MainActivity.this, "觸摸事件", Toast.LENGTH_LONG).show();switch (event.getAction()){ case MotionEvent.ACTION_DOWN:Toast.makeText(MainActivity.this, "down事件", Toast.LENGTH_SHORT).show();break; case MotionEvent.ACTION_UP:Toast.makeText(MainActivity.this, "up事件", Toast.LENGTH_SHORT).show();break; default:break;}return true; }});button.setOnLongClickListener(new View.OnLongClickListener(){ @Override public boolean onLongClick(View v) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "長點擊事件", Toast.LENGTH_LONG).show();return false; }}); }
1.預設情況下,onTouch和onLongClick都返回false;false的含義即為不消費該事件,事件可以傳下去。可能發生的操作:
(1)down--up--longClick--click; 觸摸事件--長按事件--單擊事件
(2)down--up--click; 觸摸事件--單擊事件
造成這兩種情況的原因是手指按下去停留時間的長短,如果長按了,就走(1);如果短暫點擊,就走(2).
2.onTouch事件返回true;true即為消費該事件,事件不在傳遞下去,不會發生單擊或長按事件。發生的操作:
down--up
3.onTouch返回false,onLongClick返回true。發生的操作:
(1)down--up--longClick 觸摸事件--長按事件
(2)down--up--click 觸摸事件--單擊事件
通過1與3比較,發現如果不手動改變onLongClick事件返回值,發生長按事件時,一定會導致單擊事件發生。
當然這隻是從表面理解onTouch事件,如果想更深入學習,請查看下面文章:點擊開啟連結