亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android觸摸屏事件派發機制View的一些事一些情

2019-11-09 17:52:23
字體:
來源:轉載
供稿:網友

1普通的控件,buttom,Textview。。。。

PRivate LinearLayout mLayout; private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLayout = (LinearLayout) this.findViewById(R.id.mylayout); mButton = (Button) this.findViewById(R.id.my_btn); mLayout.setOnTouchListener(this); mButton.setOnTouchListener(this); mLayout.setOnClickListener(this); mButton.setOnClickListener(this); } @Override public void onClick(View v) { Log.i("lyf", "OnClickListener--onClick--" + v); } //public static final int ACTION_DOWN = 0; //public static final int ACTION_UP = 1; //public static final int ACTION_MOVE = 2; @Override public boolean onTouch(View v, MotionEvent event) { Log.i("lyf", "OnTouchListener--onTouch-- action=" + event.getAction() + " --" + v); return false; }

情景1、可以看到我們onTouch方法返回false,不消費該事件,往下層傳遞。

I/lyf: OnTouchListener--onTouch-- action=0 --android.widget.Button I/lyf: OnTouchListener--onTouch-- action=2 --android.widget.ButtonI/lyf: OnTouchListener--onTouch-- action=2 --android.widget.ButtonI/lyf: OnTouchListener--onTouch-- action=2 --android.widget.ButtonI/lyf: OnTouchListener--onTouch-- action=2 --android.widget.Button I/lyf: OnTouchListener--onTouch-- action=1 --android.widget.ButtonI/lyf: OnClickListener--onClick--android.widget.Button

情景2、在onTouch方法返回true,消費該事件,不往下層傳遞了。onClick方法自然而然也沒有接收到信息了,至于為什么不傳遞到onClick方法里面,我們來看看源碼就知道了:

