自定义流式布局

原创 2015年11月17日 18:56:34

//自定义VIewGroup需要重写以下的方法

1,onmeasure::测量子VIew的宽和高 ,设置自己的宽和高 

2,onlayout :设置子View的位置

onmeasure:根据子View的布局文件,为子View设置测量模式和测量值。

测量=测量模式+测量值;

测量模式:3种:
1,EXACTLY(精确的): 100dp,match_parent

2. AT_MOST(至多): wrapcontent

3, UNSPCIFIED (无限制):子控件想要多大就给多大 (很少用到)

关于VIewGroup--LayoutParams

子VIew.getLayoutParams();//获取到的是子View的父控件的layoutparams



package com.example.viewGroup;


import java.util.ArrayList;
import java.util.List;


import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;


public class MyviewGroup extends ViewGroup {


public MyviewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}


// 设置子View的getLayoutParams()方法获取到的信息
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
// TODO Auto-generated method stu
return new MarginLayoutParams(getContext(), attrs);
}


// 测量VIewGroup和子VIew 的宽度和高度
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int ModeWidth = MeasureSpec.getMode(widthMeasureSpec);
int sizeHeigth = MeasureSpec.getSize(heightMeasureSpec);
int ModeHeight = MeasureSpec.getMode(heightMeasureSpec);


// 当设置为Wrap_content时候计算的宽和高度
int width = 0;
int height = 0;


int cCount = getChildCount();// 获取孩子的个数
int LineWidth = 0;
int LineHeight = 0;
for (int i = 0; i < cCount; i++) {
View child = getChildAt(i);
measureChild(child, widthMeasureSpec, heightMeasureSpec);
MarginLayoutParams p = (MarginLayoutParams) child.getLayoutParams();
int childWidth = child.getMeasuredWidth() + p.leftMargin
+ p.rightMargin;
int childHeigth = child.getMeasuredHeight() + p.topMargin
+ p.bottomMargin;


if (LineWidth + childWidth > sizeWidth) {// 换行
height += LineHeight;
LineHeight = childHeigth;
width = Math.max(LineWidth, width);
LineWidth = childWidth;
} else {// 不换行
LineWidth += childWidth;
LineHeight = Math.max(LineHeight, childHeigth);
}


}
// 处理最后一行
width = Math.max(LineWidth, width);
height += LineHeight;
System.out.println("sizeWidth==" + sizeWidth);
System.out.println("sizeHeigth==" + sizeHeigth);


setMeasuredDimension(ModeWidth == MeasureSpec.EXACTLY ? sizeWidth
: width, ModeHeight == MeasureSpec.EXACTLY ? sizeHeigth
: height);
}


private List<List<View>> AllViews = new ArrayList<List<View>>();
private List<Integer> lineHeights = new ArrayList<Integer>();


// 设置子View的位置
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
// TODO Auto-generated method stub
AllViews.clear();
lineHeights.clear();// 会多次调用
lineHeights = new ArrayList<Integer>();
int width = getWidth();
int cCount = getChildCount();
int lineWidth = 0;
int lineHeight = 0;
List<View> lineViews = new ArrayList<View>();
for (int i = 0; i < cCount; i++) {
View child = getChildAt(i);
MarginLayoutParams p = (MarginLayoutParams) child.getLayoutParams();
int childWidth = child.getMeasuredWidth() + p.leftMargin
+ p.rightMargin;
int childHeigth = child.getMeasuredHeight() + p.topMargin
+ p.bottomMargin;
if (lineWidth + childWidth > width) {// 要换行
AllViews.add(lineViews);
lineHeights.add(lineHeight);
lineWidth = 0;
lineHeight = childHeigth;
lineViews = new ArrayList<View>();
System.out.println("换行了");
}
lineViews.add(child);
lineWidth += childWidth;
lineHeight = Math.max(lineHeight, childHeigth);


}
// 处理最后的一行
AllViews.add(lineViews);
lineHeights.add(lineHeight);


int top = 0;
int left = 0;
for (int i = 0; i < AllViews.size(); i++) {
lineViews = AllViews.get(i);
int current_width = 0;
int currentHeigth = lineHeights.get(i);


for (int j = 0; j < lineViews.size(); j++) {
View view = lineViews.get(j);
MarginLayoutParams p = (MarginLayoutParams) view
.getLayoutParams();
int shang = top;
int xia = top + currentHeigth;
int zuo = left + p.leftMargin;
int you = left + p.leftMargin + view.getMeasuredWidth();
left += p.leftMargin + view.getMeasuredWidth() + p.rightMargin;
view.layout(zuo, shang, you, xia);
}
left = 0;
top += currentHeigth;
}
}


}

版权声明:本文为博主原创文章,未经博主允许不得转载。

android自定义流式布局源码

  • 2015年05月05日 20:26
  • 1.37MB
  • 下载

自定义实现流式布局

  • 2017年01月14日 22:31
  • 6.55MB
  • 下载

【Android】掌握自定义LayoutManager(二) 实现流式布局

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52956504 本文出自:【张旭童的博客】 本系列文章相关代码传送门: 自...
  • zxt0601
  • zxt0601
  • 2016年10月28日 17:58
  • 13112

Android自定义ViewGroup-----流式布局

  • 2016年08月30日 16:35
  • 294KB
  • 下载

自定义View流式布局

  • 2016年11月02日 18:50
  • 25.7MB
  • 下载

100行Android代码自定义一个流式布局-FlowLayout

通过不到100行代码,模仿css3的flexbox功能,实现一个Android的流式布局。同时介绍了如何把打出来的aar包upload到jCenter。...
  • FeeLang
  • FeeLang
  • 2015年02月16日 22:00
  • 16142

android自定义流式布局

  • 2017年06月28日 08:51
  • 2KB
  • 下载

Android 自定义瀑布流式布局

  • 2017年03月20日 16:37
  • 6.75MB
  • 下载

自定义ViewGroup,流式布局FlowLayout

本文参考了【张鸿洋的博客】: Android 手把手教您自定义ViewGroup(一)和Android 自定义ViewGroup 实战篇 -> 实现FlowLayout 在很多应用里面,我们能看到类似...
  • krubo1
  • krubo1
  • 2016年03月24日 16:24
  • 316

自定义流式布局

  • 2015年01月06日 17:24
  • 1.6MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义流式布局
举报原因:
原因补充:

(最多只允许输入30个字)