读书人

两列格局

发布时间: 2012-09-10 11:02:32 作者: rapoo

两列布局


?import java.lang.Math;?
import android.view.View;?
import android.view.ViewGroup;?
import android.content.Context;?
import android.util.AttributeSet;?
?
public class SideLayout extends ViewGroup {?
?
? ? private int max_wid, max_hgt;?
?
? ? public SideLayout(Context ctx) {?
? ? ? super(ctx);?
? ? }?
?
? ? public SideLayout(Context ctx, AttributeSet attrs) {?
? ? ? super(ctx, attrs);?
? ? }?
?
? ? public SideLayout(Context ctx, AttributeSet attrs, int defStyle) {?
? ? ? super(ctx, attrs, defStyle);?
? ? }?
?
? ? @Override?
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)?
? ? {?
? ? ? ? final int num_children = getChildCount();?
?
? ? ? ? // Since this is a special-purpose widget, this is brute simple. ?All?
? ? ? ? // of our children will have sizes of wrap_content, so we query them?
? ? ? ? // all, then make a second pass assigning their final sizes.?
?
? ? ? ? max_wid = 0;?
? ? ? ? max_hgt = 0;?
? ? ? ? for( int i = 0; i < num_children; ++i )?
? ? ? ? {?
? ? ? ? ? ? final View child = getChildAt(i);?
? ? ? ? ? ? if( child != null && child.getVisibility() != View.GONE )?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? measureChild(child, widthMeasureSpec, heightMeasureSpec);?
? ? ? ? ? ? ? ? max_wid = Math.max(max_wid, child.getMeasuredWidth());?
? ? ? ? ? ? ? ? max_hgt = Math.max(max_hgt, child.getMeasuredHeight());?
? ? ? ? ? ? }?
? ? ? ? }?
?
? ? ? ? // Make a second pass, tell children the actual size they got.?
? ? ? ? for( int i = 0; i < num_children; ++i )?
? ? ? ? {?
? ? ? ? ? ? final View child = getChildAt(i);?
? ? ? ? ? ? if( child != null && child.getVisibility() != View.GONE )?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? child.measure(?
? ? ? ? ? ? ? ? ? MeasureSpec.makeMeasureSpec(max_wid, MeasureSpec.EXACTLY),?
? ? ? ? ? ? ? ? ? MeasureSpec.makeMeasureSpec(max_hgt, MeasureSpec.EXACTLY));?
? ? ? ? ? ? }?
? ? ? ? }?
?
? ? ? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec);?
? ? }?
?
? ? @Override?
? ? protected void onLayout(boolean changed, int l, int t, int r, int b)?
? ? {?
? ? ? ? final int num_children = getChildCount();?
? ? ? ? int x,y;?
?
? ? ? ? if( num_children <= 0 )?
? ? ? ? ? return;?
?
? ? ? ? // Split the children into two groups, left and right. ?Each?
? ? ? ? // column is evenly-spaced.?
?
? ? ? ? int wid = r - l;?
? ? ? ? int hgt = b - t;?
? ? ? ? int nrow = (num_children + 1) / 2;?
? ? ? ? int margin = (hgt - max_hgt * nrow) / (nrow + 1);?
?
? ? ? ? int i = 0;?
? ? ? ? for( int col = 0; col < 2; ++col ) {?
? ? ? ? ? ? x = col == 0 ? 0 : wid - max_wid;?
? ? ? ? ? ? y = margin;?
? ? ? ? ? ? for( int row = 0; row < nrow; ++row, ++i ) {?
? ? ? ? ? ? ? ? if( i < num_children ) {?
? ? ? ? ? ? ? ? ? ? final View child = getChildAt(i);?
? ? ? ? ? ? ? ? ? ? if( child != null && child.getVisibility() != View.GONE )?
? ? ? ? ? ? ? ? ? ? ? child.layout(x, y, x+max_wid, y+max_hgt);?
? ? ? ? ? ? ? ? }?
? ? ? ? ? ? ? ? y += margin + max_hgt;?
? ? ? ? ? ? } ? ?
? ? ? ? } ? ?
? ? } ? ?
}?

读书人网 >移动开发

热点推荐