前言
项目中展示病人住院的注意事项,条目的高度固定,显示文字大小需要根据字数数量进行自适应变化,文字要竖向显示。
实现
1、效果图
2、自定义控件绘制解析
此自定义控件的实现比较简单,最主要的两个功能。
1、计算文字大小
获取父布局的高度,除以文字的总长度,即可获取文字的大小。
2、使用Canvas竖向绘制每个字符
使用 canvas.drawText
循环绘制字符,满足竖直显示效果
3、实现
public class AutoSizeVerticalTextView extends View {
private final Paint mPaint = new Paint();
private int mViewHeight;
private int mViewWidth;
private String mText;
private final Context mContext;
public AutoSizeVerticalTextView(Context context) {
super(context);
mContext = context;
init();
}
public AutoSizeVerticalTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
/**
* 初始化画笔
*/
private void init() {
mPaint.setAntiAlias(true);
mPaint.setColor(0xFFFFFFFF);
mPaint.setTextAlign(Paint.Align.CENTER);
}
/**
* 设置文字和大小
*/
public void setData(String text, int fontSize) {
this.mText = text;
mPaint.setTextSize(fontSize);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 设定宽度为固定值,测量高度
mViewWidth = MeasureSpec.getSize(widthMeasureSpec);
mViewHeight = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(mViewWidth, mViewHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float textSize = calculateTextSize();
mPaint.setTextSize(textSize);
float startX = PUtil.dip2px(mContext,mViewWidth) / 2.0f;
// 计算字符串的总高度
float txtHeight = mPaint.getTextSize();
// 绘制每个字符
for (int i = 0; i < mText.length(); i++) {
float startY = txtHeight * (i + 1);
canvas.drawText(String.valueOf(mText.charAt(i)), startX, startY, mPaint);
}
}
/**
* 计算字体大小
*/
private float calculateTextSize() {
float desiredHeight = PUtil.dip2px(mContext,mViewHeight) / (float) mText.length();
return desiredHeight > 0 ? desiredHeight * 0.95f : 12;
}
}