Android通用業務彈窗管理方案PopLayerV1

前言

在Android圈裏關於彈窗的開源框架仍是挺多的,可是大多數擴展都是針對於樣式,像是一種類型的彈窗開發者傳入不一樣的參數就能在UI效果上顯示不一樣的特效,這樣的擴展的確是十分方便但在咱們具體工做業務開發中,UI對彈窗樣式的追求上 就顯得有些雞肋,基本上業務場景每種類型的彈窗界面效果都大不相同作不到真正意義上的界面統一java

這裏對於將要介紹的方案 着重的不在於UI效果 而在於 彈窗的業務邏輯git

思想理念

得益於markzhai的任務流概念將App初始化的流程抽象爲flow、wave和task 三個階段類別的想法github

我整理了彈窗相關的一些類別 (ps:這裏的彈窗再也不是Dialog一般的概念)web

public enum PopType {
    DIALOG,
    WEBVIEW,
    WIDGET,
    POUPOWINDOW,
    TOAST,
    SNACKBAR,
    OTHERS
}
複製代碼

我也嘗試着將這些繁雜的彈窗統一抽象爲一體 也就是本框架中的核心成員之一 —— PopLayerViewbash

它是一個彈窗view但又不繼承於View 而且具有原生彈窗show,hide等基本功能app

它能夠是上面列出的彈窗的任何一種 只須要傳入你的具體彈窗策略框架

框架產於需求終於需求 需求文檔裏 可能須要你將彈窗延遲固定的時間並消失 一些活動彈窗須要你在具體的時間段失效 又或者是當運營下發多個活動窗口時 該如何知足他們需求的管理這些彈窗maven

面對上述的這些問題ide

彈窗就不限於彈窗自己了,它必須具有裝配各類業務相匹配的能力優化

1.時間範圍管理 2.顯示彈窗次數管理 3.優先級設置 4.顯示時間配置

Poplayer內部維護了 PopLayerController 裝配彈窗業務功能的成員來知足這些場景

成員 PopManager 維護了對應的彈窗優先級隊列 保證彈窗流程正常進行

綜上暫時知足目前的需求,但願這樣的思想理念能獲得您的贊同

具體使用

關於Poplayer的具體使用 您能夠去 Github:github.com/MrCodeSnipe… 上瀏覽但願對您有所幫助

//add this to your repositories
 maven { url 'https://www.jitpack.io' }

//add this to your dependencies
implementation 'com.github.MrCodeSniper:PopLayer:2.0.0'
複製代碼

關於彈窗管理

這裏 我將每一個彈窗對象 當成一個彈窗實體 在框架裏稱爲 Popi

它是一個描述窗口的最小不可分割實體 具有全部描述彈窗的屬性且能夠按照需求擴展

在使用時 只需按照您的需求 裝配對應的業務需求便可

Popi mUpgradePopi1 = new Popi.Builder()
                .setmPopId(4)//彈窗的惟一標識 當id發生改變 視爲新的彈窗
                .setmPriority(2)//優先級這裏不具體劃分對應的範圍 值越小優先級越高
                .setmCancelType(TRIGGER_CANCEL)//彈窗消失的類型分爲 TRIGGER_CANCEL(觸摸消失) COUNTDOWN_CANCEL (延時消失)
                .setMaxShowTimeLength(5)//最長顯示時間(S)
                .setMaxShowCount(5)//最大顯示次數
                .setmBeginDate(1548858028)//開始時間 2019-01-30 22:20:28
                .setmEndDate(1548944428)//結束時間 2019-01-31 22:20:28
                .setmPopLayerView(mLayerView1)//彈窗View
                .build();
複製代碼

以前說過傳入具體彈窗策略 建立對應的彈窗 即下文中的傳入dialog彈窗的策略 拿到以前統一的PopLayerView對象交由Popi管理便可

//Dialog形式
PopLayerView  mLayerView = new PopLayerView(this,R.layout.common_dialog_upgrade_app);
//透明Webview形式
PopLayerView mLayerView = new PopLayerView(this,LayerConfig.redPocketScheme);
複製代碼

如何實現彈窗優先級的業務邏輯

以前說到 成員 PopManager 維護了對應的彈窗優先級隊列 保證彈窗流程正常進行,最後的顯示和隱藏也是在其操做以後

首先Popi實體實現了Comparable接口 使其具有經過優先級比較大小的能力

其次也就是內部的優先級隊列 每添加刪除一個元素都會進行堆排序對隊列進行優先級調整

private  PriorityQueue<Popi> queue;
複製代碼

當彈窗實體Popi入隊中 會先經過判斷其Id是否重複 來判斷是否將其入隊

在顯示時根據傳入的Popi對應的屬性依次判斷其是否知足

1.在限定的活動時間內

2.經過SP保存相應彈窗的顯示次數 key爲Popi加上其惟一的ID 判斷顯示次數是否超出範圍

3.若是取消類型爲延遲取消 增長DelayDimiss

若流程沒法走出的彈窗實體會被移出隊列

具體的使用也很是簡單

//歸入彈窗管理
PopManager.getInstance().pushToQueue(mUpgradePopi);
//開始顯示彈窗
PopManager.getInstance().showNextPopi();
複製代碼

效果預覽

框架目前的缺陷

目前尚未好的方法來監聽原生的控件消失的回調

相似dialog 點擊圈外時 是不走咱們的Poplayer消失邏輯的

須要加上監聽 但這使得Poplayer內部的邏輯有些紊亂

目前的解決辦法是 統一彈窗的 觸摸機制 分爲實體和外圍區域 將其歸入咱們的管理範圍內

隨着PoplayerV2的發佈 觸摸機制 已經有默認不一樣擴展的實現 基本上實現統一

關於項目

V1方案

版本號 LOG 進度更新
V1.0.0 項目開源,完成彈窗管理與Dialog形式擴展 Dialog策略擴展完成
V1.0.1 修復Dialog策略沒法獲取dialog實體bug Dialog策略優化
V1.0.2 修復activity摧毀形成的彈窗異常 bug Dialog策略優化
V1.0.3 優化了彈窗的使用更加方便快捷 框架使用優化

V2方案

版本號 LOG 進度更新
V2.0.0 正式加入透明Webview彈窗策略擴展 透明Webview策略擴展完成

將來的計劃

基於透明的Webview的擴展已經完成 各位看官能夠去

Android通用業務彈窗管理方案PopLayerV2去看相關效果

有點相似於手淘在其云溪社區提供的方案從全方面統籌webview

其餘類型的彈窗也會陸續更新 但願能提供給你們一個較爲全面的應對業務需求的彈窗管理框架


做者介紹

Hello 我叫lalala,若是您喜歡個人文章,能夠去個人Github給個Star我就很開心啦!

Github:github.com/MrCodeSnipe…

Thanks To 手淘在其云溪社區提供的方案提供的封面圖片

--End

相關文章
相關標籤/搜索