TextView的使用

一、阴影

xml文件中:
android:shadowColor="#FF00AD"
android:shadowDx="10"            
android:shadowDy="10"            
android:shadowRadius="10"

依次属性为: 阴影的颜色、水平偏移量、垂直偏移量、范围,将android: shadowRadius=0 的时候是看不到阴影的。

Java代码中:
mTextView.setShadowLayer(10F, 11F,5F, Color.YELLOW);

第一个参数为模糊度,越大越模糊。第二个参数是阴影离开文字的x横向距离。第三个参数是阴影离开文字的Y纵向距离。第四个参数是阴影颜色。(如果模糊度为0是看不到阴影效果的)

二、图片

1.XML文件中
android:drawableLeft="@drawable/icon"
android:drawablePadding="20dp"

Android中可以使用TextView的drawableXXX属性在文字周围插入图片。图片和文字之间的间距可以通过android:drawablePadding来设置。

2.Java代码中
Drawable drawable= getResources().getDrawable(R.drawable.drawable);  
// 这一步setBounds()必须要做,否则不会显示.  
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());  
myTextview.setCompoundDrawables(drawable,null,null,null);

或者

Drawable drawable= getResources().getDrawable(R.drawable.drawable);  
myTextview.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);

setCompoundDrawables与setCompoundDrawablesWithIntrinsicBounds区别:

setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)

可以在上、下、左、右设置图标,如果不想在某个地方显示,则设置为null。图标的宽高将会设置为固有宽高,既自动通过getIntrinsicWidth和getIntrinsicHeight获取。

setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)

可以在上、下、左、右设置图标,如果不想在某个地方显示,则设置为null。但是Drawable必须已经setBounds(Rect)。意思是你要添加的资源必须已经设置过初始位置、宽和高等信息。这个方法要先给Drawable设置setBounds(x,y,width,height);【x:组件在容器X轴上的起点y:组件在容器Y轴上的起点width:组件的宽度 height:组件的高度。】这个方法的好处就是不按比例,宽高可以打破原有的大小及比例!

//在左側加入图片
        Drawable drawable= getResources().getDrawable(R.drawable.gray_circle);
        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());

        textView.setCompoundDrawables(drawable, null, null, null);
        //左上右下,drawable放在哪个位置要注意
        textView.setTextColor(getResources().getColor(R.color.gray_textcolor_shen));
        textView.setCompoundDrawablePadding(4);//设置图片和text之间的间距 
        textView.setPadding(-5, 0, 0, 0);

参考:https://github.com/Ablexq/MyTabs
动态为TextView控件设置drawableLeft图标,并设置间距

三、加粗

XML文件中
android:textStyle="bold"
Java代码中

XML文件中定义粗体,但是不能将中文设置成粗体,将中文设置成粗体的方法使用Java代码定义。

textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));//加粗

或者

textView.getPaint().setFakeBoldText(true);//加粗

四、倾斜

XML文件中
android:textStyle="italic"

五、字体

方法一:Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace”,除此之外还可以使用其他字体文件(*.ttf)

XML中使用android默认字体
android:typeface="monospace"

方法二:在Android中可以引入其他字体,首先要将字体文件保存在assets/fonts/目录下

//将字体文件保存在assets/fonts/目录下,创建Typeface对象
Typeface typeFace =Typeface.createFromAsset(getAssets(),"fonts/HandmadeTypewriter.ttf");
//使用字体
textView.setTypeface(typeFace);

但是需要注意的是,不要大量使用这种自定义字体,因为自定义字体会消耗更多的性能。

六、下划线:

Java代码中

tv3.getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG ); //下划线
tv3.getPaint().setAntiAlias(true);//抗锯齿

textView.setText(Html.fromHtml("<u>"+"0123456"+"</u>"));

七、中划线

tv14.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG);

八、可长按复制

android:textIsSelectable="true"

九、超链接

设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)

android:autoLink="all"

十、跑马灯

跑马灯效果就是当文字超过控件所能容纳的空间时,在控件内滚动的效果。

要实现这样的效果需要在textView的布局文件中加上:

android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"

依次属性为:设置为跑马灯显示、可获取焦点、可通过点击屏幕获取焦点、单行显示、无限循环

另外要注意:①TextView【宽度】不能写成wrap_content,但可以写成固定长度,如20dp或者match_parent。②字符串长度一定要大于控件宽度。字符串太短也不可以滚动。

