您的位置:首页 > 移动开发 > Android开发

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

2016-04-27 14:40 507 查看
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;

@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时,会显示如下结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: