自定义View高度自适应

原理:在onMeasure()方法中获取子视图高度,然后调用setMeasuredDimension()方法指定视图宽高。

举例:自定义控件中绘制文本信息,且文本能够自动换行,这个时候就需要获取文本内容换行后的最大高度。以下以水平方向绘制等宽的多个字符串,且字符串之间能够水平居中为例。

源码:

指定视图高度关键源码(在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高度自适应_第1张图片

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(安卓小功能)