- 无聊中的我随手敲一个流布局的核心部分代码,后续再封装成一个工具类
- 运行效果图
ViewGroup01 .java
package -----------------------------------------
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
public class ViewGroup01 extends ViewGroup {
public ViewGroup01(Context context) {
this(context,null);
}
public ViewGroup01(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public ViewGroup01(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setBackgroundColor(Color.WHITE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int w = 0;
int h = 0;
int width=getResources().getDisplayMetrics().widthPixels;
int childCount=getChildCount();
for (int i=0;i<childCount;i++){
View measureView=getChildAt(i);
measureChild(measureView,widthMeasureSpec,heightMeasureSpec);
int childWidth=measureView.getMeasuredWidth();
int childHeight=measureView.getMeasuredHeight();
if(h==0){
h = childHeight;
}
w+=childWidth;
if (w > width ){
w=childWidth;
h+=childHeight;
}
}
setMeasuredDimension(width,h);
}
/**
* 像素装dp
*
* @param px
* @return
*/
public int pxToDp(int px){
float scale = getResources().getDisplayMetrics().density;
float dp= (px/scale+0.5f);
return (int) dp;
}
/**
* 测量高度
*
* @param heightMeasureSpec
* @return
*/
private int MeasureHeight(int heightMeasureSpec) {
int MeasureHeight = 0;
int heightSize=MeasureSpec.getSize(heightMeasureSpec);
int heightMode=MeasureSpec.getMode(heightMeasureSpec);
int AT_MOST_H = 200;
if (heightMode==MeasureSpec.EXACTLY){
MeasureHeight = heightSize;
}else {
if (heightMode==MeasureSpec.AT_MOST){
MeasureHeight = Math.min(AT_MOST_H,heightSize);
}
}
return MeasureHeight;
}
/**
* 测量宽度
*
* @param widthMeasureSpec
* @return
*/
private int MeasureWidth(int widthMeasureSpec) {
int MeasureWidth = 0;
int widthSize=MeasureSpec.getSize(widthMeasureSpec);
int widthMode=MeasureSpec.getMode(widthMeasureSpec);
int AT_MOST_W = 200;
if (widthMode==MeasureSpec.EXACTLY){
MeasureWidth = widthSize;
}else {
if (widthMode==MeasureSpec.AT_MOST){
MeasureWidth = Math.min(AT_MOST_W,widthSize);
}
}
return MeasureWidth;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int w = 0;
int h = 0;
int childCount=getChildCount();
for (int i=0;i<childCount;i++){
View measureView=getChildAt(i);
int childWidth=measureView.getMeasuredWidth();
int childHeight=measureView.getMeasuredHeight();
/**
* 这里是重点啊为什么 加一个childWidth
*
* 因为layout(w,h,childWidth+w,h+childHeight); 中的w是从0开始的
*
* 如果不加childWidth 那么整行会往后移动一个节点的子view的宽度
*
*/
if ((w +childWidth) > getWidth()){
w = 0;
h+=childHeight;
}
measureView.layout( w, h,childWidth+w,h+childHeight);
w+=childWidth;
}
}
}
xml文件
<com.live.jbhlivemobilev2.view.ViewGroup01
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/><Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/><Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/><Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/><Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/><Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/><Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打饭示范点打饭示范点打饭示范点"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="点"/>
</com.live.jbhlivemobilev2.view.ViewGroup01>