您的位置:首页 > 其它

自动换行的线性布局

2015-12-14 15:28 204 查看
由于线性布局在横向时,控件较多超出屏幕也不会自行换行所以只好自己来实现了。

代码如下:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.ordering.util.Tools;

/**自动换行的线性布局
* Created by huangqx on 2015-11-17 13:25.
*/
public class MyLinearLayout extends LinearLayout {
private int width;//组件宽
private int height;//组件高
private int childCount;
private int childMarginLeft = Tools.dip2px(getContext(),8);//子控件相对左边控件的距离
private int childMarginHorizonTal = Tools.dip2px(getContext(),10);//子控件相对最左、最右的距离
private int childMarginTop = Tools.dip2px(getContext(),8);//子控件相对顶部控件的距离
private int childWidth=104;//子控件宽
private int childHeight;//子控件高
private int number=5;
private int padding=6;

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

public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
//计算控件及其子控件所占区域
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
childCount = getChildCount();//得到子控件数量
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
if(childCount>0) {
Paint pFont = new Paint();
for (int i = 0; i < childCount; i++) {
TextView childView =(TextView)getChildAt(i);//得到当前子控件
String text=String.valueOf(childView.getText());
float strwid = pFont.measureText(text);
if(strwid>childWidth){
childWidth=(int)strwid+padding;
number= width/(childWidth+childMarginLeft);
System.out.println("个数:"+number);
childWidth = (width - childMarginLeft * number) / number;
}
}
childHeight = Tools.dip2px(getContext(), 39);//给子控件的高度一个定值
//根据子控件的高和子控件数目得到自身的高
height = childHeight * ((childCount-1)/ number+1) + childMarginHorizonTal * 2 + childMarginTop*((childCount-1)/number);
Log.d("childHeight",childHeight+"");
}else {
//如果木有子控件,自身高度为0,即不显示
height = 0;
}
Log.d("height",height+"");
Log.d("childWidth",childWidth+"");
//根据自身的宽度约束子控件宽度
measureChildren(widthMeasureSpec, heightMeasureSpec);
//设置自身宽度
setMeasuredDimension(width, height);
}
//控制子控件的换行
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
/**
* 遍历所有子控件,并设置它们的位置和大小
* 每行只能有number个子控件,且高度固定,宽度相同,且每行正好布满
*/
for (int i = 0; i < childCount; i++) {
TextView childView =(TextView)getChildAt(i);//得到当前子控件
childView.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL);
childView.layout((i%number) * childWidth + (i%number+1)*childMarginLeft
, (i / number)*childHeight + childMarginHorizonTal + (i / number)*childMarginTop
, (i%number+1) * childWidth + (i%number+1)*childMarginLeft
, (i / number+1)*childHeight + childMarginHorizonTal + (i / number)*childMarginTop);
}
}
//dispatchDraw:为布局控件添加边框
@Override
protected void onDraw(Canvas canvas) {
Paint pFont = new Paint();
for (int i = 0; i < childCount; i++) {
TextView childView = (TextView) getChildAt(i);//得到当前子控件
String text = String.valueOf(childView.getText());
canvas.drawText(text,childWidth/2,0,pFont);
}
super.onDraw(canvas);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: