原理:在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
运行效果:
文章图片