/**
* 文件名 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

最新文章

  1. Cygwin中解决vi编辑器方向键和Backspace键不好使、安装vim的方法
  2. C#数据类型分类
  3. problem during schema create,statement create sequence act_evt_log_seq
  4. Activity生命周期与状态保存
  5. spring &lt;form:checkboxes&gt; tag and css class
  6. 函数buf_LRU_block_remove_hashed_page
  7. [转]修改maven本地仓库路径
  8. SQL Server 2000 函数使用---CAST 和 CONVERT
  9. ajax实现分页
  10. Java泛型的应用——T extends Comparable&lt;? super T&gt;
  11. Flask 开发| Flaskr 开发内容总结
  12. l^oo不可分的两个注意点
  13. 性能监控(5)&ndash;JAVA下的jstat命令
  14. 【LeetCode】Valid Parentheses合法括号
  15. ortp 发送RTP实例
  16. 如何在ASP.NET Core中构造UrlHelper,及ASP.NET Core MVC路由讲解
  17. 解决win8内置管理员无法激活此应用
  18. WordPress 后台添加额外选项字段到常规设置页面
  19. JAVA实验一20145315
  20. DateConvertUtil 日期工具类

热门文章

  1. MySQL 删除数据表
  2. ReactNative for Android入坑(一)
  3. onresize的定义方式
  4. java测试1
  5. 【USACO 1.4.1】铺放矩形块
  6. 使用BOOST BIND库提高C++程序性能
  7. 如何做好Flex与Java交互
  8. (转)[jQuery]使用jQuery.Validate进行客户端验证(初级篇)——不使用微软验证控件的理由
  9. javascript禁止输入数字
  10. flvplayer.swf flv视频播放器使用方法