if (!mHasperformedLongPress) { // This is a tap, so remove the longpress check removeLongPressCallback(); // Only perform take click actions if we were in the pressed state if (!focusTaken) { // Use a Runnable and post this rather than calling // performClick directly. This lets other visual state // of the view update before click actions start. *if (mPerformClick == null) { mPerformClick = new PerformClick(); } if (!post(mPerformClick)) { performClick(); } }* }performClick()這個方法就是關于點擊事件的,而這個方法是在onTouchEvent方法里面,而 onTouch方法又優先于onTouchEvent方法,那再看看為什么onTouch優先于onTouchEvent吧! public boolean dispatchTouchEvent(MotionEvent event){ ... ... if(onFilterTouchEventForSecurity(event)){ ListenerInfo li = mListenerInfo; if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { return true; } if(onTouchEvent(event)){ return true; } } ... ... return false; }li.mOnTouchListener.onTouch()這個方法就在分發事件中調用, 為什么onTouch方法執行優先于onTouchEvent,跟蹤源碼:很明顯可以看到,事件的傳遞,會優先掉用mOnTouchListener.onTouch(this, event)這個方法,然后才能輪到onTouchEvent(event)獲取事件,順序如此,有什么可說。既然說到這里,我們也應該想起了onClick和onLongPressClic都是對onTouchEvent(event)的依賴,如果在setOnTouchListener.onTouch()的時候返回true,那么onTouchEvent方法不會被調用。同樣,內置諸如click事件的實現等等都基于onTouchEvent,假如onTouch返回true,這些事件將不會被觸發。因為有3個判斷滿足的情況下,就不會進入onTouchEvent了,只有不滿足的情況下才會進入。I/lyf: OnTouchListener--onTouch-- action=0 --android.widget.ButtonI/lyf: OnTouchListener--onTouch-- action=2 --android.widget.ButtonI/lyf: OnTouchListener--onTouch-- action=2 --android.widget.ButtonI/lyf: OnTouchListener--onTouch-- action=1 --android.widget.Button

最后,在這里總結一點,上面2個列子,onTouch-onClick,如果消費了,點擊就沒有效果了。

2自定義一個控件來實現dispatchTouchEvent(觸摸事件分發)、onTouchEvent(觸摸事件)、在Activity中實現onTouch方法和onClick方法。在這里我只是記錄一下事件分發的日志,以方便日后不用每次的測試一下。

情景1;

public class TestButton extends Button { ........................... @Override public boolean dispatchTouchEvent(MotionEvent event) { Log.i("lyf", "dispatchTouchEvent-- action=" + event.getAction()); return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { Log.i("lyf", "onTouchEvent-- action="+event.getAction()); return super.onTouchEvent(event); }}public class ListenerActivity extends Activity implements View.OnTouchListener, View.OnClickListener { ................................ @Override public boolean onTouch(View v, MotionEvent event) { Log.i("lyf", "OnTouchListener--onTouch-- action=" + event.getAction() + " --" + v); return false; } @Override public void onClick(View v) { Log.i("lyf", "OnClickListener--onClick--" + v); }}

結果: “ I/lyf: dispatchTouchEvent– action=0 I/lyf: onTouch– action=0 I/lyf: onTouchEvent– action=0 I/lyf: dispatchTouchEvent– action=2 I/lyf: onTouch– action=2 I/lyf: onTouchEvent– action=2 I/lyf: dispatchTouchEvent– action=1 I/lyf: onTouch– action=1 I/lyf: onTouchEvent– action=1 I/lyf: onClick–com.example.xiaolin.mytochuview.TestButton

可以看到事件分發由上車到下車,中途沒有乘客,哈哈,不知道這樣說對不對了!,寫到這里就不寫了,大家可以自行修改值,來看看結果,中途可以上車,也可以下車,。。最后,重點,返回值,@Overridepublic boolean dispatchTouchEvent(MotionEvent event) { Log.i("lyf", "dispatchTouchEvent-- action=" + event.getAction()); return true;}再看一下結果:

com.example.xiaolin.mytochuview I/lyf: dispatchTouchEvent– action=0 com.example.xiaolin.mytochuview I/lyf: dispatchTouchEvent– action=2 com.example.xiaolin.mytochuview I/lyf: dispatchTouchEvent– action=2 com.example.xiaolin.mytochuview I/lyf: dispatchTouchEvent– action=2 com.example.xiaolin.mytochuview I/lyf: dispatchTouchEvent– action=2 com.example.xiaolin.mytochuview I/lyf: dispatchTouchEvent– action=1 “` 返回值為true,不再往下傳遞了(消費了該事件),false(沒有消費該事件)!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美成人区| 91免费综合在线| 亚洲福利在线观看| 91视频8mav| 中文字幕亚洲二区| 97精品欧美一区二区三区| 最近2019年好看中文字幕视频| 精品亚洲va在线va天堂资源站| 亚洲激情 国产| 久久精品一区中文字幕| 91久久中文字幕| 中文欧美在线视频| 国产在线观看精品| 色妞在线综合亚洲欧美| 精品久久久久久久久久国产| 久久亚洲精品国产亚洲老地址| 久久久久久国产精品| 亚洲精品一区久久久久久| 国产丝袜视频一区| 国产性猛交xxxx免费看久久| 亚洲性69xxxbbb| 亚洲欧美综合图区| 国产精品日韩一区| 成人在线视频网站| 久久精品国产清自在天天线| 乱亲女秽乱长久久久| 在线视频欧美性高潮| 亚州成人av在线| 国产精品丝袜白浆摸在线| 欧美大片在线免费观看| 亚洲色图13p| 亚洲欧美日韩中文在线制服| 欧美大片免费观看在线观看网站推荐| 午夜精品久久久久久99热| 久久久久久久久久亚洲| 欧美最猛性xxxxx免费| 性色av一区二区三区红粉影视| 日韩成人激情视频| 97精品视频在线观看| 亚洲无线码在线一区观看| 精品国产一区二区三区久久久| 国产精品欧美风情| 精品久久香蕉国产线看观看gif| 欧美最猛性xxxx| 国产精品高潮呻吟久久av野狼| 亚洲国产精品va在线观看黑人| 久久国产精品网站| 国产精品久久久久999| 中文字幕精品在线视频| 亚洲国产成人久久综合| 久久这里只有精品视频首页| 亚洲午夜久久久影院| 国产日韩在线播放| 亚洲欧美中文字幕在线一区| 国产日韩在线视频| 国产精品久久久av久久久| 日韩经典中文字幕在线观看| 久久精品视频va| 日韩免费精品视频| 欧美高跟鞋交xxxxhd| 777国产偷窥盗摄精品视频| 91精品在线看| 91av视频在线播放| 日韩网站免费观看| 欧美性色19p| 中文字幕久热精品在线视频| 国产香蕉97碰碰久久人人| 国产免费一区二区三区在线观看| 久久精品免费电影| 色婷婷av一区二区三区久久| 亚洲国产天堂久久综合网| 最近2019免费中文字幕视频三| 91精品久久久久久| 亚洲国产日韩欧美在线图片| 国产精品视频在线播放| 欧美激情视频一区二区三区不卡| 欧美性xxxx18| 欧美视频中文在线看| 欧美成人免费全部观看天天性色| 国产成人aa精品一区在线播放| 国外视频精品毛片| 不卡av电影在线观看| 日韩av在线免费播放| 欧美成人午夜免费视在线看片| 国产精品99免视看9| 91九色国产在线| 亚洲欧美国产精品| 久操成人在线视频| 久久久人成影片一区二区三区观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩福利在线播放| 国产精品扒开腿做| 欧洲成人在线观看| 国产+人+亚洲| 欧美黄色www| 国产精品久久久久av免费| 日韩影视在线观看| 国产一区私人高清影院| 国产精品一区二区电影| 国产精品久久久久久久av电影| 国产成人福利视频| 日韩欧美在线一区| 亚洲男人天堂九九视频| 中文字幕精品一区二区精品| 国产精品视频网| 欧美有码在线观看视频| 日本最新高清不卡中文字幕| 自拍亚洲一区欧美另类| 国产成人精品一区二区在线| 久久免费高清视频| 日韩精品高清在线观看| 国产亚洲一区二区在线| 九九热最新视频//这里只有精品| 久久久久久久久久久国产| 在线看日韩av| 亚洲天堂第一页| 欧美日韩国产页| 久久精品99国产精品酒店日本| 欧洲一区二区视频| 精品欧美aⅴ在线网站| 日韩精品日韩在线观看| 亚洲男人天堂2024| 91精品免费久久久久久久久| 最近日韩中文字幕中文| 欧美性猛交xxxxx水多| 成人性生交大片免费观看嘿嘿视频| 色午夜这里只有精品| 日韩精品中文字幕在线观看| 国产欧美va欧美va香蕉在线| 久久成人精品电影| 中文字幕亚洲色图| 伊人久久免费视频| 亚洲欧美日韩在线高清直播| 国产99久久精品一区二区| 日韩欧美在线播放| 亚洲第一精品福利| 久操成人在线视频| 中文字幕不卡av| 国产成人精品综合| 91国产视频在线| 欧美精品18videosex性欧美| 激情懂色av一区av二区av| 一区二区三区视频在线| 久久久噜噜噜久久久| 久久亚洲精品成人| 国产精品久久久久久久天堂| 91亚洲国产成人精品性色| 亚洲va国产va天堂va久久| 日韩av在线免费观看| 久久中国妇女中文字幕| 亚洲一区中文字幕| 91探花福利精品国产自产在线| 国产999视频| 日韩精品高清在线观看| 亚洲性日韩精品一区二区| 欧美日韩国产在线看| 国产成人精品视频在线| 欧美成人中文字幕在线| 日韩国产欧美区| 成人网在线视频| 欧美成人免费一级人片100| 精品偷拍一区二区三区在线看| 日韩欧美成人精品| 亚洲欧美日韩在线高清直播|