使用RecyclerView實現(xiàn)Gallery畫廊效果

先貼圖


要實現(xiàn)上面的畫廊效果,傳統(tǒng)通過ViewPager clipChildren置為false實現(xiàn)。網(wǎng)上很多教程這個不多說,現(xiàn)在說說用RecyclerView實現(xiàn)上面的效果。這個效果分兩步:

  1. ViewPager滑動最終居中停止
  2. 滑動過程中縮放

ViewPager滑動最終居中停止

Support RecyclerView 24.2.0中增加一個非常重要的類SnapHelper,他的作用是讓RecyclerView滑動視圖后使停止位置正好停在某頁的正中間。使用方式很簡單
重點在于new LinearSnapHelper().attachToRecyclerView(recyclerView);

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(linearLayoutManager);

new LinearSnapHelper().attachToRecyclerView(recyclerView);

一行代碼搞定居中,LinearSnapHelper的源碼解析查看這里。

滑動過程中縮放

毫無疑問,RecyclerView的滑動縮放必須要監(jiān)聽RecyclerView的滑動

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        // dx>0則表示右滑, dx<0表示左滑, dy<0表示上滑, dy>0表示下滑
        mCurrentItemOffset += dx;
        computeCurrentItemPos();
        onScrolledChangedCallback();
    }
});     

mCurrentItemOffset為滑動總距離,Card每頁滑動的距離是固定的,根據(jù)這個可以計算出當(dāng)前顯示的位置??s放看onScrolledChangedCallback這個函數(shù),有了滑動位置就能實時計算滑動某頁的百分比
float percent = (float) Math.max(Math.abs(offset) * 1.0 / mOnePageWidth, 0.0001);

得到百分比, 再獲取當(dāng)前位置相鄰的視圖調(diào)用setScaleY函數(shù)實現(xiàn)縮放

/**
 * RecyclerView位移事件監(jiān)聽, view大小隨位移事件變化
 */
private void onScrolledChangedCallback() {
    int offset = mCurrentItemOffset - mCurrentItemPos * mOnePageWidth;
    float percent = (float) Math.max(Math.abs(offset) * 1.0 / mOnePageWidth, 0.0001);
    
    View leftView = null;
    View currentView;
    View rightView = null;
    if (mCurrentItemPos > 0) {
        leftView = mRecyclerView.getLayoutManager().findViewByPosition(mCurrentItemPos - 1);
    }
    currentView = mRecyclerView.getLayoutManager().findViewByPosition(mCurrentItemPos);
    if (mCurrentItemPos < mRecyclerView.getAdapter().getItemCount() - 1) {
        rightView = mRecyclerView.getLayoutManager().findViewByPosition(mCurrentItemPos + 1);
    }

    if (leftView != null) {
        // y = (1 - mScale)x + mScale
        leftView.setScaleY((1 - mScale) * percent + mScale);
    }
    if (currentView != null) {
        // y = (mScale - 1)x + 1
        currentView.setScaleY((mScale - 1) * percent + 1);
    }
    if (rightView != null) {
        // y = (1 - mScale)x + mScale
        rightView.setScaleY((1 - mScale) * percent + mScale);
    }
}

完整代碼下載

https://github.com/huazhiyuan2008/RecyclerViewCardGallery

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

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

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