RecyclerView監(jiān)聽滑動(dòng)距離

需求:RecyclerView中實(shí)現(xiàn)往上滑動(dòng)背景顏色或者圖片變淡直至白色或者透明,往下滑背景顏色或者圖片從白色逐漸變成正常顏色

圖示:
device-2020-03-27-154834.png

下滑的時(shí)候


device-2020-03-27-154853.png

常見思路做法:
int totalScrollY;

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            totalScrollY += dy;
            if (totalScrollY <= 0) {
                bgView.getBackground().mutate().setAlpha(255);
            } else if (totalScrollY <= 120) {
                bgView.getBackground().mutate().setAlpha((int) (255f - 255.0f / 120 * totalScrollY));
            } else {
                bgView.getBackground().mutate().setAlpha(0);
            }
        }
    });

利用onScrolled里面的dy值來進(jìn)行RecyclerView在y方向上面的滑動(dòng)距離統(tǒng)計(jì),然后根據(jù)滑動(dòng)距離進(jìn)行view的變化。

大部分的情況下該種做法是沒有問題。不過在很極端的情況下會(huì)出現(xiàn)totalScrollY的值不準(zhǔn)確的問題。

換種做法,totalScrollY不是通過累加dy來計(jì)算(注意:下面這種做法只適用于item的高度是固定統(tǒng)一的情況)

private int getScrollYDistance() {
try {
GridLayoutManager layoutManager = (GridLayoutManager) iRecyclerView.getLayoutManager();
if (layoutManager != null) {
int position = layoutManager.findFirstVisibleItemPosition();
View firstVisibleChildView = layoutManager.findViewByPosition(position);
if (firstVisibleChildView != null) {
int itemHeight = firstVisibleChildView.getHeight();
return position* itemHeight - firstVisibleChildView.getTop();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容