日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android自定義ViewGroup實現流式布局

瀏覽:22日期:2022-09-22 14:28:21

本文實例為大家分享了Android自定義ViewGroup實現流式布局的具體代碼,供大家參考,具體內容如下

Android自定義ViewGroup實現流式布局

1.概述

本篇給大家帶來一個實例,FlowLayout,什么是FlowLayout,我們常在App 的搜索界面看到熱門搜索詞,就是FlowLayout,我們要實現的就是圖中的效果,就是根據容器的寬,往容器里面添加元素,如果剩余的控件不足時候,自行添加到下一行,FlowLayout也叫流式布局,在開發中還是挺常用的.

2.對所有的子View進行測量

onMeasure方法的調用次數是不確定的,所以為了避免測量出錯,需要把總的List集合,清空一下,一個View的繪制,需要經過onMeasure方法的測量,和onLayout方法的排版才能顯示出來,在測量的方法中,我們把該ViewGroup中的所有子View遍歷出來,添加到一行中的List集合中,再把一行中的所有的元素集合添加到總的集合中去,并對每個子View元素進行測量,測量的參數,我們給0,或者未指定,,如果不是一行中的第一元素,并且通過 getUsablewWidth()方法獲取一行中可用的寬度,不夠容納下一元素,時就新創建一個集合,來裝一行中所有元素,再把所有的子View元素全部測量完成后,我們還需要通過setMeasuredDemoetion()方法把測量出來的寬和高保存起來,保存之后可以調用getMeasureWidth獲取測量之后的寬了.

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { allLines.clear(); //測量容器的寬和高 int containerMeasuredWidth = MeasureSpec.getSize(widthMeasureSpec); //這個集合用于保存單行 ArrayList<View> oneLine = null; for (int i = 0; i < getChildCount(); i++) { //獲取每一Chiledview View child = getChildAt(i); int UnspecifiedMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); child.measure(UnspecifiedMeasureSpec, UnspecifiedMeasureSpec);//相當于傳了一個0,0; //如果是第1個view就new一個新行出來,或者View大于了可用的寬度, if (i == 0 || child.getMeasuredWidth() > getUsablewWidth(containerMeasuredWidth, oneLine,oneLine.size())) { oneLine = new ArrayList<View>(); allLines.add(oneLine); } oneLine.add(child); } int lineNumber = allLines.size(); int allLinesHeight = getChildAt(0).getMeasuredHeight() * lineNumber; int verticalTotalpadding = getPaddingBottom() + getPaddingTop(); //垂直總的spcing int verticalTotalSpcing = 8 * (lineNumber - 1); //容器的高 = 所有View的高 + 垂直方向的Padding + 垂直總的spcing int containerMeasureHeight = allLinesHeight + verticalTotalpadding + verticalTotalSpcing; setMeasuredDimension(containerMeasuredWidth, containerMeasureHeight); }

3.獲取一行中可用的空間

獲取一行中可用的寬度,需要我們傳入容器的寬度,和一行元素的集合,和元素之間的間隔,,然后遍歷所有的元素,通過一個變量來保存所有View測量出來寬度的總和,用容器的寬 減去,子View寬度的總和減去水平方向的間隔,以及左右兩邊的Padding,得到一行中可用的寬度

private int getUsablewWidth(int containerMeasuredWidth, ArrayList<View> oneLine,int needSpacingCount) { int oneLineWidth = 0; for (View view : oneLine) { oneLineWidth += view.getMeasuredWidth(); } //水平方向兩邊的padding int horizotalPadding = getPaddingLeft() + getPaddingRight(); int horizontalTotalSpcing = horizotalPadding * needSpacingCount; int usablewWidth = containerMeasuredWidth - oneLineWidth - horizotalPadding - horizontalTotalSpcing; return usablewWidth; }

4.對所有的子View進行排版

還是遍歷每一行中的每一個元素,對該元素執行排版方法,通過child.getMeasuredWidth();和child.getMeasuredHeight();獲取測量后的View的寬和高,通過child.layout(l,t,r,b),對View進行位置的擺放,left就是上個元素的Rigth,Top,就是上一行元素的Bootom,Rigth就是Left+View自身的寬度,Bottom是Top+View自身的高度,最后,因為我們手動把TextView的寬改變了,跟測量時的寬不一樣了,重新調用測量即可

protected void onLayout(boolean changed, int l, int t, int r, int b) { int tempRight = 0;//保存一行中上一個View的Right int tempBottom = 0;//保存上一行View的Bottom位置 ///遍歷第一排 for (int row = 0; row < allLines.size(); row++) { ArrayList<View> oneLines = allLines.get(row); //計算一行中每個Veiw可以分到的平均寬度 int totalUsableWidth= getUsablewWidth(getMeasuredWidth(), oneLines,oneLines.size()-1); int averageUsablewWidth = totalUsableWidth/oneLines.size(); //遍歷的是一行的內容 for (int column = 0; column < oneLines.size(); column++) { View child = oneLines.get(column); //獲取測量的寬高 int measuredWidth = child.getMeasuredWidth(); int measuredHeight = child.getMeasuredHeight(); //如果是一行中的第一個View則排在第0個位置 int left = column == 0 ? getPaddingLeft() : tempRight + 8; //如果是第1行Top坐標是PaddingTop的位置,否則就上一個View的bottom位置 int top = row == 0 ? getPaddingTop() : tempBottom + 8; int right = left + measuredWidth ;//+ averageUsablewWidth;int bootom = top + measuredHeight; child.layout(left, top, right, bootom); tempRight = right;int WidthMeasureSpec = MeasureSpec.makeMeasureSpec(child.getWidth(), MeasureSpec.EXACTLY); int HeightMakeMeasureSpec = MeasureSpec.makeMeasureSpec(child.getHeight(), MeasureSpec.EXACTLY); child.measure(WidthMeasureSpec,HeightMakeMeasureSpec); } tempBottom = oneLines.get(0).getBottom(); } }

5.Activity

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FlowLayout flowLayout = new FlowLayout(this); flowLayout.setPadding(6, 6, 6, 6); for (String text : list) { TextView textView = new TextView(this); textView.setBackgroundResource(R.drawable.bg_text); textView.setGravity(Gravity.CENTER); textView.setPadding(6, 6, 6, 6); textView.setText(text); textView.setTextSize(20); flowLayout.addView(textView); } setContentView(flowLayout); } }

6.TextView 的背景

<shape xmlns:android='http://schemas.android.com/apk/res/android' android:shape='rectangle'> <stroke android: android:color='#5000' /> <corners android:radius='6dp'/></shape>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本久久成人网| 日韩精品一区二区三区中文在线| 99在线|亚洲一区二区| 超级白嫩亚洲国产第一| 国产精品久久久久久久久久白浆 | 午夜日韩av| 九九九精品视频| 久久99影视| 国产精品麻豆久久| 欧美aⅴ一区二区三区视频| 欧美综合精品| 欧美国产极品| 97精品一区| 亚洲欧美视频一区二区三区| 日韩精品免费观看视频| 伊人久久婷婷| 蜜桃av一区二区三区电影| 天海翼精品一区二区三区| 亚洲精品免费观看| 日韩高清一区在线| 黄色网一区二区| 日韩精品视频中文字幕| 精品高清久久| 青青草国产精品亚洲专区无| 色一区二区三区四区| 伊人成人在线视频| 国产一区福利| 亚洲少妇自拍| 国产一级久久| 高潮久久久久久久久久久久久久| 亚洲欧美日韩综合国产aⅴ| 国产精品网站在线看| 欧美精选一区二区三区| 国产美女视频一区二区| 亚洲一区亚洲| 欧美国产另类| 精品一区亚洲| 久久精品国产网站| 国产精品视区| 日韩中文影院| 免费在线日韩av| 日本免费在线视频不卡一不卡二| 国产专区精品| 国产精品人人爽人人做我的可爱| 欧美精品中文| 亚洲在线久久| 亚洲免费黄色| 国产精品av久久久久久麻豆网| 国产日韩亚洲| 国产精品毛片久久久| 欧美日一区二区| 三级亚洲高清视频| 首页国产精品| 亚洲欧洲美洲国产香蕉| 波多野结衣久久精品| 午夜欧美精品久久久久久久| 日韩激情精品| 日韩欧美精品综合| 欧美日韩精品一区二区三区在线观看| 亚洲成人一区在线观看| 国产麻豆一区二区三区精品视频| 美女黄网久久| 99国产精品久久久久久久| 偷拍精品精品一区二区三区| 国产精品久久久久久模特| 亚洲精品乱码日韩| 91高清一区| 99久久精品国产亚洲精品| 国产h片在线观看| 国产精品国产三级国产在线观看| 国产精品久久乐| 国产精品亲子伦av一区二区三区 | 日本不卡高清| 日本不卡视频在线观看| 亚洲一区区二区| 免费看精品久久片| 亚洲精品极品| 国产精品久久免费视频| 国产欧美一区二区三区米奇 | 精品三级在线观看视频| 麻豆国产精品| 久久精品观看| 亚洲精品一区二区在线播放∴| 老色鬼久久亚洲一区二区| 日本亚州欧洲精品不卡| 精品国产中文字幕第一页| 日本久久精品| 国产精品美女| 国产精品亚洲欧美日韩一区在线| 丰满少妇一区| 夜夜精品视频| 国产精品白丝av嫩草影院| 亚洲天堂免费电影| 99国产精品久久久久久久| 91亚洲精品视频在线观看| 亚洲人成在线网站| 视频一区二区不卡| 成人国产精品一区二区网站| 国产农村妇女精品一二区| 国产欧美一区二区三区国产幕精品| 岛国av在线播放| 亚洲+小说+欧美+激情+另类| 六月丁香综合在线视频| 亚洲尤物在线| 亚洲黄色中文字幕| 国产探花在线精品一区二区| 久久人人99| 久久av偷拍| 亚洲精品成人| 久久久久久夜| 国产精品第一| 视频一区免费在线观看| 麻豆视频在线观看免费网站黄| 日本一区福利在线| 欧洲激情综合| 欧美二三四区| 精品国产乱码久久久| 日本aⅴ精品一区二区三区| 另类国产ts人妖高潮视频| 999国产精品视频| 国产中文在线播放| 电影91久久久| 精品中文字幕一区二区三区 | 国产精品最新| 免费看欧美美女黄的网站| 婷婷综合社区| 欧美va天堂| 欧美不卡在线| 激情综合在线| 日韩国产欧美| 日韩欧美国产精品综合嫩v| 国产在视频一区二区三区吞精| 欧美另类中文字幕| 无码日韩精品一区二区免费| 亚洲精选av| 日本亚洲不卡| 日本伊人午夜精品| 视频一区视频二区在线观看| 日韩影院免费视频| 午夜在线视频观看日韩17c| 狠狠爱成人网| 亚洲一区二区三区在线免费| 免播放器亚洲| 国产亚洲久久| 高清在线一区| 久久网站免费观看| 国产精品视区| 国产日韩亚洲欧美精品| 精品久久久网| 欧美成人基地| 在线免费观看亚洲| 国产欧美一区二区三区国产幕精品| 国产精品久一| 播放一区二区| 亚洲精品福利| 日韩成人精品一区| 天使萌一区二区三区免费观看| 日韩高清不卡在线| 鲁鲁在线中文| 丝袜美腿成人在线| 国产精品网站在线看| 亚洲福利一区| 日韩精彩视频在线观看| 高清日韩欧美| 丝袜亚洲精品中文字幕一区| 精品国产午夜| 免费看欧美美女黄的网站| 欧美日韩亚洲一区二区三区在线 | 国产精品丝袜xxxxxxx| 欧美一级二级三级视频| 91亚洲自偷观看高清| 亚洲久久视频| 91精品一区二区三区综合在线爱| 天堂精品久久久久| 四虎影视精品| 日韩和欧美一区二区| 亚洲午夜视频| 嫩呦国产一区二区三区av| 美女日韩在线中文字幕| 国产欧洲在线| 国产精品日本一区二区三区在线 | 国产欧美日韩亚洲一区二区三区| 成人美女视频| 久久99偷拍| 亚洲精品系列| 在线看片不卡| 日韩久久一区二区三区| 国产精品乱战久久久| 日本久久一区| 青草av.久久免费一区| 一本色道久久精品| 国产精品成人自拍| 欧美久久久网站| 亚洲精品欧美| 天海翼亚洲一区二区三区| 三级欧美韩日大片在线看| 欧美日韩国产精品一区二区亚洲| 亚洲黑丝一区二区| 久久一区二区三区喷水| 亚洲日本网址|