日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ontouchevent android,android onTouchEvent处理机制总结(必看)

發(fā)布時(shí)間:2024/9/27 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ontouchevent android,android onTouchEvent处理机制总结(必看) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

項(xiàng)目中總會(huì)用到一些觸摸事件,每次使用都是百度各種資料,看各種大神的分析筆記。這次我自己總結(jié)下關(guān)于觸摸事件的一些知識(shí)點(diǎn)。一來(lái)可以讓自己對(duì)觸摸事件印象更加深刻,也給以后的項(xiàng)目做一個(gè)參考。最難理解的其實(shí)是onTouchEvent方法。

一、 概述

1.只有view,ViewGroup,Activity 具有事件分發(fā)和消費(fèi)的功能。

2.Activity因?yàn)樯献钕冉佑|到觸摸事件,因此Activity沒(méi)有事件攔截方法。即沒(méi)有dispatchTouchEvent方法。

3.對(duì)于不能添加子控件的view,不能對(duì)事件進(jìn)行分發(fā)和攔截,它只有onTouchEvent事件。

二、三個(gè)方法

1.public boolean dispatchTouchEvent(MotionEvent ev)

當(dāng)觸摸事件發(fā)生的時(shí)候,首先會(huì)被當(dāng)前的activity進(jìn)行分發(fā),即當(dāng)前activity的dispatchTouchEvent方法會(huì)被執(zhí)行。

這個(gè)時(shí)候,該方法有三種返回的情況:

return false:表明事件不會(huì)被進(jìn)行分發(fā)。事件會(huì)以冒泡的方式被傳遞給上層的view或activity的onTouchEvent方法進(jìn)行消費(fèi)掉。

return true:表明該時(shí)間已經(jīng)被處理。事件會(huì)被當(dāng)前view或activity的dispatchTouchEvent給消費(fèi)掉。不會(huì)再進(jìn)行傳遞,事件到此結(jié)束。

return super.dispatchTouchEvent(ev):表明該事件將會(huì)被分發(fā)。此時(shí)當(dāng)前View的onIntercepterTouchEvent方法會(huì)捕獲該事件,判斷需不需要進(jìn)行事件的攔截。

2.public boolean onInterceptTouchEvent(MotionEvent ev)

該方法用戶攔截被傳遞過(guò)來(lái)的事件,用于判斷被傳遞過(guò)來(lái)的事件是否需要被當(dāng)前的view進(jìn)行處理。

return false :不對(duì)事件進(jìn)行攔截,放行該事件。事件會(huì)被傳遞到當(dāng)前view的子控件中,由子控件中的dispatchTouchEvent方法進(jìn)行分發(fā)處理。

return true : 攔截該事件,將該事件交給當(dāng)前view的onTouchEvent方法進(jìn)行處理。

return super.inInterceptTouchEvent(ev):默認(rèn)攔截方式,和return true一樣。該事件會(huì)被攔截,將該事件交給當(dāng)前view的onTouchEvent方法進(jìn)行處理。(這里需要有一點(diǎn)說(shuō)明,當(dāng)有兩個(gè)view。A view中有一個(gè)B view.點(diǎn)擊A.A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),則事件將會(huì)被A進(jìn)行攔截,交給A的onTouchEvent()進(jìn)行處理,如果點(diǎn)擊的是B,A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),則事件將不會(huì)被攔截,會(huì)被分發(fā)到子控件中)

3.public boolean onTouchEvent(MotionEvent event)

當(dāng)前的view把事件進(jìn)行了攔截,則事件則會(huì)被傳遞到該方法中

return false:表明沒(méi)有消費(fèi)該事件,事件將會(huì)以冒泡的方式一直被傳遞到上層的view或Activity中的onTouchEvent事件處理。如果最上層的view或Activity中的onTouchEvent還是返回false。則該事件將消失。接下來(lái)來(lái)的一系列事件都將會(huì)直接被上層的onTouchEvent方法捕獲

return true: 表明消費(fèi)了該事件,事件到此結(jié)束。

return super.onTouchEvent(event):默認(rèn)情況,和return false一樣。

驗(yàn)證:

MainActivity FatherView ChildView中幾個(gè)方法都返回super.****TouchEvent(ev)

分析:

1、當(dāng)點(diǎn)擊屏幕。MainActivity 中的dispatchTouchEvent方法先執(zhí)行,打印MainActivity-dispatchTouchEvent-->ACTION_DOWN

2、因?yàn)榉祷氐氖莝uper.dispatchTouchEvent(ev),所以事件ev將會(huì)被分發(fā),但是MainActivity中沒(méi)有onInterceptTouchEvent()方法,所以事件被傳遞到FatherView中的dispatchTouchEvent方法.打印FatherView-dispatchTouchEvent-->ACTION_DOWN

3、在FatherView中dispatchTouchEvent返回的是super.dispatchTouchEvent(ev),所有事件會(huì)被分發(fā)。FatherView中的onInterceptTouchEven()中的方法被執(zhí)行。打印FatherView-onInterceptTouchEven-->ACTION_DOWN

