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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

责任链模式在Android中的应用

發(fā)布時間:2024/7/5 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 责任链模式在Android中的应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

*本篇文章已授權(quán)微信公眾號 guolin_blog (郭霖)獨家發(fā)布

責任鏈其實在Android中出現(xiàn)的頻率還蠻高的,事件傳遞就是一種責任鏈機制。接下來我為大家介紹在開發(fā)應用時責任鏈的用處:

  • 1.觸摸事件的應用。
  • 2.響應事件的應用。

何為責任鏈?責任鏈說白了就是一個事件傳遞的鏈條,一般這個鏈條上有很多個事件消費者,每個事件消費者都有機會接收并消費事件:

第一個對象如果可以處理,則處理后返回,如果不能處理,則將事件傳遞下一個對象處理,以此推類。

那么它究竟在Android中有什么用呢,大伙可能知道,Android我們最為熟悉的就是Touch事件傳遞了,這就是一個典型的責任鏈模式。為了介紹的更直觀一點,我簡單畫了一個界面:

上面的情況Android中有時候會遇到。有時界面上會彈出好幾個這種臨時顯示的窗體或者控件,它們只是為了顯示一下,然后需要用戶關(guān)閉,常常我們希望可以按下返回鍵將它們關(guān)閉。

如果不使用責任鏈的話代碼就會寫成這個樣子:

if(A.isShow()){A.dismiss();}else if(B.isShow()){B.dismiss();}else if(C.isShow()){C.dismiss();}else if(D.isShow()){D.dismiss();}......

如果只有一兩個,這么寫也不會有什么錯。但如果情況復雜了的話,這么寫,設計上可就不妙了。所以這種情況極適合使用責任鏈模式來處理。

下面的例子以View的順序隱藏、顯示及View的動畫演示了事件的傳遞:

例子中在按下事件分發(fā)的按鈕時,控件會按照剛開始設置好的順序依次隱藏、作動畫、顯示,最后再按下會關(guān)閉程序。

說一下實現(xiàn):

先實現(xiàn)事件協(xié)定接口,這個接口用于相互之間的事件流轉(zhuǎn)協(xié)議:

public interface IEvent<T> {public boolean onEvent(@NonNull T obj); }

EventStub方法對IEvent接口進行了初步實現(xiàn),它是事件傳遞的核心。它會首先詢問自己是否消費事件,否則的話會交給下個消費者:

/*** 責任鏈抽象類,其中包含下一個實現(xiàn)者的應用*/ public abstract class EventStub<T> implements IEvent<T> {protected IEvent mEventStub;protected T viewStub;/*** @param mEventStub 下一級的事件接受者* @param viewStub 下一級被處理的對象*/public EventStub(IEvent mEventStub, T viewStub) {this.mEventStub = mEventStub;this.viewStub = viewStub;}@Overridepublic boolean onEvent(@NonNull T obj) {boolean b = onEventImpl(obj);if (!b && mEventStub != null)return mEventStub.onEvent(viewStub);return b;}/*** @param obj* @return 代表是否有消費事件*/protected abstract boolean onEventImpl(@NonNull T obj); }

ViewEventStub是EventStub其中的一個實現(xiàn),專門用于處理View的隱藏:

/*** View隱藏*/ public class ViewEventStub extends EventStub<View> {/*** @param mEventStub 下一級的事件接受者* @param viewStub 下一級被處理的對象*/public ViewEventStub(IEvent mEventStub, View viewStub) {super(mEventStub, viewStub);}@Overridepublic boolean onEventImpl(@NonNull View obj) {View tempView = obj;if (tempView.getVisibility() == View.VISIBLE) {tempView.setVisibility(View.INVISIBLE);return true;}return false;} }

AnimationLeftEventStub也是EventStub的一個實現(xiàn),用于使View做向左的動畫:

public class AnimationLeftEventStub extends EventStub<View> {private boolean result = true;/*** @param mEventStub 下一級的事件接受者* @param viewStub 下一級被處理的對象*/public AnimationLeftEventStub(IEvent mEventStub, View viewStub) {super(mEventStub, viewStub);}@Overrideprotected boolean onEventImpl(@NonNull View obj) {if (result) {ObjectAnimator anim = ObjectAnimator.ofFloat(obj, "x", -400);anim.setDuration(1000);anim.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {result = false;}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});anim.start();}return result;} }

AnimationRightEventStub與AnimationLeftEventStub同理,只是它是執(zhí)行向右的動畫,這里就不再貼代碼了。

最后在CloseEventStub中也實現(xiàn)了EventStub,它用于處理最后一條消息的展示以及Activity的關(guān)閉:

private class CloseEventStub extends EventStub<View> {/*** @param mEventStub 下一級的事件接受者* @param viewStub 下一級被處理的對象*/public CloseEventStub(IEvent mEventStub, View viewStub) {super(mEventStub, viewStub);}@Overrideprotected boolean onEventImpl(@NonNull View obj) {if (obj.getVisibility() == View.GONE) {obj.setVisibility(View.VISIBLE);return true;}if (!isDestroyed()) {finish();return true;}return false;}}

以上就是執(zhí)行過程中的消費者,我們在Activity中將它們串起來:

EventStub tempStub = new CloseEventStub(null, null);tempStub = new AnimationRightEventStub(tempStub, findViewById(R.id.view_7));tempStub = new AnimationLeftEventStub(tempStub, findViewById(R.id.view_6));tempStub = new ViewEventStub(tempStub, view_5);tempStub = new ViewEventStub(tempStub, view_4);tempStub = new ViewEventStub(tempStub, view_3);sourceStub = new ViewEventStub(tempStub, view_2);

然后由一個按鈕觸發(fā)點擊事件,開始傳遞這個事件:

/*** 外部觸發(fā)回調(diào)** @param view*/public void dismiss(View view) {//將事件傳給責任鏈頭sourceStub.onEvent(view_1);}

好了,以上所有的關(guān)鍵步驟就完成了,接下來在點擊dismiss方法的時候就會將每次的事件依次向下傳遞,它們會一個個的將事件消費,直至程序關(guān)閉。

完整的程序請參見:https://git.oschina.net/sahadev/Chain-of-Responsibility.git

總結(jié)

以上是生活随笔為你收集整理的责任链模式在Android中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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