TextView中的图文共存问题--Android学习笔记6

来源:互联网 发布:搜客户软件 编辑:程序博客网 时间:2024/06/17 20:58
TextView中的图文共存问题


一、前言:


       TextView中的图文共存问题在网上是有好多例子,但是大部分没有注释,或者解释的不清楚,这里在学习的基础上一起将其梳理一遍。中间遇到的相关知识我都会一一解释。争取做到一起学习。先看下整体效果:





二、代码分析:


1.新建tv_layout.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <!--背景图-->        <ImageView            android:layout_width="match_parent"            android:layout_height="100dp"            android:background="@drawable/textview2"        />                <TextView            android:id="@+id/tv_1"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:paddingTop="20dp"            android:paddingBottom="10dp"            android:paddingLeft="20dp"            android:paddingRight="20dp"            android:scrollbars="vertical"            android:textSize="18sp" />    </FrameLayout>    </LinearLayout>
解释:

这就是一个普通的Layout,其中用<ImageView>定义了一个TextView的背景,<TextView>中定义了一些边内距。

2.新建TvActivity.java,代码如下:

private TextView tv1_TV;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.tv_layout);//TextView事件注册tv1_TV = (TextView) findViewById(R.id.tv_1);tv1_TV.setTag(false);//为TextView设置Tagfinal String strs = getResources().getString(R.string.link2);//获取文本内容toggleEllipsize(tv1_TV,strs);//实现图文并存}
解释:

这里是对onCreate()方法进行重写,并注册TextView组件,以及设置它的一些属性;其中的文本内容如下:

<string name="link2">消息:今天,百度已经成为中国最具价值的品牌之一,英国《金融时报》将百度列为“中国十大世界级品牌”,成为这个榜单中最年轻的一家公司,也是唯一一家互联网公司。而“亚洲最受尊敬企业”、“全球最具创新力企业”、“中国互联网力量之星”等一系列荣誉称号的获得,也无一不向外界展示着百度成立数年来的成就。</string>


3.在TvActivity.java中新增toggleEllipsize()方法(重点),代码如下:
/** * 功能描述:切换省略,实现图文并存 * * @param {TextView} tv 实现此功能的文本框 * @param {String} desc 指定要显示的文本内容 * */public void toggleEllipsize(final TextView tv,final String desc){if(desc == null) { return; } // 如果输入的文字是空,则直接返回/** * 块注释:否则,开始进行“切换省略”处理 * *///ViewTreeObserver等相关解释 -> 另见注解①tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {//定义变量--标记tv当前的状态(如果没找到TextView的Tag则为false,否则为true)//《View的setTag与getTag》解释 -> ②boolean isEllipsized = (tv.getTag() == null || tv.getTag().equals(false)) ? false : (Boolean) tv.getTag();//如果isEllipsized为true,即:当前TextView是非省略模式(展开状态)if (isEllipsized) {tv.setTag(false);//设置下一动作为省略模式(闭合状态)tv.setText(desc);//将完整的文本赋值给TextView//如果isEllipsized为false,即:当前TextView是省略模式(闭合状态)} else {tv.setTag(true);//设置下一动作为非省略模式(展开状态)int paddingLeft = tv.getPaddingLeft();//获取文本内容到文本框左边的距离int paddingRight = tv.getPaddingRight();//获取文本内容到文本框右边的距离TextPaint paint = tv.getPaint();//TextPaint是paint的子类,用它可以很方便的进行文字的绘制,getPaint()获取TextPaint的实例->③float moreText = tv.getTextSize() * 3;//计算多余文本显示需要的长度【是指3个:...】//设置适合文本显示的总宽度(俩行的宽度)float availableTextWidth = (tv.getWidth() - paddingLeft - paddingRight) * 2 - moreText;/** * TextUtils.ellipsize() -> 截取指定长度字符串 * * @param desc 截取的文本 * @param paint 文本的字体 * @param availableTextWidth 用于显示的宽度 * @param TextUtils.TruncateAt.END 在什么地方进行省略 * *///《CharSequence与String以及stringbuffer与stringbuilder》讲解 -> ④//TextUtils -> 对于字符串处理Android为我们提供了一个简单实用的TextUtils类CharSequence ellipsizeStr = TextUtils.ellipsize(desc, paint, availableTextWidth, TextUtils.TruncateAt.END);MyLog.d("ellipsizeStr.length()", ellipsizeStr.length()+"");MyLog.d("desc.length()", desc.length()+"");if (ellipsizeStr.length() < desc.length()) {//也可用Html.fromHtml实现CharSequence temp = ellipsizeStr + ".";//用"."多补一位//添加图片(《 SpannableString与SpannableStringBuilder》用法 -> ⑤ )SpannableStringBuilder ssb = new SpannableStringBuilder(temp);Drawable dd = getResources().getDrawable(R.drawable.tu1);/** * setBounds():设置文件的位置与大小 * * @param 前俩个参数是 文件左上角的x与y坐标 * @param 后俩个参数是 文件的宽与高 {getIntrinsicWidth/Height()-缩放后的宽度/长度} * */dd.setBounds(0, 0, dd.getIntrinsicWidth(), dd.getIntrinsicHeight());ImageSpan is = new ImageSpan(dd, ImageSpan.ALIGN_BASELINE);//TODO ImageSpanssb.setSpan(is, temp.length() - 1, temp.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//设置前3个字符为粗体ssb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//添加超链接(《Android超链接去下划线》 -> ⑦)ssb.setSpan(new URLSpanNoUnderline("http://www.baidu.com"), 4, temp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv.setText(ssb);//《为TextView添加链接-setMovementMethod》 -> ⑥tv.setMovementMethod(LinkMovementMethod.getInstance());//设置超链接为可点击状态} else {tv.setText(desc);}}//检测SDK版本号-根据版本号移除View监听事件if (Build.VERSION.SDK_INT >= 16) {tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);} else {tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);}}});}

解释:

这就是“切换省略,图文并存”的实现办法,相关的注释都在代码里面,一些需要补充的知识点,另外做详细解释。


三、注解(上面涉及的知识点的参考资料):

  ①.《ViewTreeObserver解释》:点击打开链接
  ②.《View的setTag与getTag》解释: 点击打开链接
  ③. TextPaint解释:点击打开链接
  ④.《CharSequence与String以及stringbuffer与stringbuilder》:点击打开链接
  ⑤. SpannableString与SpannableStringBuilder用法:点击打开链接1 、点击打开链接2 
     
  ⑥.《为TextView添加链接-setMovementMethod》:点击打开链接

  ⑦.《Android超链接去下划线》:点击打开链接


四、补充:


当TextView的Tag设置为true时,会显示如下结果:






0 0