本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!
大家经常会用到系统默认的TextView,TextView可以很好地适应单行长文本(尾部自动打上省略号),以及可以完整显示多行文本(TextView的宽高足够大)。但如果是很多行的文本而TextView又足够大的时候,则会出现以下这种情况.......超出的文本受TextView大小限制,不能完全显示。
本文主要实现一个能够适应多行长文本的TextView,自动缩减长文本并在结尾补上省略号。如下图:
红色部分为普通的TextView,
绿色部分为本文实现的TextView。
本文的源码可以到
http://download.csdn.net/detail/hellogv/4298631 下载,本文的TextViewMultilineEllipse.java改自
http://code.google.com/p/android-textview-multiline-ellipse/ 以及
http://code.google.com/p/android/ 的MyClipTextView.java,相对于前面2者,本文使用哈希表来保存每次onMeasure()计算所得的宽高,大幅减少重复计算宽高。
本文的主Activity的源码如下:
public class AutoFixTextViewActivity extends Activity { private LinearLayout linearLayout1; private TextViewMultilineEllipse tvMultilineEllipse; private TextView tvNormal; //水调歌头,大家懂的 private final String text="明月几时有?把酒问青天。不知天上宫阙,今夕是何年。\n" +"我欲乘风归去,又恐琼楼玉宇,高处不胜寒。\n" +"起舞弄清影,何似在人间。\n" +"转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?\n" +"人有悲欢离合,月有阴晴圆缺,此事古难全。\n" +"但愿人长久,千里共婵娟。"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setTitle("适应多行文本的Android TextView---hellogv"); //共同的宽高 LayoutParams lp=new LayoutParams(LayoutParams.FILL_PARENT,100); //----用TextView来显示换行长文本----// tvNormal=(TextView)this.findViewById(R.id.tvNormal); tvNormal.setLayoutParams(lp); //限制TextView的宽高 tvNormal.setEllipsize(TextUtils.TruncateAt.END); tvNormal.setSingleLine(false); tvNormal.setMaxLines(5); tvNormal.setText(text); //----用TextViewMultilineEllipse来显示换行长文本----// linearLayout1=(LinearLayout) this.findViewById(R.id.linearLayout1); tvMultilineEllipse = new TextViewMultilineEllipse(this); tvMultilineEllipse.setLayoutParams(lp);//限制TextView的宽高 tvMultilineEllipse.setEllipsis("...");//...替换剩余字符串 tvMultilineEllipse.setMaxLines(5); tvMultilineEllipse.setTextSize((int)tvNormal.getTextSize());//设置文字大小 tvMultilineEllipse.setTextColor(Color.WHITE); tvMultilineEllipse.setText(text);//设置文本 //在代码里添加tvMultilineEllipse,暂时不支持Layout里直接添加 linearLayout1.addView(tvMultilineEllipse); } }
PS:TextViewMultilineEllipse是在代码里动态构建和使用,而不能直接在Layout.xml里使用。
main.xml的源码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/tvNormal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" > </LinearLayout></LinearLayout>
TextViewMultilineEllipse.java源码如下,有点多,读者可以直接忽略:
public class TextViewMultilineEllipse extends TextView{ private TextPaint mTextPaint; private String mText; private int mAscent; private String mStrEllipsis; private String mStrEllipsisMore; private int mMaxLines; private boolean mDrawEllipsizeMoreString; private int mColorEllipsizeMore; private boolean mRightAlignEllipsizeMor