背景
在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);