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>
/** * 功能描述:切换省略,实现图文并存 * * @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
- TextView中的图文共存问题--Android学习笔记6
- Android学习笔记之TextView
- Android学习笔记之TextView
- Android学习笔记-3-TextView
- Android学习笔记2 TextView图文混排,显示添加的图片,三种常用方法,亲测
- android TextView图文混排
- android TextView图文混排
- Android TextView图文混合编排
- 为TextView添加链接-setMovementMethod -- Android学习笔记6-3
- 1.Android之TextView控件学习笔记
- Android学习笔记3 - Button & TextView
- Android学习笔记10:TextView的使用
- Android学习笔记-EditText&TextView&Button&菜单栏
- Android学习笔记(17):文本框TextView类
- Android学习笔记-EditText&TextView&Button&菜单栏
- Android学习笔记·常见控件TextView
- Android学习笔记01——TextView
- Android之自定义TextView学习笔记
- leetcode-35. Search Insert Position
- zk005 zk watcher介绍
- [python]python web开发系统架构
- collections in scala
- redis存储tomcat共享session异常:redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication
- TextView中的图文共存问题--Android学习笔记6
- MySQL中group_concat函数
- CENTOS6.5一步一步安装OGG实现DML DDL SEQUENCE序列单向复制及服务器故障恢复
- ContentResolver和ContentProvider的关系
- 搞学术必备常识及利器搜集整理
- 负载与读写分离图片服务器集群模型
- 论知识的连贯性
- Java extends
- PDF模板报表导出(Java+Acrobat+itext)