RecyclerView添加提示氣泡

背景

在APP中經常有氣泡用於提示用戶新增的業務,一般場景下我們都可以通過dialog或者PopupWindow實現。但是如果需要在一個ListView或者RecyclerView列表添加這樣的需求那麼該如何實現。

實現思路

方案一

使用popupWindow實現,由於popupWindow是基於window的UI,所以用在不同的fragment切換時使用不太靈活,且不能隨列表滾動逐漸消失在屏幕呢。Dialog情況差不多。

方案二

使用clipChildren屬性也無法實現效果,因爲列表的排列後排列的會蓋到前排列的item之上

方案三

繼承FrameLayout自定義佈局

分別添加recycleView和氣泡view

難點:

1、如何定位氣泡在哪個item上顯示

// 1、設置需要顯示氣泡的item position,假設第一個item需要展示
if(position == 0) {return true}
// 2、遍歷獲得該position的child
for (int i = 0; i < childCount; i++) {
    View child = recyclerView.getChildAt(i);
}
// 3、獲得該child的位置,設置給氣泡view
private void setFloatTranslateY(int dy) {
    if (child != null && floatView != null) {
        int translateY = child.getTop();

        floatView.setTranslationY(translateY);
        floatView.setTranslationX(needFloatChild.getWidth()/2);
    }
}

2、氣泡隨recycleview滑動

// 監聽recyclerView滑動事件
RecyclerView.OnScrollListener myScrollerListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (floatView == null) {
            return;
        }
        currentState = newState;
    }

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (floatView == null) {
            return;
        }
        switch (currentState) {
            
            case RecyclerView.SCROLL_STATE_IDLE:
            
            case RecyclerView.SCROLL_STATE_DRAGGING:
            
            case RecyclerView.SCROLL_STATE_SETTLING:
                // 根據滑動更新氣泡view位置
                setFloatTranslateY(recyclerView.computeVerticalScrollOffset());
                break;
        }
    }
};
recyclerView.addOnScrollListener(myScrollerListener);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章