4、FatherView中的onInterceptTouchEven()返回的是super.onInterceptTouchEvent(ev)。在這里,(1)如果點(diǎn)擊的是屏幕中的ChildView。事件將不會(huì)被攔截,會(huì)被傳遞到ChildView中的dispatchTouchEvent方法中。(2)如果點(diǎn)擊的值FatherView則事件將會(huì)被攔截。FatherView中的onTouchEvent()方法將被執(zhí)行。以(1)為例,將打印ChildView-dispatchTouchEvent-->ACTION_DOWN。

5、ChildView中dispatchTouchEvent返回的是super.dispatchTouchEvent(ev),所有事件會(huì)被分發(fā)。打印ChildView-onInterceptTouchEvent-->ACTION_DOWN。

6、此時(shí)ChildView中onInterceptTouchEvent返回的是super.onInterceptTouchEvent(ev),,而且已經(jīng)沒(méi)有子控件了,所以事件將被攔截。打印ChildView-onTouchEvent-->ACTION_DOWN。

7、在childView中onTouchEvent()返回額是super.onTouchEvent(ev)。事件將不會(huì)被消耗,將以冒泡的方式傳遞到上層空間中的onTouchEvent(),此處上層空間中的onTouchEvent返回的都是super.onTouchEvent(ev)。所以講一次打印 Father-onTouchEvent-->ACTION_DOWN。 MainActivty-onTouchEvent-->ACTION_DOWN。

8、之后的事件動(dòng)作,將不再被MainActivity分發(fā)到子view,直接被MainActivty中的onTouchEvent處理消耗。打印MainActivity-dispatchTouchEvent-->ACTION_UP,MainActivty-onTouchEvent-->ACTION_UP

MainActivity-dispatchTouchEvent-->ACTION_DOWN

FatherView-dispatchTouchEvent-->ACTION_DOWN

FatherView-onInterceptTouchEven-->ACTION_DOWN

ChildView-dispatchTouchEvent-->ACTION_DOWN

ChildView-onInterceptTouchEvent-->ACTION_DOWN。

ChildView-onTouchEvent-->ACTION_DOWN

Father-onTouchEvent-->ACTION_DOWN。

MainActivty-onTouchEvent-->ACTION_DOWN

MainActivity-dispatchTouchEvent-->ACTION_UP,MainActivty-onTouchEvent-->ACTION_UP

MainActivity.java

public class MainActivity extends Activity {

private static final String TAG = "MainActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate( savedInstanceState);

setContentView(R.layout. activity_main);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

// TODO Auto-generated method stub

Log. i(TAG,"activity-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));

return super.onTouchEvent( event);

}

@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

Log. i(TAG,"activity-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));

return super.dispatchTouchEvent( ev);

}

FatherView.java

public class FatherView extends LinearLayout {

private static final String TAG = "MainActivity";

public FatherView(Context context) {

super( context);

}

@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

Log. i(TAG,"Father-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));

return super.dispatchTouchEvent( ev);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

Log. i(TAG,"Father-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));

return super.onInterceptTouchEvent( ev);

}

@Override

public boolean onTouchEvent(MotionEvent event ) {

Log. i(TAG,"Father-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));

return super.onTouchEvent( event);

}

}

ChildView.java

public class ChildView extends LinearLayout {

private static final String TAG = "MainActivity";

public ChildView(Context context) {

super( context);

}

@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

Log. i(TAG,"Child-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));

return super.dispatchTouchEvent( ev);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

Log. i(TAG,"Child-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));

return super.onInterceptTouchEvent( ev);

}

@Override

public boolean onTouchEvent(MotionEvent event ) {

Log. i(TAG,"Child-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));

return super.onTouchEvent( event);

}

}

activity_main.xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width= "match_parent"

android:layout_height= "match_parent"

tools:context="${relativePackage}.${activityClass}" >

android:layout_width= "match_parent"

android:layout_height= "match_parent"

android:background= "@android:color/holo_blue_dark"

android:gravity= "center" >

android:layout_width= "200dp"

android:layout_height= "200dp"

android:layout_gravity= "center"

android:background= "#0000ff" >

以上這篇android onTouchEvent處理機(jī)制總結(jié)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持編程小技巧。

總結(jié)

如果覺(jué)得編程之家網(wǎng)站內(nèi)容還不錯(cuò),歡迎將編程之家網(wǎng)站推薦給程序員好友。

本圖文內(nèi)容來(lái)源于網(wǎng)友網(wǎng)絡(luò)收集整理提供,作為學(xué)習(xí)參考使用,版權(quán)屬于原作者。

小編個(gè)人微信號(hào) jb51ccc

喜歡與人分享編程技術(shù)與工作經(jīng)驗(yàn),歡迎加入編程之家官方交流群!

總結(jié)

以上是生活随笔為你收集整理的ontouchevent android,android onTouchEvent处理机制总结(必看)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。