viewgroup简单说就是可以装view的view.今天遇到一个问题,就是需要一个可以自动根据一行中view的宽度自动换行的布局,网上找了下,没有相关的例子,但是找到了思路:自定义一个viewgroup,然后在onlayout文件里面自动检测view的右边缘的横坐标值,和你的view的parent view的况度判断是否换行显示view就可以了。因为代码比较简单,就不多说了:
1 public class MyViewGroup extends ViewGroup { 2 private final static String TAG = "MyViewGroup"; 3 4 private final static int VIEW_MARGIN=2; 5 6 public MyViewGroup(Context context) { 7 super(context); 8 } 9 @Override 10 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 11 Log.d(TAG, "widthMeasureSpec = "+widthMeasureSpec+" heightMeasureSpec"+heightMeasureSpec); 12 13 for (int index = 0; index < getChildCount(); index++) { 14 final View child = getChildAt(index); 15 // measure16 child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 17 } 18 19 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 20 } 21 22 @Override 23 protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { 24 Log.d(TAG, "changed = "+arg0+" left = "+arg1+" top = "+arg2+" right = "+arg3+" botom = "+arg4); 25 final int count = getChildCount(); 26 int row=0;// which row lay you view relative to parent27 int lengthX=arg1; // right position of child relative to parent28 int lengthY=arg2; // bottom position of child relative to parent29 for(int i=0;i<count;i++){ 30 31 final View child = this.getChildAt(i); 32 int width = child.getMeasuredWidth(); 33 int height = child.getMeasuredHeight(); 34 lengthX+=width+VIEW_MARGIN; 35 lengthY=row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2; 36 //if it can't drawing on a same line , skip to next line37 if(lengthX>arg3){ 38 lengthX=width+VIEW_MARGIN+arg1; 39 row++; 40 lengthY=row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2; 41 42 } 43 44 child.layout(lengthX-width, lengthY-height, lengthX, lengthY); 45 } 46 47 } 48 49 }
这里有个地方要注意,那就要明白ViewGroup的绘图流程:ViewGroup绘制包括两个步骤:1.measure 2.layout
在两个步骤中分别调用回调函数:1.onMeasure() 2.onLayout()
1.onMeasure() 在这个函数中,ViewGroup会接受childView的请求的大小,然后通过childView的 measure(newWidthMeasureSpec, heightMeasureSpec)函数存储到childView中,以便childView的getMeasuredWidth() andgetMeasuredHeight() 的值可以被后续工作得到。
2.onLayout() 在这个函数中,ViewGroup会拿到childView的getMeasuredWidth() andgetMeasuredHeight(),用来布局所有的childView。
3.View.MeasureSpec 与 LayoutParams 这两个类,是ViewGroup与childView协商大小用的。其中,View.MeasureSpec是ViewGroup用来部署 childView用的, LayoutParams是childView告诉ViewGroup 我需要多大的地方。
4.在View 的onMeasure的最后要调用setMeasuredDimension()这个方法存储View的大小,这个方法决定了当前View的大小。
效果图:
相关推荐
`LayoutAnimationController`是Android SDK中一个强大的工具,它允许开发者在布局加载或者更新时,为ViewGroup的所有子视图定义动画。这种动画控制器可以使得视图的显示或消失过程更加流畅和有趣,例如淡入淡出、...
在本文中,我们将探讨如何为自定义的ViewGroup添加布局动画,以实现更丰富的交互体验。在之前的章节中,我们已经学习了补间动画、逐帧动画和属性动画,这些主要是针对单个View进行操作。而当我们需要对整个布局或者...
总的来说,Android自定义不规则七巧板布局是一个涉及图形绘制、ViewGroup布局管理的高级话题。它需要开发者具备扎实的Android基础知识,同时激发了无限的创新可能。通过理解和运用这一技术,开发者能够打造出独具...
在Android开发中,自定义ViewGroup是实现特定布局需求的重要手段。百分比布局是一种能够根据父容器大小动态调整子视图大小的布局方式,尤其在响应式设计中非常实用。本示例是一个非Google官方提供的百分比布局实现,...
在Android开发中,自定义ViewGroup是实现复杂布局或创新交互设计的重要手段。本文将深入探讨如何创建一个自定义的“流式布局”(MyFlowLayout),这个布局会根据屏幕尺寸自动调整子视图的位置,使其从左到右、从上到...
在Android开发中,自定义ViewGroup是实现个性化布局的关键步骤,尤其当标准的布局组件无法满足特定需求时。本文将深入探讨如何通过自定义ViewGroup实现瀑布流式布局,这是一种常用于图片展示,如电商应用商品展示的...
在Android开发中,自定义ViewGroup是实现复杂布局和交互效果的重要手段。本文将深入探讨如何创建一个自定义的ViewGroup,并将一个TextView显示在其中。我们将基于标题“自定义ViewGroup 显示一个TextView到ViewGroup...
"Android-可以指定圆角的ViewGroup"这个主题聚焦于如何在Android应用中实现自定义的布局,使得其子视图能够具有可定制的圆角效果。 在Android Studio中,开发者通常会使用XML布局文件来定义视图结构。然而,原生的...
本教程将聚焦于如何继承`ViewGroup`来构建自定义布局,并实现拖动效果以及增删元素时的动画操作。 首先,让我们了解`ViewGroup`。`ViewGroup`是Android UI层次结构中的容器类,它负责管理子视图(`View`或`...
在Android开发中,自定义ViewGroup是实现特定布局效果的重要手段。本教程将深入探讨如何通过自定义ViewGroup来实现一个流式布局(FlowLayout)的示例,这在展示多个小图标或者创建类似瀑布流的效果时非常有用。流式...
要实现"android横向滚动listview",首先需要理解Android的ViewGroup布局机制。ListView实际上是一个基于Adapter的ViewGroup,它可以根据Adapter提供的数据动态生成并管理多个View。对于横向滚动的需求,我们不能直接...
本篇文章将深入探讨如何通过继承`ViewGroup`来实现一个自定义的流式布局。流式布局是一种常见的布局方式,它允许子视图按照指定的方向(通常是水平或垂直)流动排列,当一行或一列填满时自动换行或换列。 首先,...
总的来说,自定义ViewGroup实现流式布局涉及Android的视图系统、测量和布局过程。这需要开发者对Android框架有深入的理解,以便灵活地定制视图的行为。在实际开发中,这种自定义布局能力可以帮助我们更好地控制UI,...
创建自定义的`ViewGroup`可以帮助开发者实现复杂的布局效果,提供更高效的性能优化,以及满足独特设计需求。本篇文章将深入探讨如何创建自定义的`ViewGroup`以及理解Android绘制视图的过程。 首先,我们来了解`...
在Android开发中,自定义ViewGroup是创建复杂布局或实现特定功能的重要手段。"android自定义viewgroup实现等分格子布局"这个话题涉及到如何利用自定义ViewGroup类来创建一个能够平均分配屏幕空间的网格布局。下面...
在这个名为"ViewGroupDemo1"的示例中,我们将深入探讨ViewGroup的工作原理、布局管理以及如何自定义ViewGroup来实现复杂布局。 一、ViewGroup基础 1. 角色与功能:ViewGroup作为视图层次结构的一部分,负责组织和...
在Android开发中,ViewGroup是布局管理器的基础类,它是一种可以包含多个子视图(View)的容器。当我们需要自定义复杂的布局或者有特殊需求的控件时,常常会继承自ViewGroup。本篇文章将深入探讨如何在Android中继承...
ViewGroup充当了布局的角色,可以决定子视图的位置和大小,同时它也是实现复杂界面和导航页面的关键。本实例主要探讨如何利用ViewGroup来创建一个导航页面。 首先,理解ViewGroup的基本概念。ViewGroup是Android ...
这时,我们可以使用`ViewGroup`的优化技巧,如复用已有的测量结果、避免不必要的测量和布局,以及使用`ViewTreeObserver`来监听布局变化,适时进行操作。 文件`zhy_custom_viewgroup02`可能是示例项目的源码,包含...
开发者可以根据需求选择不同的`ViewGroup`子类来实现各种布局效果,如线性布局(LinearLayout)、相对布局(RelativeLayout)、表格布局(TableLayout)和帧布局(FrameLayout)等。 1. **基本概念:** - `...