日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义ViewGroup(1)

發(fā)布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义ViewGroup(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

源碼來自?http://blog.csdn.net/lmj623565791/article/details/38339817

升級代碼?http://blog.csdn.net/lmj623565791/article/details/38352503 ?實現(xiàn)FlowLayout

主要是?onMeasure 和?onLayout 的運用

package com.weidingqiang.testviewb;import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup;/*** Created by weidingqiang on 15/11/19.*/ public class BaViewGroup extends ViewGroup {public BaViewGroup(Context context) {this(context,null);}public BaViewGroup(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { /*** 獲得此ViewGroup上級容器為其推薦的寬和高,以及計算模式*/int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);// 計算出所有的childView的寬和高 measureChildren(widthMeasureSpec, heightMeasureSpec);/*** 記錄如果是wrap_content是設(shè)置的寬和高*/int width = 0;int height = 0;int cCount = getChildCount();int cWidth = 0;int cHeight = 0;MarginLayoutParams cParams = null;// 用于計算左邊兩個childView的高度int lHeight = 0;// 用于計算右邊兩個childView的高度,最終高度取二者之間大值int rHeight = 0;// 用于計算上邊兩個childView的寬度int tWidth = 0;// 用于計算下面兩個childiew的寬度,最終寬度取二者之間大值int bWidth = 0;/*** 根據(jù)childView計算的出的寬和高,以及設(shè)置的margin計算容器的寬和高,主要用于容器是warp_content時*/for (int i = 0; i < cCount; i++){View childView = getChildAt(i);cWidth = childView.getMeasuredWidth();cHeight = childView.getMeasuredHeight();cParams = (MarginLayoutParams) childView.getLayoutParams();// 上面兩個childViewif (i == 0 || i == 1){tWidth += cWidth + cParams.leftMargin + cParams.rightMargin;}if (i == 2 || i == 3){bWidth += cWidth + cParams.leftMargin + cParams.rightMargin;}if (i == 0 || i == 2){lHeight += cHeight + cParams.topMargin + cParams.bottomMargin;}if (i == 1 || i == 3){rHeight += cHeight + cParams.topMargin + cParams.bottomMargin;}}width = Math.max(tWidth, bWidth);height = Math.max(lHeight, rHeight);/*** 如果是wrap_content設(shè)置為我們計算的值* 否則:直接設(shè)置為父容器計算的值*/setMeasuredDimension((widthMode == MeasureSpec.EXACTLY) ? sizeWidth: width, (heightMode == MeasureSpec.EXACTLY) ? sizeHeight: height);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {int cCount = getChildCount();int cWidth = 0;int cHeight = 0;MarginLayoutParams cParams = null;/*** 遍歷所有childView根據(jù)其寬和高,以及margin進行布局*/for (int i = 0; i < cCount; i++){View childView = getChildAt(i);cWidth = childView.getMeasuredWidth();cHeight = childView.getMeasuredHeight();cParams = (MarginLayoutParams) childView.getLayoutParams();int cl = 0, ct = 0, cr = 0, cb = 0;switch (i){case 0:cl = cParams.leftMargin;ct = cParams.topMargin;break;case 1:cl = getWidth() - cWidth - cParams.leftMargin- cParams.rightMargin;ct = cParams.topMargin;break;case 2:cl = cParams.leftMargin;ct = getHeight() - cHeight - cParams.bottomMargin;break;case 3:cl = getWidth() - cWidth - cParams.leftMargin- cParams.rightMargin;ct = getHeight() - cHeight - cParams.bottomMargin;break;}cr = cl + cWidth;cb = cHeight + ct;childView.layout(cl, ct, cr, cb);}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);}@Overridepublic ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs){return new MarginLayoutParams(getContext(), attrs);} }

布局文件

<com.weidingqiang.testviewb.BaViewGroupandroid:layout_width="300dp"android:layout_height="300dp"android:background="#ff0"><TextViewandroid:layout_width="50dp"android:layout_height="50dp"android:background="#FF4444"android:gravity="center"android:text="0"android:textColor="#FFFFFF"android:textSize="22sp"android:textStyle="bold" /><TextViewandroid:layout_width="50dp"android:layout_height="50dp"android:background="#00ff00"android:gravity="center"android:text="1"android:textColor="#FFFFFF"android:textSize="22sp"android:textStyle="bold" /><TextViewandroid:layout_width="50dp"android:layout_height="50dp"android:background="#ff0000"android:gravity="center"android:text="2"android:textColor="#FFFFFF"android:textSize="22sp"android:textStyle="bold" /><TextViewandroid:layout_width="50dp"android:layout_height="50dp"android:background="#0000ff"android:gravity="center"android:text="3"android:textColor="#FFFFFF"android:textSize="22sp"android:textStyle="bold" /></com.weidingqiang.testviewb.BaViewGroup>

  

轉(zhuǎn)載于:https://www.cnblogs.com/weidingqiang/p/4979887.html

總結(jié)

以上是生活随笔為你收集整理的自定义ViewGroup(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一本色道久久综合亚洲精品酒店 | 亚洲欧美综合网 | 91人妻一区二区三区蜜臀 | 欧美整片在线观看 | 成人片在线视频 | 国产91色 | 亚洲乱码国产乱码精品精的特点 | 国产精品一色哟哟哟 | 台湾男男gay做爽爽的视频 | 国产三级国产精品国产专区50 | 久久夫妻视频 | 欧美怡红院视频 | 国产青青青 | 欧美视频在线观看一区 | 裸体喂奶一级裸片 | 国产一区二区三区四 | 国产一区二区视频播放 | 福利小视频在线观看 | 国产男同gay网站 | 国产成人免费在线 | 噼里啪啦动漫高清在线观看 | 国产又黄又猛又粗 | 色99在线 | 日韩五码电影 | 色爱av综合 | av55 | 免费高清av在线看 | 精品日韩av| 91视频 - 88av| 亚洲电影在线看 | 国产成人在线看 | 久久久久国产视频 | 欧美日韩另类在线 | 一级性毛片 | 午夜小视频免费 | 公侵犯人妻一区二区 | 西西人体44www大胆无码 | 欧美午夜精品理论片a级按摩 | 亚洲成人高清在线观看 | 色妞网站 | 国产成人精品一区二区三区四区 | 天堂a视频| 日本少妇毛茸茸 | 日韩精品国产一区 | 人妻在线日韩免费视频 | 亚洲欧美第一页 | 国产外围在线 | аⅴ资源新版在线天堂 | 狠色综合 | 91中文字幕在线播放 | 欧美成人怡红院 | 免费观看在线视频 | 青青草在线观看视频 | 污的视频在线观看 | 日韩欧美视频网站 | 黄色av不卡 | 国产嫩草影院久久久久 | 亚洲欧美一区二区三区 | 国产精品高潮AV无码 | 精品视频在线观看免费 | 免费看毛片的网站 | 天天舔天天干 | 精品人伦一区二区三区蜜桃免费 | av在线毛片 | 精品国产无码一区二区三区 | 日本阿v视频在线观看 | 巨大黑人极品videos精品 | 国产又粗又猛又爽又 | 中文字幕日韩有码 | 精品国产av一区二区 | 麻豆av一区二区 | 欧美日本道| 古装做爰无遮挡三级 | 99re国产在线 | av中文在线观看 | 欧美黑人一级爽快片淫片高清 | 国产一区二区精华 | av色播| 中文字幕5566 | www.波多野结衣.com | 91超碰在线免费观看 | 精品久久一区 | 99久久精品国产毛片 | 精品亚洲一区二区三区四区五区高 | 久久精品1 | 婷婷色在线播放 | 999毛片| 亚洲va欧美va天堂v国产综合 | 五月激情婷婷丁香 | 欧美午夜理伦三级在线观看 | 九色porn蝌蚪 | 黄色成人在线观看 | av电影网站在线观看 | 日韩精品久久久久久免费 | 日本特黄特色aaa大片免费 | 1区2区视频 | 男人插女人下面视频 | 欧美精品在线看 | 熟女俱乐部一区二区视频在线 | 日日噜噜夜夜狠狠久久丁香五月 |