自定义View高度自适应

原理:在onMeasure()方法中获取子视图高度,然后调用setMeasuredDimension()方法指定视图宽高。
【自定义View高度自适应】举例:自定义控件中绘制文本信息,且文本能够自动换行,这个时候就需要获取文本内容换行后的最大高度。以下以水平方向绘制等宽的多个字符串,且字符串之间能够水平居中为例。
源码:
指定视图高度关键源码(在onMeasure()方法中编辑)

Rect rect = new Rect(); Paint p = new Paint(); p.setAntiAlias(true); p.setStyle(Paint.Style.FILL); p.setColor(bgColor); p.setTextSize(textSize); p.setTextAlign(Paint.Align.CENTER); maxHeight = 0; heightMap.clear(); if(titles != null && titles.length != 0){ for(int i = 0; i< titles.length; i++ ){ p.getTextBounds(titles[i], 0, titles[i].length(), rect); //用一个矩形去"套"字符串,获得能完全套住字符串的最小矩形 float width = rect.width(); //字符串的宽度 float height = rect.height(); //字符串的单行高度 int rowCount = (int)Math.ceil(width / interval); //最大行数 float heightTemp = rowCount * height; //字符串换行后的总高度 if(heightTemp > maxHeight){ maxHeight = heightTemp; } heightMap.put(i, heightTemp); } } //自定义视图高度 = 内边距离顶部的高度 + 内边距离底部的高度 + 文本内容的最大高度 float bgHeight = getPaddingTop() + getPaddingBottom()+ (int)maxHeight; setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), bgHeight);

文本换行关键源码(在onDraw()方法中编辑),需要注意的是StaticLayout默认从Canvas的(0,0)位置开始绘制,所以如果需要绘制不同位置的文本,就需要移动canvas坐标,当然,别忘记再把canvas平移回去~
if (null != titles && i


运行效果:
自定义View高度自适应
文章图片













    推荐阅读