




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么實現(xiàn)觸摸事件傳遞機制
這篇文章給大家介紹Android中怎么實現(xiàn)觸摸事件傳遞機制,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。一.觸摸事件的類型觸摸事件對應(yīng)的是MotionEvent類,事件類型主要有三種:ACTION_DOWN:用戶按下操作,表示一次觸摸事件的開始。ACTION_MOVE:在按下的情況下,進行移動。輕微的移動都會傳遞到該事件。ACTION_UP:用戶手指離開屏幕,表示一次觸摸事件的注:如果用戶僅僅的是點擊而已,則只會執(zhí)行到ACTION_DOWN和ACTION_UP兩個事件,不會執(zhí)行到ACTION_MOVE事件。所以ACTION_DOWN和ACTION_UP是事件是必須的。二.觸摸事件的傳遞階段1.分發(fā)(Dispatch)在Android系統(tǒng)中所有的觸摸事件都是由dispatchTouchEvent方法進行分發(fā)的。該方法中判斷事件是被消費(returntrue),還是繼續(xù)分發(fā)給子視圖處理(returnsuper.dispatchTouchEvent),如果當(dāng)前視圖是ViewGroup或者其子類,則會調(diào)用onInterceptTouchEvent判斷是否截攔。@Override
public
boolean
dispatchTouchEvent(MotionEvent
event)
{
return
super.dispatchTouchEvent(event);
}2.截攔(Intercept)事件的截攔InterceptTouchEvent只存在于ViewGroup及其子類,activity和View是不存在該方法。該方法判斷事件是被截攔(returntrue)并交給自身的OnToucEvent方法進行消費,還是繼續(xù)傳遞給子視圖(returnsuper.InterceptTouchEvent或者returnfalse)。@Override
public
boolean
onInterceptTouchEvent(MotionEvent
ev)
{
return
super.onInterceptTouchEvent(ev);
}3.消費(Consume)事件的消費通過OnTouchEvent方法判斷,是被消費(returntrue),還是不處理(returnfalse)并將事件傳遞給父視圖的OnTouchEvent方法進行處理。@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
return
super.onTouchEvent(event);
}所有擁有事件傳遞能力的類:Activity:擁有dispatchTouchEvent、OnTouchEventViewGroup:擁有dispatchTouchEvent、OnInterceptTouchEvent、OnTouchEventView:擁有dispatchTouchEvent、OnTouchEvent三、View的事件傳遞機制3.1dome雖然說ViewGroup是View的子類,但是這是說的View指的是除ViewGroup之外的View控件子類,首先定義一個MyTextView繼承TextView,打印每次事件的觸發(fā)以變了解事件傳遞的流程。MyTextView類public
class
MyTextView
extends
TextView
{
private
String
tag
=
"MyTextView";
public
MyTextView(Context
context)
{
super(context);
}
public
MyTextView(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
}
@Override
public
boolean
dispatchTouchEvent(MotionEvent
event)
{
switch
(event.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"dispatchTouchEvent
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"dispatchTouchEvent
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"dispatchTouchEvent
ACTION_DOWN");
break;
}
return
super.dispatchTouchEvent(event);
}
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
switch
(event.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"onTouchEvent
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"onTouchEvent
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"onTouchEvent
ACTION_DOWN");
break;
}
return
super.onTouchEvent(event);
}
}定義一個MainActivity來展現(xiàn)這個MyTextView,同時設(shè)置點擊(onClick)和觸摸(onTouch)監(jiān)聽。MainActivity類public
class
MainActivity
extends
AppCompatActivity
implements
View.OnClickListener,View.OnTouchListener{
private
MyTextView
mMyTextView;
private
String
tag
=
"MainActiviy";
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMyTextView
=
findViewById(R.id.text_view);
//
點擊監(jiān)聽
mMyTextView.setOnClickListener(this);
//
觸碰監(jiān)聽
mMyTextView.setOnTouchListener(this);
}
//
MyTextView
點擊事件
@Override
public
void
onClick(View
view)
{
switch
(view.getId()){
case
R.id.text_view:
Log.i(tag,
"MyTextView
onClick");
break;
}
}
//
MyTextView
觸碰事件
@Override
public
boolean
onTouch(View
view,
MotionEvent
motionEvent)
{
switch
(motionEvent.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"MyTextView
onTouch
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"MyTextView
onTouch
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"MyTextView
onTouch
ACTION_DOWN");
break;
}
return
false;
}
//
Activity?的事件分發(fā)
@Override
public
boolean
dispatchTouchEvent(MotionEvent
ev)
{
switch
(ev.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"dispatchTouchEvent
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"dispatchTouchEvent
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"dispatchTouchEvent
ACTION_DOWN");
break;
}
return
super.dispatchTouchEvent(ev);
}
//
Activity
的事件消費
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
switch
(event.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"onTouchEvent
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"onTouchEvent
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"onTouchEvent
ACTION_DOWN");
break;
}
return
super.onTouchEvent(event);
}
}3.2打印日志運行后,點擊TextView反饋的打印日志03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:dispatchTouchEventACTION_DOWN03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:dispatchTouchEventACTION_DOWN03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonTouchACTION_DOWN03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:onTouchEventACTION_DOWN03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:dispatchTouchEventACTION_UP03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:dispatchTouchEventACTION_UP03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonTouchACTION_UP03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:onTouchEventACTION_UP03-2808:05:15.0441219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonClick03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:dispatchTouchEventACTION_DOWN03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:dispatchTouchEventACTION_DOWN03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonTouchACTION_DOWN03-2808:05:14.8241219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:onTouchEventACTION_DOWN03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:dispatchTouchEventACTION_UP03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:dispatchTouchEventACTION_UP03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonTouchACTION_UP03-2808:05:15.0341219-1219/com.mvp.chenzhesheng.androidadvanceI/MyTextView:onTouchEventACTION_UP03-2808:05:15.0441219-1219/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonClickdispatchTouchEvent、OnTouchEvent這兩個方法的返回值存在三種情況:直接返回true。直接返回false。返回父類同名方法,super.dispatchTouchEvent或者super.OnTouchEvent。由于擁有不同的返回值,所以事件傳遞流程也有不同,經(jīng)過不斷修改返回值測試,最終得到了點擊事件的流程圖,ACTION_DOWN和ACTION_UP事件的傳遞流程是相同的。3.3事件傳遞流程圖從上面的流程圖可以得出結(jié)論:觸摸事件是從dispatchTouchEvent開始的,默認返回父類同名方法super,事件將會依照嵌套層次從外向內(nèi)傳遞(MainActivity到MyTextView),到達最內(nèi)層的View時,將由View的OnTouchEvent方法處理,該方法返回true時進行消費不再傳遞,返回false時再由內(nèi)向外傳遞,由外層的OnTouchEvent處理。如果外層向內(nèi)層傳遞過程中,人為干擾返回true消費,則不會繼續(xù)繼續(xù)像內(nèi)部傳遞。View的事件控制順序先執(zhí)行onTouch再執(zhí)行onClick,如果onTouch返回true消費,則不會繼續(xù)傳遞,也不會執(zhí)行onClick方法。四、ViewGroup的事件傳遞機制4.1domeViewGroup是View的控件容器存在,擁有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三個方法,比View多了一個onInterceptTouchEvent方法。為了更好的觀察,我們需要自定義MyRelativeLayout繼承RelativeLayout。MyRelativeLayout類public
class
MyRelativeLayout
extends
RelativeLayout
{
private
final
static
String
tag
=
"MyRelativeLayout";
public
MyRelativeLayout(Context
context)
{
super(context);
}
public
MyRelativeLayout(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
}
@Override
public
boolean
dispatchTouchEvent(MotionEvent
ev)
{
switch
(ev.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"dispatchTouchEvent
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"dispatchTouchEvent
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"dispatchTouchEvent
ACTION_DOWN");
break;
}
return
super.dispatchTouchEvent(ev);
}
@Override
public
boolean
onInterceptTouchEvent(MotionEvent
ev)
{
switch
(ev.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"onInterceptTouchEvent
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"onInterceptTouchEvent
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"onInterceptTouchEvent
ACTION_DOWN");
break;
}
return
super.onInterceptTouchEvent(ev);
}
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
switch
(event.getAction()){
case
MotionEvent.ACTION_UP:
Log.i(tag,
"onTouchEvent
ACTION_UP");
break;
case
MotionEvent.ACTION_MOVE:
Log.i(tag,
"onTouchEvent
ACTION_MOVE");
break;
case
MotionEvent.ACTION_DOWN:
Log.i(tag,
"onTouchEvent
ACTION_DOWN");
break;
}
return
super.onTouchEvent(event);
}
}main_activity.xml文件<?xml
version="1.0"
encoding="utf-8"?>
<com.mvp.chenzhesheng.androidadvance.MyRelativeLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.mvp.chenzhesheng.androidadvance.MyTextView
android:id="@+id/text_view"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello
World!"
</com.mvp.chenzhesheng.androidadvance.MyRelativeLayout>4.2打印日志04-0208:47:57.9801030-1030/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:dispatchTouchEventACTION_DOWN04-0208:47:58.0001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyRelativeLayout:dispatchTouchEventACTION_DOWN04-0208:47:58.0001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyRelativeLayout:onInterceptTouchEventACTION_DOWN04-0208:47:58.0001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyTextView:dispatchTouchEventACTION_DOWN04-0208:47:58.0101030-1030/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonTouchACTION_DOWN04-0208:47:58.0101030-1030/com.mvp.chenzhesheng.androidadvanceI/MyTextView:onTouchEventACTION_DOWN04-0208:47:58.2001030-1030/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:dispatchTouchEventACTION_UP04-0208:47:58.2001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyRelativeLayout:dispatchTouchEventACTION_UP04-0208:47:58.2001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyRelativeLayout:onInterceptTouchEventACTION_UP04-0208:47:58.2001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyTextView:dispatchTouchEventACTION_UP04-0208:47:58.2101030-1030/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonTouchACTION_UP04-0208:47:58.2101030-1030/com.mvp.chenzhesheng.androidadvanceI/MyTextView:onTouchEventACTION_UP04-0208:47:58.2601030-1030/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonClick04-0208:47:57.9801030-1030/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:dispatchTouchEventACTION_DOWN04-0208:47:58.0001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyRelativeLayout:dispatchTouchEventACTION_DOWN04-0208:47:58.0001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyRelativeLayout:onInterceptTouchEventACTION_DOWN04-0208:47:58.0001030-1030/com.mvp.chenzhesheng.androidadvanceI/MyTextView:dispatchTouchEventACTION_DOWN04-0208:47:58.0101030-1030/com.mvp.chenzhesheng.androidadvanceI/MainActiviy:MyTextViewonTouchACTION_DOWN04-0208:47:58.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙人合同范本電子
- 個人自薦書范文
- 農(nóng)藝工中級模擬題+答案
- 雙方交貨合同范本寫
- 個人住房裝修合同
- 水質(zhì)檢驗工初級考試題及參考答案
- 廠庫租房合同范本
- 《雷雨》教學(xué)計劃
- 分期購買水泥合同范例
- 《錦瑟》教案設(shè)計
- 2025中鐵集裝箱運輸有限責(zé)任公司招聘46人(京外地區(qū)崗位)筆試參考題庫附帶答案詳解
- 《英語史》課程教學(xué)大綱
- 智能鎖培訓(xùn)課程
- 小兒腸系膜淋巴結(jié)護理查房
- 【MOOC期末】《大學(xué)體育射箭》(東南大學(xué))中國大學(xué)慕課答案
- 中國農(nóng)業(yè)大學(xué)人文與發(fā)展學(xué)院管理服務(wù)崗位招聘筆試真題2023
- 風(fēng)電場觸電急救培訓(xùn)課件
- 2022年中小學(xué)心理健康教育指導(dǎo)綱要
- 高架橋梁混凝土工程專項施工方案
- 銀行案件風(fēng)險排查實施細則
- 亞馬遜品牌授權(quán)書(英文模板)
評論
0/150
提交評論