固定textview大小,根据文字多少调整字体自适应textview大小

/**
* 文件名 AutoResizeTextView.java
* 包含类名列表 com.haier.internet.conditioner.haierinternetconditioner2.view
* 版本信息 版本号
* 创建日期 2014年9月9日
* 版权声明
*/

package com.haier.internet.conditioner.haierinternetconditioner2.view;

/**
* 类名
* @author 王洪贺<br/>
* 实现的主要功能。
* 创建日期 2014年9月9日
*/
import android.content.Context;
import android.graphics.Canvas;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;

public class AutoResizeTextView extends TextView {

private static final int MAX_SIZE = 1000;

private static final int MIN_SIZE = 5;

private TextPaint mTextPaint;

private float mSpacingMult = 1.0f;

private float mSpacingAdd = 0.0f;

private boolean needAdapt = false;

private boolean adapting = false;

public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}

public AutoResizeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public AutoResizeTextView(Context context) {
super(context);
init();
}

private void init() {
mTextPaint = new TextPaint();
}

@Override
protected void onDraw(Canvas canvas) {
if (adapting) {
return;
}
if (needAdapt) {
adaptTextSize();
} else {
super.onDraw(canvas);
}
}

private void adaptTextSize() {
CharSequence text = getText();
int viewWidth = getMeasuredWidth();
int viewHeight = getMeasuredHeight();

if (viewWidth == 0 || viewHeight == 0 || TextUtils.isEmpty(text)) {
return;
}

adapting = true;
/* binary search */
int bottom = MIN_SIZE, top = MAX_SIZE, mid = 0;
while (bottom <= top) {
mid = (bottom + top) / 2;
mTextPaint.setTextSize(mid);
int textWidth = (int) mTextPaint.measureText(text, 0, text.length());
int textHeight = getTextHeight(text, viewWidth);
if (textWidth < viewWidth && textHeight < viewHeight) {
bottom = mid + 1;
} else {
top = mid - 1;
}
}

int newSize = mid - 1;
setTextSize(TypedValue.COMPLEX_UNIT_PX, newSize);

adapting = false;
needAdapt = false;

invalidate();
}

private int getTextHeight(CharSequence text, int targetWidth) {
StaticLayout layout = new StaticLayout(text, mTextPaint, targetWidth,
Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, true);
return layout.getHeight();
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
needAdapt = true;
}

@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
needAdapt = true;
}

@Override
public void setLineSpacing(float add, float mult) {
super.setLineSpacing(add, mult);
mSpacingMult = mult;
mSpacingAdd = add;
}
}

 

 

方法有很多种,可以参考http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值