需求:根据输入的值实时显示到textview中预览,但是字体大小是要自动适配的

网上有一个代码,但是在我这里不能用,注意方法:refitText  注释掉的是之前的代码

import com.carspeak.client.util.DensityUtils;

import android.content.Context;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView; public class ShadowTextView extends TextView {
private static float DEFAULT_MIN_TEXT_SIZE = 10;
private static float DEFAULT_MAX_TEXT_SIZE = 85; // Attributes
private Paint testPaint;
private float minTextSize, maxTextSize; private String TAG = "ShadowTextView";
public ShadowTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initialise();
} public ShadowTextView(Context context) {
super(context);
} public ShadowTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} @Override
protected void onTextChanged(CharSequence text, int start,int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
refitText(text.toString(), this.getWidth(),this.getHeight());
}
private void initialise() {
testPaint = new Paint();
testPaint.set(this.getPaint());
// max size defaults to the intially specified text size unless it is
// too small
maxTextSize = this.getTextSize();
if (maxTextSize <= DEFAULT_MAX_TEXT_SIZE) {
maxTextSize = DEFAULT_MAX_TEXT_SIZE;
}
minTextSize = DEFAULT_MIN_TEXT_SIZE;
}; @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (w != oldw) {
// refitText(this.getText().toString(), w); //原本是需要执行的
}
} /**
* Re size the font so the specified text fits in the text box * assuming
* the text box is the specified width.
*/
private void refitText(String text, int textWidth,int textHeight) { int Length = text.length();
//直接根据字符长度来调整字体大小 最大长度为20
// this.setTextSize(DensityUtils.dp2px(this.getContext(), trySize));
// testPaint.set(this.getPaint());
if (textWidth > 0) {
int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight(); //获取改TextView的画布可用大小
float trySize = maxTextSize;
float scaled = getContext().getResources().getDisplayMetrics().scaledDensity;
// Log.v(TAG, "availableWidth="+availableWidth + ";scaled="+scaled);
testPaint.setTextSize(trySize*scaled); //模拟 注意乘以scaled
while ((trySize > minTextSize)&& (testPaint.measureText(text) > availableWidth))
{ trySize -= 2;
FontMetrics fm = testPaint.getFontMetrics();
double rowFontHeight = (Math.ceil(fm.descent - fm.top) + 2);
float scaled1 = (float) (this.getHeight() /rowFontHeight ); //字体的行数 textview的总高度/每行字的高度
float scaled2 = (float) ((testPaint.measureText(text) / availableWidth)); //也是行数 所有字的总长度/textview的有效宽度 // Log.v(TAG, "trySize="+trySize + ";testPaint.measureText(text)="+testPaint.measureText(text)+";scaled1="+scaled1+";scaled2="+scaled2+";rowFontHeight="+rowFontHeight);
if((scaled2*rowFontHeight*1.9)<this.getHeight()) //1.9代表是1.9的行高(1个字体本身,0.9的行距 ,大致差不多,没有实际测过)
break;
if (trySize <= minTextSize) {
trySize = minTextSize;
break;
}
testPaint.setTextSize(trySize*scaled);
}
this.setTextSize(trySize);
// Log.v(TAG, "trySize="+trySize+";maxTextSize="+maxTextSize+";minTextSize="+minTextSize);
}
}
// private void refitText(String text, int textWidth,int textHeight) {
//// if (textWidth > 0) {
//// int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight(); //获取改TextView的画布可用大小
//// float trySize = maxTextSize;
//// float scaled = getContext().getResources().getDisplayMetrics().scaledDensity;
//// testPaint.setTextSize(trySize*scaled); //模拟 注意乘以scaled
//// while ((trySize > minTextSize)&& (testPaint.measureText(text) > availableWidth)) {
//// trySize -= 2;
//// FontMetrics fm = testPaint.getFontMetrics();
//// float scaled1 = (float) (this.getHeight() / (Math.ceil(fm.descent - fm.top) + 2));
//// float scaled2 = (float) ((testPaint.measureText(text) / availableWidth));
//// if (scaled1 >= 1.75 & scaled1 >= scaled2) { // 注意1.75是三星s4 小米3 的适合数值(当然包括我的联想了)
//// break;
//// }
//// if (trySize <= minTextSize) {
//// trySize = minTextSize;
//// break;
//// }
//// testPaint.setTextSize(trySize*scaled);
//// }
//// this.setTextSize(trySize); //等同于this.getPaint().set(trySize*scaled);
//// }
// } }

使用:(注意不能给默认字体大小,否则有问题)

<com.carspeak.client.view.ShadowTextView
android:id="@+id/tv_shadow_preview"
android:layout_width="@dimen/projection_screen_width_4_3"
android:layout_height="@dimen/projection_screen_height_4_3"
android:layout_centerHorizontal="true"
android:background="#000"
android:text="字幕"
android:gravity="center"
android:textColor="#fff" />

