RecyclerView-ItemDecoration[均等分配問題]

最近在做漫畫的過程中,有些頁面需要用到網(wǎng)格布局管理器,需要處理item的間隔,相信這個(gè)用到的同學(xué)都遇到過:
方案1:看到有些同學(xué)通過屏幕寬度進(jìn)行處理(這個(gè)局限性太大,還不如用recyclerView的寬度呢)
方案2:無非就是找item的index和預(yù)留間距的關(guān)系(一定不涉及view及屏幕寬度問題)

這里采用方案2的方式(針對網(wǎng)格布局)

前提:一般場景下左右兩端預(yù)留的間隔都是一致的,所有這里只處理對稱的情況,不對稱的情況后續(xù)在做。
對整個(gè)過程就不細(xì)致描述了,只記錄下結(jié)果:


大概步驟:

  1. 處理item之間的間隔(找出索引、間距的關(guān)系)
  2. 處理兩端的間隔(找出索引、左右兩端間距關(guān)系)
  3. 合并以上兩步

設(shè)幾個(gè)已知量:
int sc; //網(wǎng)格列數(shù)
int dh; //每相鄰兩個(gè)item的間距
int lrs; //最左端、最右端的間距
變量:
int m = index % sc; //index是view在布局中的位置,m用來做每行的列索引,可以當(dāng)成x來用
計(jì)算:
根據(jù)以上的已知量和未知量來找出間距y與m之間的函數(shù)關(guān)系。
首先要明確:每個(gè)item無論sc是偶還是奇的情況下間距都是基于recycleview中心對稱的。列方程算就行了(未知數(shù)的個(gè)數(shù)跟sc相關(guān),比如對于sc=3的情況:lrs | a|b | b|a |lrs)。

在很長的計(jì)算結(jié)束后,得出以下函數(shù)關(guān)系:

  1. item間隔函數(shù)關(guān)系
    item右側(cè):y = -m + (sc - 1) //m != sc - 1
    item左側(cè):y = m //m != 0
  2. 處理兩端的間隔
    item右側(cè):y = 2m - (sc - 2) //m != sc - 1
    item左側(cè):y = y = -2m + sc //m != 0

以上4個(gè)方程是核心。
最后結(jié)果如下:

        //處理中間分割線問題[原始間隔]
        if (m != sc - 1) {
            //y = -x + (sc - 1)
            outRect.right = (int) ((sc - 1 - m) * 1.f * dh / sc) ;
        }

        if (m != 0) {
            //y = x
            outRect.left = (int) ((m) * 1.0f * dh / sc);
        }

        //處理兩端間距分配給每個(gè)item問題
        if (m != sc - 1) {
            //y = 2x - (sc - 2)
            outRect.right += (int) ((2 * m - (sc - 2)) * 1.0f * lrs/ sc);
        }

        if (m != 0) {
            //y = -2x + sc
            outRect.left += (int) ((-2 * m + sc) * 1.0f * lrs/ sc);
        }


        //處理兩端設(shè)置的間距問題
        if (m == sc - 1) {
            outRect.right = lrs;

        }

        if (0 == m) {
            outRect.left = lrs;
        }

另外:
線性的和網(wǎng)格縱向的間距都好處理。

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

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

  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,991評論 0 2
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,294評論 0 17
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個(gè)月起每個(gè)月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 2,068評論 0 2
  • http://spark.apache.org/docs/latest/api/python/index.html...
    mpro閱讀 6,272評論 0 4
  • 時(shí)光易逝,轉(zhuǎn)眼間,便是十五年的光陰掠過。 揚(yáng)州,有一個(gè)龐大的宗派,名為武門。武門傳承悠久,強(qiáng)者眾多,乃九洲大陸最頂...
    眸含星空閱讀 1,466評論 1 3

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