TextView中的图文共存问题--Android学习笔记6
2016-04-27 14:40
507 查看
TextView中的图文共存问题
一、前言:
TextView中的图文共存问题在网上是有好多例子,但是大部分没有注释,或者解释的不清楚,这里在学习的基础上一起将其梳理一遍。中间遇到的相关知识我都会一一解释。争取做到一起学习。先看下整体效果:
![](http://img.blog.csdn.net/20160427151115048?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二、代码分析:
1.新建tv_layout.xml,代码如下:
这就是一个普通的Layout,其中用<ImageView>定义了一个TextView的背景,<TextView>中定义了一些边内距。
2.新建TvActivity.java,代码如下:
这里是对onCreate()方法进行重写,并注册TextView组件,以及设置它的一些属性;其中的文本内容如下:
3.在TvActivity.java中新增toggleEllipsize()方法(重点),代码如下:
解释:
这就是“切换省略,图文并存”的实现办法,相关的注释都在代码里面,一些需要补充的知识点,另外做详细解释。
三、注解(上面涉及的知识点的参考资料):
①.《ViewTreeObserver解释》:点击打开链接
②.《View的setTag与getTag》解释: 点击打开链接
③. TextPaint解释:点击打开链接
④.《CharSequence与String以及stringbuffer与stringbuilder》:点击打开链接
⑤. SpannableString与SpannableStringBuilder用法:点击打开链接1 、点击打开链接2
⑥.《为TextView添加链接-setMovementMethod》:点击打开链接
⑦.《Android超链接去下划线》:点击打开链接
四、补充:
当TextView的Tag设置为true时,会显示如下结果:
一、前言:
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; @Override protected 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设置Tag final 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() { @Override public 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 ImageSpan ssb.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时,会显示如下结果:
相关文章推荐
- android 如何自定义view
- Android Studio 2.0学习教程 - (3)Gradle的简介与安装
- 下载android源码的国内镜像
- 下载android源码的国内镜像
- android 控件 下拉刷新 phoenix 带源码分析
- Android 绘制波浪线(使用 bitmap )
- Android 屏幕适配
- Android RxJava使用介绍(二) RxJava的操作符
- Android 下载文件 显示进度条
- 深度解析Android中字体设置
- jenkins学习笔记---'android' 不是内部或外部命令
- android使用pull解析器来解析和生成xml文件
- android的intent打开系统程序
- Linxu下Android Studio不能输入中文的解决办法
- Android RxJava使用介绍(一) Hello World
- [Anim]安卓页面交互淡入淡出Animation
- android studio中android serviced的详解
- Android 3D画廊采用Gallery实现无限循环、自动轮播
- Android 内存分析
- Android——shape和selector和layer-list的(详细说明 转)