android:layout_width="20dp"

或者

android:layout_width="match_parent"

另外这种跑马灯只有在控件获得焦点时在能滚动。

tv12.setSelected(true);   //不设置这个属性,字体不会开始滚动

代码中设置:

mTv.setEllipsize(TextUtils.TruncateAt.MARQUEE);
mTv.setFocusable(true);
mTv.setFocusableInTouchMode(true);
mTv.setSingleLine();
mTv.setMarqueeRepeatLimit(-1);
mTv.setSelected(true);

十一、字符串资源里变量替换

Android开发中是拒绝硬编码的,我们可能会把一些字符串放在xml中当作资源使用,假设有如下情况:

<string name="welcome">你好A,欢迎使用我们的App。</string>

我们在程序中需要使用这个字符串,但是A是一个变量,很常规的办法是取出这个字符串,然后用String的replace方法把A替换成用户的昵称。

其实,在android中有这样一个东西,那就是 XLIFF,全称叫 XML 本地化数据交换格式,英文全称 XML Localization Interchange File Format。

用法也是很简单的,如

<string name="welcome">你好%1$s,欢迎使用我们的App。</string>
<string name="welcome1">你好%1$s,欢迎使用我们的%2$s</string>

程序中只要给变量赋值就可以了,如

String welcome = getString(R.string.welcome, "小丸子");
String welcome1 = getString(R.string.welcome1, "小丸子","App");

如果包含多个位置需要赋值,且需要连接字符串,可以使用format函数,如下:

<string name="shard_content">我正在使用%1$s,您也快来参与吧.( 下载地址%2$s )</string>
<string name="app_name">支付宝</string>

String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。

format(String format, Object... args)

第一个参数为包含位置和格式的字符串,后面参数为生成格式化的字符串(即替换字符串)。

content = String.format(getString(R.string.shard_content),getString(R.string.app_name), url);

十二、TextView中设置Html

Android中的TextView,本身就支持部分的Html格式标签。这其中包括常用的字体大小颜色设置,文本链接等。使用起来也比较方便,只需要使用Html类转换一下即可。比如:

textView.setText(Html.fromHtml(str));

Textview并不支持所有的html标签。如果更复杂的,可以直接使用webview组件。

<a href="...">  定义链接内容
<b>  定义粗体文字   b 是blod的缩写
<big>  定义大字体的文字
<blockquote>  引用块标签 
属性:
Common  -- 一般属性
cite  -- 被引用内容的URI
<br>   定义换行
<cite>   表示引用的URI
<dfn>   定义标签  dfn 是defining instance的缩写
<div align="...">
<em>  强调标签  em 是emphasis的缩写
<font size="..." color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i>   定义斜体文字
<img src="...">
<p>     段落标签,里面可以加入文字,列表,表格等
<small>  定义小字体的文字
<strike>   定义删除线样式的文字   不符合标准网页设计的理念,不赞成使用.   strike是strikethrough的缩写
<strong>   重点强调标签
<sub>   下标标签   sub 是subscript的缩写
<sup>   上标标签   sup 是superscript的缩写
<tt>   定义monospaced字体的文字  不赞成使用.  此标签对中文没意义  tt是teletype or monospaced text style的意思
<u>   定义带有下划线的文字  u是underlined text style的意思

例子:

String source = "这只是一个测试,测试<u>下划线</u><i>斜体字</i><font color='red'>红色字</font>的格式";
String textStr1 = "<font color=\"#123569\">颜色一,</font>";
String textStr2 = "<font color=\"#00ff00\">颜色二</font>";
tv18.setText(Html.fromHtml(source+textStr1 + textStr2));

十三、Spannable的使用

一、关于Spannable的构建:

Spannable继承自Spanned接口,而实际上,Spanned继承自CharSequence接口:
在TextView的 setText(CharSequence text)方法中,要求的参数正好是一个CharSequence对象,因此,我们可以通过Spannable对象来直接使用setText来完成文本的 设置。在使用中通常使用
Spannable spn = new SpannableString(“字符串”);
或者通过
SpannableStringBuilder对象来进行构建。

二、给Spannable对象设置样式:

在构建除了Spannable 对象以后,就可以使用

spannable.setSpan(Obj what, int start, int end, int flags)

