实现方案
TypedValue.applyDimension()方法的功能就是把非标准尺寸转换成标准尺寸, 如:
dp->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());
in->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 20, context.getResources().getDisplayMetrics());
mm->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 20, context.getResources().getDisplayMetrics());
pt->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, 20, context.getResources().getDisplayMetrics());
sp->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.getResources().getDisplayMetrics());
计算文本Text宽度
/**
* 尾部打点之后还会继续计算并更新值
*/
public int getTextWidthTest(String text, int textSize){
TextPaint paint = new TextPaint();
float scaledDensity = getResources().getDisplayMetrics().scaledDensity;
paint.setTextSize(textSize);
Log.e("WJXView", paint.measureText(text) + " ");
return (int) paint.measureText(text);
}
/**
* 尾部打点之后不会计算更新值
*/
private int getTextWidth(String text, int textSize) {
Paint paint = new Paint();
paint.setTextSize(textSize);
float width = paint.measureText(text);
Log.e("WJXText", (int) Math.round(0.5 + width) + " ");
return (int) Math.round(0.5 + width);
}
根据TextView宽度自动计算适合的字体大小
- 注意:
- TextView的最大显示宽度可以通过从外层布局做减法计算获得
/**
* 获取TextView显示的最大宽度
*
* @return Max width
*/
public int getMaxSize() {
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
int maxWidth = displayMetrics.widthPixels;
// 可以减掉外层的边距值
return maxWidth;
}
/**
* 根据最大宽度返回适合的字体大小
*
* @param context C4当前上下文
* @param text 需要设置的字体
* @param textViewWidth 当前可依西安市的最大宽度
* @return 适合的字体大小
*/
private int getAutoTextSize(Context context, String text, int textViewWidth) {
float textSize = NAME_MAX_SIZE;
do {
if (getTextWidth(text,
(int) TypedValue.applyDimension(COMPLEX_UNIT_SP,
textSize, context.getResources().getDisplayMetrics()))
<= textViewWidth){
break;
}
} while (--textSize >= NAME_MIN_SIZE);
return (int) textSize;
}
使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_size);
TextView textView = findViewById(R.id.text_view);
EditText editText = findViewById(R.id.edit_view);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//Todo
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Todo
}
@Override
public void afterTextChanged(Editable s) {
String text = editText.getText().toString();
int maxWidth = getMaxSize();
int autoSize = getAutoTextSize(getApplication(), text, maxWidth);
textView.setTextSize(COMPLEX_UNIT_SP, autoSize);
textView.setText(text);
}
});
}