紅點管理

weixin_34054866發表於2019-01-14

需求描述

  1. 不同級紅點狀態可傳遞
  2. 同級紅點不相互影響
  3. 紅點狀態可配置
  4. 紅點可記錄數量

功能分析

要實現功能傳遞顯然要實現層級結構,同時為了實現同級紅點不互相影響那麼就像樹形結構了,每個紅點相當於葉子,葉子只負責儲存紅點狀態資訊以及父節點指向。

要實現上述功能點,最少需要兩個類,一個負責控制紅點UI顯示,一個用來管理狀態。

功能分點實現

控制UI顯示上其實只要控制紅點的啟用狀態就行了。

資料方面需要紅點UI,紅點狀態即可。

行為方面需要寫一個紅點開關函式以及接受函式用來接受傳進來的紅點狀態。

public void SetRedPoint(bool flag){
    if(imgRedPoint != null){
        imgRedPoint.gameObject.SetActive(flag);
    }
}

public void SetData(NotifyMark mark){
    if(mark == null){
        SetRedPoint(false);
        return;
    }
    this.mark = mark;
    this.mark.OnChange += SetRedPoint;
}

紅點資料方面稍微複雜點:需要定義一個父節點,方便紅點狀態的層級傳遞;

                    定義一個訊息數,方便訊息分層;

                    定義一個狀態標誌,界定當前狀態,通過使用屬性來定義

                    定義一個狀態變更代理,方便狀態變更時讓UI層隨之變化

行為方面:狀態獲取(getter); 父節點設定;設定狀態變更代理;紅點狀態變更;父節點狀態變更;狀態重置;子節點狀態清除。

public class NotifyMark {

        private NotifyMark parentNode = null;
        private int SubNotifyCount = 0;

        /* 判斷通知是否顯示 */
        public bool IsNotify { get; private set; }
        public static implicit operator bool (NotifyMark notify) { //定義隱式轉換
            return notify != null && notify.IsNotify;
        }

        /* 設定狀態變更代理 */
        private Action<bool> _OnChange = null; //定義bool型別,用來確定是否顯示小紅點
        public event Action<bool> OnChange {
            add {
                _OnChange += value;
                value (IsNotify);
            }
            remove {
                _OnChange -= value;
            }
        }

        /* 建構函式初始化狀態 */
        public NotifyMark () {
            IsNotify = false;
        }

        /* 設定父節點 */
        public void SetParentNotify (NotifyMark notify) {
            parentNode = notify;
        }

        /* 更新狀態 */
        public void ChangeNotify (bool isNotify) {
            if (isNotify != IsNotify) {
                IsNotify = isNotify;

                //如果有父節點就向上傳遞
                if (parentNode != null) {
                    parentNode.OnSubNotifyChange (isNotify);
                }

                // 變更小紅點顯示
                if (_OnChange != null) {
                    _OnChange (IsNotify);
                }
            }
        }

        /* 修改父節點小紅點狀態 */
        private void OnSubNotifyChange (bool isNotify) {
            if (isNotify) {
                SubNotifyCount++;          //記錄子節點訊息數量
            } else {
                SubNotifyCount--;
            }
            ChangeNotify (SubNotifyCount > 0);
        }

        /* 清除子節點小紅點記錄 */
        public void CleanSub () {
            SubNotifyCount = 0;
            ChangeNotify (false);
        }

        /* 重置資訊 */
        public void Reset () {
            parentNode = null;
            SubNotifyCount = 0;
            ChangeNotify (false);
            _OnChange = null;
        }
    }

用例

實質是通過給ChangeNotify傳遞判斷值。
例子

3806085-11c082a748c79629.gif
小紅點_20181203181721.gif

相關文章