android自定义viewgroup之我也玩瀑布流
先看效果图吧,
继上一篇《android自定义viewgroup实现等分格子布局》中实现的布局效果,这里稍微有些区别,每个格子的高度不规则,就是传说的瀑布流布局,一般实现这种效果,要么用第三方控件,如果不是加载图片还可以直接写在xml中实现,不过代码会很多的;
下面我重写了viewgroup,实现onMeasure,onLayout方法,动态设置每个布局的高度,这里有一个小的技巧,一般我们自定义的控件,嵌套在scrollview中显示不全,这个问题也纠结我一小会,不过当你打开scrollview的源码,你会发现有一个地方,同时可以理解scrollview中嵌套viewpager,gridview,listview时候会显示不全的问题
下面是自定义viewgroup的全部代码:
package com.allen.view; import com.allen.mygridlayout.R; import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.MeasureSpec; /**
* @package:com.fumei.letao.views
* @author:Allen
* @email:jaylong1302@163.com
* @data:2013年11月26日 下午8:39:51
* @description:瀑布流视图
*/
public class WaterfullLayout extends ViewGroup { final String tag = "balance"; // 列数
int columns = 2;
// 行数
int rows = 0;
// 边距
int margin = 10;
// 子视图数量
int count = 0;
private int mMaxChildWidth = 0;
private int mMaxChildHeight = 0; public WaterfullLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (attrs != null) {
TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.MyGridLayout);
columns = a.getInteger(R.styleable.MyGridLayout_numColumns, 2);
margin = (int) a.getInteger(R.styleable.MyGridLayout_itemMargin, 2);
}
} public WaterfullLayout(Context context, AttributeSet attrs) {
super(context, attrs, 0);
// TODO Auto-generated constructor stub
} public WaterfullLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { mMaxChildWidth = 0;
mMaxChildHeight = 0; count = getChildCount();
if (count == 0) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
rows = count % columns == 0 ? count / columns : count / columns + 1;// 行数
int top[] = new int[columns];
for (int i = 0; i < rows; i++) {// 遍历行
for (int j = 0; j < columns; j++) {// 遍历每一行的元素
View child = this.getChildAt(i * columns + j);
if (child == null)
break;
ViewGroup.LayoutParams lp = child.getLayoutParams(); if (child.getVisibility() == GONE) {
continue;
} child.measure(MeasureSpec.makeMeasureSpec(
MeasureSpec.getSize(widthMeasureSpec),
MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
lp.height, MeasureSpec.AT_MOST));
top[j] += lp.height + margin;
mMaxChildWidth = Math.max(mMaxChildWidth,
child.getMeasuredWidth());
} } setMeasuredDimension(resolveSize(mMaxChildWidth, widthMeasureSpec),
resolveSize(getMax(top) + margin, heightMeasureSpec)); } @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
int height = b - t;// 布局区域高度
int width = r - l;// 布局区域宽度 if (count == 0)
return; int gridW = (width - margin * (columns + 1)) / columns;// 格子宽度
int gridH = 0;// 格子高度 int left = 0;
int top[] = new int[columns]; for (int i = 0; i < rows; i++) {// 遍历行
for (int j = 0; j < columns; j++) {// 遍历每一行的元素
View child = this.getChildAt(i * columns + j);
if (child == null)
return;
ViewGroup.LayoutParams lp = child.getLayoutParams(); child.measure(MeasureSpec.makeMeasureSpec(gridW,
MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
lp.height, MeasureSpec.AT_MOST)); // 如果最后有一个对其的标志,为了底部对其
if (child.getTag() != null && child.getTag().equals(tag)) {
child.measure(MeasureSpec.makeMeasureSpec(gridW,
MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
getMax(top) - top[j], MeasureSpec.EXACTLY));
gridH = getMax(top) - top[j];
left = j * gridW + margin * (j + 1);
child.layout(left, top[j] + margin, left + gridW, top[j]
+ gridH);
break;
} gridH = lp.height;
left = j * gridW + margin * (j + 1);
top[j] += margin;
child.layout(left, top[j], left + gridW, top[j] + gridH);
top[j] += gridH;
} }
} /** 计算整体布局高度,为了在嵌套在scrollview中能显示出来 */
private int getMax(int array[]) {
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (max < array[i])
max = array[i];
}
return max;
} }
所有demo工程点击这里下载:click me!!!
android自定义viewgroup之我也玩瀑布流的更多相关文章
- Android自定义ViewGroup
视图分类就两类,View和ViewGroup.ViewGroup是View的子类,ViewGroup可以包含所有的View(包括ViewGroup),View只能自我描绘,不能包含其他View. 然而 ...
- Android自定义ViewGroup,实现自动换行
学习<Android开发艺术探索>中自定义ViewGroup章节 自定义ViewGroup总结的知识点 一.自定义ViewGroup中,onMeasure理解 onMeasure(int ...
- android自定义viewgroup实现等分格子布局
先上效果图: 实现这样的效果: 一般的思路就是,直接写布局文件,用LinearLayout 嵌套多层子LinearLayout,然后根据权重layout_weight可以达到上面的效果 还有就是利用g ...
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu
示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...
- Android自定义ViewGroup(四、打造自己的布局容器)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51500304 本文出自:[openXu的博客] 目录: 简单实现水平排列效果 自定义Layo ...
- android自定义viewgroup初步之一----抽屉菜单
转载请注明出处 http://blog.csdn.net/wingichoy/article/details/47832151 几天前在慕课网上看到鸿洋老师的 自定义卫星菜单,感觉很有意思,于是看完视 ...
- Android 自定义ViewGroup手把手教你实现ArcMenu
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这 ...
- Android -- 自定义ViewGroup实现FlowLayout效果
1,在开发的时候,常在我们的需求中会有这种效果,添加一个商品的一些热门标签,效果图如下: 2,从上面效果可以看得出来,这是一个自定义的ViewGroup,然后实现换行效果,让我们一起来实现一下 自定义 ...
随机推荐
- 尝试在Linux上编译KestrelHttpServer
Kestrel是目前在非Windows平台上运行ASP.NET 5应用程序的唯一可用Web服务器,但微软似乎将它冷落在一边,源代码更新很慢. 今天试着在Linux上编译Kestrel的源代码,遇到了很 ...
- ASP.NET的一次奇遇:UserControl写成Control引发的w3wp进程崩溃
昨天在写代码中一不小心将UserControl写成了Control,将原来应该继承自System.Web.UI.UserControl的用户控件,比如下面的BlogStats: <%@ Cont ...
- Jquery最全过滤器总结
不管什么时候,总是有这么些时候:当我们使用jQuery的各种过滤器时,总是有那么几个记不牢,还要搜索一下或者翻翻手册!多少次想总结一下,最终都没总结,现在网上找到一篇总结的不错的,但是排版有点乱,本人 ...
- 带你看懂Dictionary的内部实现
了解Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快,那么Dictionary是如何实现的呢? Dictionary的构造 下面的代码我看看Dictionary在构 ...
- 有关HTML5 Video对象的ontimeupdate事件的问题
日前在做一个视频播放的页面,其中用到了HTML5的Video对象,这个是HTML5中新增的一个对象,支持多种不同格式的视频在线播放,功能比较强大,而且还扩展了许多事件,可以通过JavaScript脚本 ...
- mysql 5.7 win7 压缩版安装
1.下载mysql压缩版并解压: 2.复制my-defualt.ini , 命名为my.ini; 3. 3.1 运行在下图bin目录下运行:mysqld --install 安装mysql服务: ...
- Leetcode 203 Remove Linked List Elements 链表
去掉链表中相应的元素值 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next ...
- Spring对象绑定与类型转换
Spring对象绑定与类型转换 Spring的框架体系中,到处充斥着对象绑定从bean的初始化autowired属性,SpringMvc 中对对象的绑定等.Spring对象绑定和类型转换在Spring ...
- hive函数总结
转自:http://www.cnblogs.com/end/archive/2012/06/18/2553682.html 1.内置运算符1.1关系运算符 运算符 类型 说明 A = B 所有原始类型 ...
- PHP一个典型的闭包实例
<?php // 一个基本的购物车,包括一些已经添加的商品和每种商品的数量. // 其中有一个方法用来计算购物车中所有商品的总价格,该方法使 // 用了一个 closure 作为回调函数. cl ...