Android中onTouch與onClick事件的關係

來源:互聯網
上載者:User

標籤:

這幾天遇到點關於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 plaincopyprint? 
  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. }
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;        }     }        }

[java] view plaincopyprint? 
    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. }  

Android中onTouch與onClick事件的關係

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.