方法来进行样式的设置了,其中参数what是具体样式的实现对象,start则是该样式开始的位置,end对应的是样式结束的位置,参数 flags,定义在Spannable中的常量,常用的有:

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 
--- 不包含两端start和end所在的端点        (a,b)
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 
--- 不包含端start,但包含end所在的端点     (a,b]
Spanned.SPAN_INCLUSIVE_EXCLUSIVE 
--- 包含两端start,但不包含end所在的端点   [a,b)
Spanned.SPAN_INCLUSIVE_INCLUSIVE
--- 包含两端start和end所在的端点         [a,b]

但实际测试这其中似乎并未有差别,而在start和end相同的情况下,则只对start所在字符的当前行起作用。

三、样式分析:

1、AbsoluteSizeSpan
顾名思义,AbsoluteSizeSpan是指绝对尺寸,通过指定绝对尺寸来改变文本的字体大小。该类有三个构造函数:

AbsoluteSizeSpan(int size)
AbsoluteSizeSpan(int size, boolean dip)
AbsoluteSizeSpan(Parcel src)

参数size,以size的指定像素值来设定文本大小,如果参数dip为true则以size指定的dip为值来设定文本大小。参数src,包含有size和dip值的包装类。在该构造中

public AbsoluteSizeSpan(Parcel src) {
mSize = src.readInt();
mDip = src.readInt() != 0;    
}

使用范例:

Parcel p = Parcel.obtain();
p.writeInt(29);//字体大小
p.writeInt(8);//是否是dip单位
p.setDataPosition(0);
AbsoluteSizeSpan ass = new AbsoluteSizeSpan(p);

例子:

String text = "您已经连续走了5963步";
int start = text.indexOf('5');//"5"第一次出现的索引
int end = text.length();
Spannable textSpan = new SpannableStringBuilder(text);
textSpan.setSpan(new AbsoluteSizeSpan(16), 0, start, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(26), start, end - 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(16), end - 1, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv1.setText(textSpan);

2、UnderlineSpan
UnderlineSpan,下划线样式,给一段文字加上下划线。

3、TypefaceSpan
TypefaceSpan,字体样式,可以设置不同的字体,比如系统自带的SANS_SERIF、MONOSPACE和SERIF。

sp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

4、DrawableMarginSpan
DrawableMarginSpan,图片+Margin样式

5、ImageSpan
ImageSpan,图片样式,主要用于在文本中插入图片。

//设置图片  
Drawable drawable = getResources().getDrawable(R.drawable.icon); 
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());    
sp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

6、StyleSpan
StyleSpan,主要由正常、粗体、斜体和同时加粗倾斜四种样式,常量值定义在Typeface类中。

sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜体

7、URLSpan
URLSpan,可以打开一个链接。

//超级链接(需要添加setMovementMethod方法附加响应)  
sp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//电话

8、BackgroundColorSpan
BackgroundColorSpan,背景色样式,显然可以用来设定文本的背景色。

//设置高亮样式一
sp.setSpan(new BackgroundColorSpan(Color.RED), 17 ,19,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

9、ForegroundColorSpan
ForegroundColorSpan,字体颜色样式,用于改变字体颜色。

//设置高亮样式二
sp.setSpan(new ForegroundColorSpan(Color.YELLOW),20,24,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

例子:

//设置删除线  
sp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
 //设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍  
sp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
//2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变  
mTextView.setText(sp);  
//设置TextView可点击
myTextView.setMovementMethod(LinkMovementMethod.getInstance());

项目中曾遇到:
1、把当前的颜色保存下来,下次再次使用

tv.setContentDescription(""+tv.getCurrentTextColor());

int curColor=Integer.parseInt(tv.getContentDescription().toString());
                            tv.setTextColor(curColor);

android:contentDescription
关联方法: setContentDescription(CharSequence)
属性说明: 设置View的备注说明,作为一种辅助功能提供,为一些没有文字描述的View提供说明

参考:

setCompoundDrawables与setCompoundDrawablesWithIntrinsicBounds的区别

安卓文本样式-Spannable的使用

TextView实战之你真的懂我么?

JAVA字符串格式化-String.format()的使用

android里TextView加下划线的几种方式

TextView支持的HTML标签及其他

TextView ClickableSpan 事件分发的两个坑

TextView 高级教程

Android中通过typeface设置字体

Android中Textview显示带html文本一——-【HTML标签】

Android中Textview显示带html文本二——-【Textview显示本地/资源/网络图片】

Android layout属性详细说明

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值