文档章节

Android源码分享-自动换行LinearLayout

丁佳辉
 丁佳辉
发布于 2015/09/19 13:08
字数 484
阅读 4012
收藏 8

Android开发中,很多人会遇到满行就自动换到下一行的界面需求,而Android自带的LinearLayout布局自能横排或者竖排,不够显示就加ScrollView,横竖混排就不行了。这里给大家分享一个可以实现自动换行的LinearLayout。

import java.util.Hashtable;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

/**
* 自动换行的LinearLayout
* @author idengpan
*
*/
@SuppressWarnings({ “unchecked”,”rawtypes” })
public class AutoNextLineLinearlayout extends LinearLayout {
int mLeft, mRight, mTop, mBottom;
Hashtable map = new Hashtable();

public AutoNextLineLinearlayout(Context context) {
super(context);
}

public AutoNextLineLinearlayout(Context context, int horizontalSpacing, int verticalSpacing) {
super(context);
}

public AutoNextLineLinearlayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int mWidth = MeasureSpec.getSize(widthMeasureSpec);
int mCount = getChildCount();
int mX = 0;
int mY = 0;
mLeft = 0;
mRight = 0;
mTop = 5;
mBottom = 0;

int j = 0;

View lastview = null;
for (int i = 0; i < mCount; i++) {
final View child = getChildAt(i);

child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
// 此处增加onlayout中的换行判断,用于计算所需的高度
int childw = child.getMeasuredWidth();
int childh = child.getMeasuredHeight();
mX += childw; // 将每次子控件宽度进行统计叠加,如果大于设定的高度则需要换行,高度即Top坐标也需重新设置

Position position = new Position();
mLeft = getPosition(i – j, i);
mRight = mLeft + child.getMeasuredWidth();
if (mX >= mWidth) {
mX = childw;
mY += childh;
j = i;
mLeft = 0;
mRight = mLeft + child.getMeasuredWidth();
mTop = mY + 5;
// PS:如果发现高度还是有问题就得自己再细调了
}
mBottom = mTop + child.getMeasuredHeight();
mY = mTop; // 每次的高度必须记录 否则控件会叠加到一起
position.left = mLeft;
position.top = mTop + 3;
position.right = mRight;
position.bottom = mBottom;
map.put(child, position);
}
setMeasuredDimension(mWidth, mBottom);
}

@Override
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams(0, 0); // default of 1px spacing
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {

int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
Position pos = (Position) map.get(child);
if (pos != null) {
child.layout(pos.left, pos.top, pos.right, pos.bottom);
} else {
Log.i(“MyLayout”, “error”);
}
}
}

private class Position {
int left, top, right, bottom;
}

public int getPosition(int IndexInRow, int childIndex) {
if (IndexInRow > 0) {
return getPosition(IndexInRow – 1, childIndex – 1) + getChildAt(childIndex – 1).getMeasuredWidth() + 8;
}
return getPaddingLeft();
}
}

用法和普通的LinearLayout类似,在XML布局文件中写入这个自定义类的完整路径,将android:orientation属性指定为horizontal(默认)即可。


© 著作权归作者所有

丁佳辉
粉丝 20
博文 452
码字总数 206257
作品 0
浦东
程序员
私信 提问
加载中

评论(2)

萌神小饭
自己设置添加进去的子VIEW啊
c
czw691075524
请问如何设置各个AutoNextLineLinearlayout 的间距的?
android布局求助..

这是我的布局代码: LinearLayout里面嵌套一个LinearLayout 和RelativeLayout, RelativeLayout和 LinearLayout 是分开了 android:layout_weight 一个是设置的是1 一个是2 但是当没有imagevi...

小0
2011/07/22
705
5
APP性能之终端兼容优化分享

对于种类繁多Android设备适配. 对开发者来说, 也是除了应用逻辑以外需要重点考虑的一个重要因素. 因为这点将会直接影响到用户对应用的印象和体验. Google对此也出了很多应对措施来解决Andro...

长平狐
2012/10/09
126
0
不可忽视的布局属性layout_weight,彻底纠正网上很多对于该属性的片面理解

Android:layout_weight详解 中文定义: 在一个布局组件中(例如:LinearLayout)中各个子元素的对于剩余空间的使用权重。 默认:android:layout_weight= 0 默认情况下,布局模式以android:h...

迷途d书童
2012/03/05
535
0
用activity实现半透明的、淡入的menu【原创】

用activity实现半透明的、淡入的menu—供初学者研究学习 虽然android带的menu已经很漂亮,但有的时候也需要我们去自定义menu。 开始的时候只是想在android上做一个半透明的menu,但是刚刚接触...

长平狐
2012/08/14
535
0
用activity实现半透明的、淡入的menu【原创】

用activity实现半透明的、淡入的menu—供初学者研究学习 虽然android带的menu已经很漂亮,但有的时候也需要我们去自定义menu。 开始的时候只是想在android上做一个半透明的menu,但是刚刚接触...

长平狐
2012/08/09
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部