今天就跟大家聊聊有关Android中怎么利用ViewGroup自定义布局,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
10年积累的成都网站设计、网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有菏泽免费网站建设让你可以放心的选择与我们合作。首先,如果是一个 LinearLayout 那么当设置 wrap_content 时,他就会以子空间中最宽的那个为它的宽度。同时在高度方面会是所有子控件高度的总和。所以我们先写两个方法,分别用于测量 ViewGroup 的宽度和高度。
private int getMaxWidth(){ int count = getChildCount(); int maxWidth = 0; for (int i = 0 ; i < count ; i ++){ int currentWidth = getChildAt(i).getMeasuredWidth(); if (maxWidth < currentWidth){ maxWidth = currentWidth; } } return maxWidth; } private int getTotalHeight(){ int count = getChildCount(); int totalHeight = 0; for (int i = 0 ; i < count ; i++){ totalHeight += getChildAt(i).getMeasuredHeight(); } return totalHeight; }
对于 ViewGroup 而言我们可以粗略的分为两种模式:固定长宽模式(match_parent),自适应模式(wrap_content),根据这两种模式,就可以对 ViewGroup 的绘制进行划分。这里关于 measureChildren 这个方法,他是用于将所有的子 View 进行测量,这会触发每个子 View 的 onMeasure 函数,但是大家要注意要与 measureChild 区分,measureChild 是对单个 view 进行测量
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measureChildren(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int heightMode= MeasureSpec.getMode(heightMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST){ int groupWidth = getMaxWidth(); int groupHeight= getTotalHeight(); setMeasuredDimension(groupWidth, groupHeight); }else if (widthMode == MeasureSpec.AT_MOST){ setMeasuredDimension(getMaxWidth(), height); }else if (heightMode == MeasureSpec.AT_MOST){ setMeasuredDimension(width, getTotalHeight()); } }
重写 onLayout
整完上面这些东西,我们的布局大小七十九已经出来了,然我们在活动的布局文件里面加上它,并添加上几个子 View 然后运行一下,先看看效果:
运行效果如下:
我们看见布局出来了,大小好像也没啥问题,但是子 View 呢??! 这么没看见子 View 在看看代码,系统之前然我们重写的 onLayout() 还是空着的呀!!也就是说,子 View 的大小和位置根本就还没有进行过设定!让我们来重写下 onLayout() 方法。
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int count = getChildCount(); int currentHeight = 0; for (int i = 0 ; i < count ; i++){ View view = getChildAt(i); int height = view.getMeasuredHeight(); int width = view.getMeasuredWidth(); view.layout(l, currentHeight, l + width, currentHeight + height); currentHeight += height; } }
看完上述内容,你们对Android中怎么利用ViewGroup自定义布局有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。