【移動應(yīng)用開發(fā)技術(shù)】Android中怎么實現(xiàn)觸摸事件傳遞機制_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么實現(xiàn)觸摸事件傳遞機制_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么實現(xiàn)觸摸事件傳遞機制_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么實現(xiàn)觸摸事件傳遞機制_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么實現(xiàn)觸摸事件傳遞機制_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論