android开发 textview根据字数长度自动调整字体大小的更多相关文章

  1. android 开发禁止系统修改app的字体大小

    重写activity的getResources方法,一般在BaseActivity中重写就好了,其他activity继承BaseActivity //设置字体大小不随手机设置而改变 @Override ...

  2. Android 根据屏幕分辨率自动调整字体大小

    1.在oncreate 里获取手机屏幕宽和高度 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDispl ...

  3. C# Winform Label内容根据其宽度自动调整字体大小

    C# Winform Label内容根据其宽度自动调整字体大小 项目,有个要求,Label中显示的内容,能够根据其宽度自动调整字体的大小进行显示,刚刚开始的时候,总是想着通过不同的方法来直接测量内容的 ...

  4. HTML5移动Web开发(八)——避免文本字体大小重置

    适用设备:iOS.Windows Mobile在一些移动设备上,比方说iPhone,Windows Mobile,当用户把手机切换到横屏时,浏览器会自动地重置文本字体大小.这可能会对我们造成困扰,因为 ...

  5. Android设置不被系统设置改变的字体大小

    原因 从4.0开始,系统设置中“显示”可以对字体大小进行配置,这会影响到TextView等控件中文字显示的大小. 解决方案 在自定义的Activity中重写getResources方法 @Overri ...

  6. 怎么限制Google自动调整字体大小

    Google默认的字体大小是12px,当样式表中font-size<12px时,或者没有明确指定字体大小,则在chrome浏览器里字体显示是12px. 最近在写代码玩的时候,我也碰到了 在FF和 ...

  7. Android开发 TextView的开发记录

    前言 此篇博客是记录一些TextView开发上一些少用的开发功能项.目前开发记录如下: 添加图片 文字滚动 添加省略号 实现长文的收起和展开功能 改变一个字符串里自定字符的颜色或者大小 效果字体(粗体 ...

  8. Android中TextView输入字数统计和限制

    在Android开发应用的时候,文本编辑框中最多输入140个字,经常会显示还剩多少字以限制用户输入的字数, EditText content;//定义一个文本输入框 TextView hasnum;/ ...

  9. Android开发:TextView添加超链接的简便方法

    TextView中加入超链接的方式很多,但下面的方式应该的最简便合理的 strings.xml中定义字串 <string name="blog"><a href= ...

随机推荐

  1. [leetcode]_Remove Nth Node From End of List

    题目:移除linked-list从尾到头的第N个元素 自我思路:因为题目给出的N是从链表尾开始计算的,单链表不存在从子指向父亲的反向指针,因此我先计算链表的整个长度len,然后用len - N来表示正 ...

  2. Vue.js学习 Item5 -- 计算属性computed与$watch

    在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么 Vue.js 将绑定表达式限制为一个表达式.如果需 ...

  3. 百度分享如何自定义分享url和内容?

    百度分享默认分享的是当前页的url,但也可以在同一个页面中分享多个不同的url,仅需进行如下简单的配置. 默认的代码如下: <div id="bdshare" class=& ...

  4. 对phpcms中{L('news')}的讲解

    直切话题 对于phpcms分M,C,A,那么现在要讲解的L是跟着M走的,每个M在languages中都有一个.lang.php文件,如Mcontent,就有一个content.lang.php,找到对 ...

  5. IOS学习4

    ---恢复内容开始--- UIScrollView 屏幕展示有限,超出一个屏时用户可滚动查看过多部分.UIView不具备滚动功能. -取消autolayout -设置CGSize contentSiz ...

  6. node.js web开发:EXPRESS 4.x 以上使用session和cookie 的记录

    关于session 和cookie 我搞了2-3天, 发现这个玩意也挺麻烦的. 很多教程都是把这种会话保存在nosql里面,比如mongo,或者redis等等.但是我还是想直接保存在计算机的内存中,比 ...

  7. 苏泊尔借助微软CRM提升客户满意度

    企业背景 作为中国最大.全球第二的炊具研发制造商和中国小家电领先品牌,品质和创新一是苏泊尔矢志追求的企业理念,从火红点无油烟锅的发明到能做柴火饭的球釜IH饭煲的面世,苏泊尔用产品的创新和品质的承诺,不 ...

  8. spring替代方法

    总结spring替代方法的使用 MyValueCalculator类中的computerValue方法将会被替代 public class MyValueCalculator { public Str ...

  9. Percona-Xtrabackup 2.3.3 慢查询依旧堵塞MariaDB备份(三)

    MariaDB [yoon]> select version();+---------------------+| version() |+---------------------+| 10. ...

  10. 九度oj 1528 最长回文子串

    原题链接:http://ac.jobdu.com/problem.php?pid=1528 小白书上的做法,不过这个还要简单些... #include<algorithm> #includ ...