Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中onInterceptTouchEvent與onTouchEvent

Android中onInterceptTouchEvent與onTouchEvent

編輯:關於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事件。

好了以上就是今天分享的內容,謝謝大家!大家有什麼不明白的,請留言!!!另外文章標題倆分鐘只是個虛頭,如果你超過倆分鐘才明白,不要噴我啊,哈哈哈!!!


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved