textview固定长度,怎么样设置字体大小,让显示的字符串正好占满整个textview?

要求在不同的设备中都可以。

2011-02-20 18:47:42

5 Answers

我提供一个扩展TestView类,思路是:定义一个最大的文字大小,一个最小的文字大小(可改变),它只是通过它们之间的大小递减运行,直到它找到的最大适合的一个。 

import android.content.Context; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView; public class FontFitTextView extends TextView { public FontFitTextView(Context context) { super(context); initialise(); } public FontFitTextView(Context context, AttributeSet attrs) { super(context, attrs); initialise(); } 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 < 11) { maxTextSize = 20; } minTextSize = 10; } /* 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) { if (textWidth > 0) { int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight(); float trySize = maxTextSize; testPaint.setTextSize(trySize); while ((trySize > minTextSize) && (testPaint.measureText(text) > availableWidth)) { trySize -= 1; if (trySize <= minTextSize) { trySize = minTextSize; break; } testPaint.setTextSize(trySize); } this.setTextSize(trySize); } } @Override protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) { refitText(text.toString(), this.getWidth()); } @Override protected void onSizeChanged (int w, int h, int oldw, int oldh) { if (w != oldw) { refitText(this.getText().toString(), w); } } //Getters and Setters public float getMinTextSize() { return minTextSize; } public void setMinTextSize(int minTextSize) { this.minTextSize = minTextSize; } public float getMaxTextSize() { return maxTextSize; } public void setMaxTextSize(int minTextSize) { this.maxTextSize = minTextSize; } //Attributes private Paint testPaint; private float minTextSize; private float maxTextSize; }
2011-02-20 20:58:28

找了一个代码,需要监听textview。

  
class LineTextWatcher implements TextWatcher { static final String TAG = "IpBike"; TextView mTV; Paint mPaint; public LineTextWatcher(TextView text) { mTV = text; mPaint = new Paint(); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } public void afterTextChanged(Editable s) { // do the work here. // we are looking for the text not fitting. ViewParent vp = mTV.getParent(); if ((vp != null) && (vp instanceof LinearLayout)) { LinearLayout parent = (LinearLayout) vp; if (parent.getVisibility() == View.VISIBLE) { mPaint.setTextSize(mTV.getTextSize()); final float size = mPaint.measureText(s.toString()); if ((int) size > mTV.getWidth()) { float ts = mTV.getTextSize(); Log.w(TAG, "Text ellipsized TextSize was: " + ts); for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); if ((child != null) && (child instanceof TextView)) { TextView tv = (TextView) child; // first off we want to keep the verticle // height. tv.setHeight(tv.getHeight()); // freeze the // height. tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, tv.getTextSize() - 1); } else { Log.v(TAG, "afterTextChanged Child not textView"); } } } } } else { Log.v(TAG, "afterTextChanged parent not LinearLayout"); }
2011-02-20 22:01:38

改变文字的大小

  
Spannable WordtoSpan = new SpannableString("大字小字"); WordtoSpan.setSpan(new AbsoluteSizeSpan(20), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); WordtoSpan.setSpan(new AbsoluteSizeSpan(14), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); remoteViews.setCharSequence(R.id.text11, "setText", WordtoSpan); ComponentName com = new ComponentName("com.jftt.widget", "com.jftt.widget.MyWidgetProvider"); appWidgetManager.updateAppWidget(com, remoteViews);

来自http://txlong-onz.iteye.com/blog/1142781

2011-02-21 00:00:52

获取屏幕的宽高,根据屏幕的宽高做一个算法计算字体大小不知是否可以实现你要的效果,方法是 

DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); System.out .println("屏幕分辨率为:" + dm.widthPixels + " * " + dm.heightPixels);
2011-02-21 01:10:05

这个问题看来只能用代码自己控制,计算字符串在给定字体下的显示宽度,进而找到最合适的字体大小。如果是用通常的TrueType字体,因为每个字符的显示宽度都是不同的,所以即便是相同长度的字符串的显示宽度也是不同的,因此必须根据每个字符串进行计算,可以使用字符的平均宽度进行预估,然后用两分法进行逼近,这个方法比较浪费计算资源。因此建议你可以使用字符显示宽度固定的字体,这样计算起来就非常容易了。这样的字体不多,我使用过,但是具体字体名字忘记了,使用这样的字体的显示效果也是不错的。

2011-02-21 03:11:05
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制