編輯:關於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 app提供資源
您應該始終外部化應用資源,例如圖像和代碼中的字符串,這樣有利於您單獨維護這些資源。 此外,您還應該為特定設備配置提供備用資源,方法是將它們分組到專門命名的資源目錄中。 在
Embedded Android 協同翻譯
如果你有一定的Android的基礎和英語基礎, 有願意貢獻開源社區的心, 如果你對以下目錄感興趣, 歡迎加入我們協同翻譯《Embedded Android》 此次協同翻
android 彈性ScrollView(已優化)
想要的效果最近項目中想實現一個效果,效果如下:網上demo展示就是上滑或者下滑,能實現彈性效果,剛開始在網上找了好幾個demo,代碼大致如下:public class B
分別用ToolBar和自定義導航欄實現沉浸式狀態欄
一、ToolBar1、在build.gradle中添加依賴,例如:compile com.android.support:appcompat-v7:23.4.02、去掉應