自动换行的线性布局
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); } }
相关文章推荐
- Mac系统下的Go开发环境配置
- 再按一次退出应用实现
- Linux(CentOS)下的apache服务器配置与管理
- apache ab测试并发命令的使用
- FastCV SDK详解
- grunt serve搭建自动化web前端开发环境
- Ugly Number II leetcode java
- 通过枚举值实现赋值、取值、触发时间
- java三种方法拆分字符串
- eclips快捷键
- iOS 硬件授权检测:定位服务、通讯录、日历、提醒事 项、照片、蓝牙共享、麦克风、相机等
- 浅析jQuery中常用的元素查找方法总结
- Android项目:仿微信聊天的删除,置顶。
- WaitForSingleObject 结束线程
- Python函数
- 【LEETCODE】155-Min Stack
- 零基础入门学习Python(10):函数
- Swift使用第三方库MJExtension
- 如何用js得到当前页面的url信息方法(JS获取当前网址信息)
- Node.js包管理器: