Android自定義ViewGroup多行多列效果
本文實(shí)例為大家分享了Android自定義ViewGroup多行多列的具體代碼,供大家參考,具體內(nèi)容如下
先看下效果圖
每行兩個(gè)子孩子
每行一個(gè)子孩子
實(shí)現(xiàn)思路
自定義viewGroup,實(shí)現(xiàn)測(cè)量和布局,使控件適應(yīng)業(yè)務(wù)場(chǎng)景。
測(cè)量
根據(jù)父控件的寬度,平均分給每個(gè)子孩子固定的寬度。高度就是行數(shù)乘以一個(gè)子孩子的高度,再加上空隙的高度。
根據(jù)子孩子個(gè)數(shù)計(jì)算行數(shù)
val rows = if (childCount % perLineChild == 0) { childCount / perLineChild } else { childCount / perLineChild + 1 }
代碼示例
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val width = MeasureSpec.getSize(widthMeasureSpec) for (i in 0 until childCount) { val child: View = getChildAt(i) if (child.visibility != GONE) { val lp = child.layoutParams val childWidthMeasureSpec = getChildMeasureSpec( widthMeasureSpec, 0, (width - (perLineChild - 1) * space) / perLineChild ) val childHeightMeasureSpec = getChildMeasureSpec( heightMeasureSpec, 0, lp.height ) child.measure(childWidthMeasureSpec, childHeightMeasureSpec) } } val rows = if (childCount % perLineChild == 0) { childCount / perLineChild } else { childCount / perLineChild + 1 } if (childCount > 0) { setMeasuredDimension( width, getChildAt(0).measuredHeight * rows + (rows - 1) * space ) } }
布局
需要注意擺放的順序和位置,每行擺放固定的個(gè)數(shù),達(dá)到個(gè)數(shù)之后換行繼續(xù)擺放
代碼示例
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { var left = l var top = t children.forEachIndexed { index, view -> if (index % perLineChild == 0) { left = 0 if (index != 0) { top += view.measuredHeight top+=space } view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } else { view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } left += view.measuredWidth left += space } }
完整代碼
class MultiLineViewG @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ViewGroup(context, attrs, defStyleAttr) { var perLineChild = 2 /** * 子孩子之間的空隙 */ var space = 10 override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val width = MeasureSpec.getSize(widthMeasureSpec) for (i in 0 until childCount) { val child: View = getChildAt(i) if (child.visibility != GONE) { val lp = child.layoutParams val childWidthMeasureSpec = getChildMeasureSpec( widthMeasureSpec, 0, (width - (perLineChild - 1) * space) / perLineChild ) val childHeightMeasureSpec = getChildMeasureSpec( heightMeasureSpec, 0, lp.height ) child.measure(childWidthMeasureSpec, childHeightMeasureSpec) } } val rows = if (childCount % perLineChild == 0) { childCount / perLineChild } else { childCount / perLineChild + 1 } if (childCount > 0) { setMeasuredDimension( width, getChildAt(0).measuredHeight * rows + (rows - 1) * space ) } } override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { var left = l var top = t children.forEachIndexed { index, view -> if (index % perLineChild == 0) { left = 0 if (index != 0) { top += view.measuredHeight top+=space } view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } else { view.layout(left, top, view.measuredWidth + left, top + view.measuredHeight) } left += view.measuredWidth left += space } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 通過(guò)網(wǎng)絡(luò)圖片路徑查看圖片實(shí)例詳解
這篇文章主要介紹了Android 通過(guò)網(wǎng)絡(luò)圖片路徑查看圖片實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06Android BroadcastReceiver接收收到短信的廣播
這篇文章主要為大家詳細(xì)介紹了Android BroadcastReceiver接收收到短信的廣播,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android 用SQLite實(shí)現(xiàn)事務(wù)的方法
本篇文章小編為大家介紹,Android用SQLite實(shí)現(xiàn)事務(wù)的方法。需要的朋友參考下2013-04-04Flutter實(shí)現(xiàn)自定義搜索框AppBar的示例代碼
開(kāi)發(fā)中,頁(yè)面頭部為搜索樣式的設(shè)計(jì)非常常見(jiàn),為了可以像系統(tǒng)AppBar那樣使用,本文將利用Flutter自定義一個(gè)搜索框,感興趣的可以了解一下2022-04-04Android開(kāi)發(fā)使用Handler實(shí)現(xiàn)圖片輪播功能示例
這篇文章主要介紹了Android開(kāi)發(fā)使用Handler實(shí)現(xiàn)圖片輪播功能,涉及Android基于Handler操作圖片的相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2017-09-09Android使用google breakpad捕獲分析native cash
這篇文章主要介紹了Android使用google breakpad捕獲分析native cash 的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Android獲取、更改包名的小技巧分享(超實(shí)用)
這篇文章主要給大家分享介紹了關(guān)于利用Android更改包名的一個(gè)小技巧,通過(guò)這個(gè)方法大家可以很方便的修改包名,再也不用為頻繁修改包名而感到頭疼,文中還給大家分享利一個(gè)android獲取手機(jī)所有應(yīng)用包名的方法,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Material Design系列之Behavior實(shí)現(xiàn)Android知乎首頁(yè)
這篇文章主要為大家詳細(xì)介紹了Material Design系列之Behavior實(shí)現(xiàn)Android知乎首頁(yè)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09基于Android 監(jiān)聽(tīng)ContentProvider 中數(shù)據(jù)變化的相關(guān)介紹
本篇文章小編為大家介紹,基于Android 監(jiān)聽(tīng)ContentProvider 中數(shù)據(jù)變化的相關(guān)介紹。需要的朋友參考下2013-04-04Android 用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的方法
下面小編就為大家分享一篇Android 用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01