前言:之前有個項目需求扩淀,TextView 文本國際化后楔敌,顯示英文會比較長,自動就換行了驻谆,導(dǎo)致不好看卵凑;要求是將文字只顯示一行庆聘,把字體縮小
思路:獲取需要顯示的文本需要的像素寬度,不斷的比較 TextView 有效的顯示寬度勺卢,大于則 textSize 就不斷 -1伙判,直到一行能顯示完全
接下來看代碼:
public class SingleLineZoomTextView extends TextView {
private Paint mPaint;
private float mTextSize;
public SingleLineZoomTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public SingleLineZoomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public SingleLineZoomTextView(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
/**
* getTextSize 返回值是以像素(px)為單位的,而 setTextSize() 默認(rèn)是 sp 為單位
* 因此我們要傳入像素單位 setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
*/
private void refitText(String text, int textWidth) {
if (textWidth > 0) {
mTextSize = this.getTextSize();//這個返回的單位為px
mPaint = new Paint();
mPaint.set(this.getPaint());
int drawWid = 0;//drawableLeft黑忱,Right宴抚,Top,Buttom 所有圖片的寬
Drawable[] draws = getCompoundDrawables();
for (int i = 0; i < draws.length; i++) {
if(draws[i]!= null){
drawWid += draws[i].getBounds().width();
}
}
//獲得當(dāng)前TextView的有效寬度
int availableWidth = textWidth - this.getPaddingLeft()
- this.getPaddingRight()- getCompoundDrawablePadding()- drawWid;
//所有字符所占像素寬度
float textWidths = getTextLength(mTextSize, text);
while(textWidths > availableWidth){
mPaint.setTextSize(--mTextSize);//這里傳入的單位是 px
textWidths = getTextLength(mTextSize, text);
}
this.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);//這里設(shè)置單位為 px
}
}
/**
* @param textSize
* @param text
* @return 字符串所占像素寬度
*/
private float getTextLength(float textSize,String text){
mPaint.setTextSize(textSize);
return mPaint.measureText(text);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
refitText(getText().toString(), this.getWidth());
}
}
直接在 xml 布局中引用就可以了 杨何;
注:上面用的單位均為 px