編輯:關於Android編程
Hi,大家好,今天給大家分享一下Android中onInterceptTouchEvent與onTouchEvent,,記得樓主以前剛開始找工作的時候,被人問了關於Android中事件傳遞,當時還是菜鳥一枚,當然答不上來,被人無情的BS了。好了言歸正傳講重點.
onInterceptTouchEvent:
onInterceptTouchEvent是在ViewGroup裡面定義的。Android中的layout布局類一般都是繼承此類的。onInterceptTouchEvent是用於攔截手勢事件的,每個手勢事件都會先調用onInterceptTouchEvent。
onTouchEvent:
onTouchEvent同樣也是在view中定義的一個方法。處理傳遞到view 的手勢事件。手勢事件類型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件。
其中Layout裡的onInterceptTouchEvent默認返回值是false,這樣touch事件會傳遞到View控件,Layout裡的onTouch默認返回值是false, View裡的onTouch默認返回值是true,當我們手指點擊屏幕時候,先調用ACTION_DOWN事件,當onTouch裡返回值是true的時候,onTouch回繼續調用ACTION_UP事件,如果onTouch裡返回值是false,那麼onTouch只會調用ACTION_DOWN而不調用ACTION_UP.
為了讓當家更容易理解我寫了一個簡單的Demo.自定義了Layout與View,Android工程目錄如下:
新建一個MyLayout.Java代碼如下:
packagecom.tutor.touch; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.MotionEvent; importandroid.widget.FrameLayout; publicclassMyLayoutextendsFrameLayout{ publicMyLayout(Contextcontext){ super(context); } publicMyLayout(Contextcontext,AttributeSetattrs){ super(context,attrs); //TODOAuto-generatedconstructorstub } @Override publicbooleanonInterceptTouchEvent(MotionEventev){ Log.e(TouchDemoActivity.TAG,"MyLayoutonInterceptTouchEvent."); Log.e(TouchDemoActivity.TAG,"MyLayoutonInterceptTouchEventdefaultreturn" +super.onInterceptTouchEvent(ev)); returnsuper.onInterceptTouchEvent(ev); } @Override publicbooleanonTouchEvent(MotionEventevent){ Log.e(TouchDemoActivity.TAG,"MyLayoutonTouchEvent."); Log.e(TouchDemoActivity.TAG,"MyLayoutonTouchEventdefaultreturn" +super.onTouchEvent(event)); returnsuper.onTouchEvent(event); } }
然後新建一個MyView.java代碼如下:
packagecom.tutor.touch; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.MotionEvent; importandroid.widget.Button; publicclassMyViewextendsButton{ publicMyView(Contextcontext){ super(context); } publicMyView(Contextcontext,AttributeSetattrs){ super(context,attrs); } @Override publicbooleanonTouchEvent(MotionEventevent){ Log.e(TouchDemoActivity.TAG,"MyViewonTouchEvent."); Log.e(TouchDemoActivity.TAG,"MyViewonTouchEventdefaultreturn" +super.onTouchEvent(event)); returnsuper.onTouchEvent(event); } }
其中TouchDemoActivity代碼如下:
packagecom.tutor.touch; importandroid.app.Activity; importandroid.os.Bundle; publicclassTouchDemoActivityextendsActivity{ publicstaticfinalStringTAG="TouchDemoActivity"; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
上面所有的布局文件main.xml代碼如下
android:layout_height="fill_parent" > android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello"/>
運行上述Android工程效果如下:
點擊紅色區域,觸發了MyView裡的onTouch事件查看logcat,如下圖:
點擊綠色區域,則觸發了MyLayout裡的onTouch事件,查看logcat,如下圖:
上面倆個截圖都是用系統默認值,可以得出結論:onInterceptTouchEvent默認返回值是false,MyLayout裡onTouchEvent默認返回值是false,所以只消費了ACTION_DOWN事件,MyView裡onTouch默認返回值是true,調用了倆次:ACTION_DOW,ACTION_UP。
下面我們把MyLayout.java裡的onInterceptTouchEvent的return值修改為true,代碼如下:
@Override publicbooleanonInterceptTouchEvent(MotionEventev){ Log.e(TouchDemoActivity.TAG,"MyLayoutonInterceptTouchEvent."); Log.e(TouchDemoActivity.TAG,"MyLayoutonInterceptTouchEventdefaultreturn" +super.onInterceptTouchEvent(ev)); returntrue; }運行工程,繼續點擊紅色區域,查看logcat,發現MyView的onTouch事件沒有被調用,也就是被攔截了如下圖所示:
@Override publicbooleanonTouchEvent(MotionEventevent){ Log.e(TouchDemoActivity.TAG,"MyViewonTouchEvent."); Log.e(TouchDemoActivity.TAG,"MyViewonTouchEventdefaultreturn" +super.onTouchEvent(event)); returnfalse; }運行工程,繼續點擊紅色區域,查看logcat,如下圖:
根據上圖,我們可以看出MyView裡的OnTouchEvent只消費了一次點擊事件也就是ACTION_DOWN,還沒有執行ACTION_UP,然後跑到MyLayout裡又去執行了OnTouchEvent事件。
所以根據上面的內容總結如下:
ViewGroup裡的onInterceptTouchEvent默認值是false這樣才能把事件傳給View裡的onTouchEvent.
ViewGroup裡的onTouchEvent默認值是false。
View裡的onTouchEvent返回默認值是true.這樣才能執行多次touch事件。
好了以上就是今天分享的內容,謝謝大家!大家有什麼不明白的,請留言!!!另外文章標題倆分鐘只是個虛頭,如果你超過倆分鐘才明白,不要噴我啊,哈哈哈!!!
您應該始終外部化應用資源,例如圖像和代碼中的字符串,這樣有利於您單獨維護這些資源。 此外,您還應該為特定設備配置提供備用資源,方法是將它們分組到專門命名的資源目錄中。 在
如果你有一定的Android的基礎和英語基礎, 有願意貢獻開源社區的心, 如果你對以下目錄感興趣, 歡迎加入我們協同翻譯《Embedded Android》 此次協同翻
想要的效果最近項目中想實現一個效果,效果如下:網上demo展示就是上滑或者下滑,能實現彈性效果,剛開始在網上找了好幾個demo,代碼大致如下:public class B
一、ToolBar1、在build.gradle中添加依賴,例如:compile com.android.support:appcompat-v7:23.4.02、去掉應