第一次发文章好紧张哦,一定要我。
一、引用
1、 TextView实战之你真的懂我么? 2、 Android TextView 添加下划线的几种方式 3、 Android在一个TextView里显示不同样式的字体 4、 盘点Android使用自定义字体遇到的坑 5、 Android应用使用第三方字体
二、实例
1、完全靠xml布局实现的各式文字样式(超链接,下划线,滚动,阴影,拉伸,粗体斜体,图片加载)
图例:
tv-1.png
xml:
<!--part 1-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical">
<TextView
style="@style/text_part_title_style"
android:layout_margin="3dp"
android:text="@string/textview_title_1" />
<!--none|all|web|phone|mail|map-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:autoLink="web"
android:text="www.baidu.com" />
<!--代码跑起来才知道-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="@string/textview_line" />
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:maxLength="8"
android:text="测试长度1234566777" />
<!--start,end,middle分别是在哪里省略,marquee是滚动,android4.x error-->
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:maxEms="8"
android:singleLine="true"
android:text="数据太长只能滚动看123456" />
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:singleLine="true"
android:text="测试单行test1234567890" />
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:maxLines="2"
android:text="测试最多2行test1234567890xxxxxx" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:digits="123456"
android:text="测试只能数字test1234567890xxxxxx" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:hint="测试默认隐藏文字"
android:textColorHint="@color/green" />
<!--斜体在4.x上不行,要写nomospace?? , 阴影得运行才看得见-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:background="@color/wx_blue"
android:drawableLeft="@mipmap/android_label"
android:gravity="center"
android:minHeight="30dp"
android:padding="10dp"
android:scaleY="1.2"
android:shadowColor="@color/red"
android:shadowDx="15.0"
android:shadowDy="5.0"
android:shadowRadius="2.5"
android:text="布局实现:大小,颜色,最低高度,居中,背景色,内距,拉伸_文字间隔,阴影,粗体斜体,加载图片"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="italic|bold"
android:typeface="monospace" />
</LinearLayout>
2、textview和string.xml的部分使用(格式化文字和string-array)
tv-2.png
xml:
<!--part 2-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@color/white"
android:orientation="vertical">
<TextView
style="@style/text_part_title_style"
android:layout_margin="3dp"
android:text="@string/textview_title_2" />
<TextView
android:id="@+id/tv_string"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="@string/textview_string" />
<TextView
android:id="@+id/tv_string_format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="@string/textview_string_format" />
</LinearLayout>
string.xml等:
<!--main-->
<string-array name="android_study_modules">
<item>组件</item>
<item>控件</item>
<item>数据库</item>
<item>通信</item>
<item>多媒体</item>
<item>文件</item>
<item>设备</item>
</string-array>
<string name="textview_string_format">测试StringFormat:StringArray有%d个数据=%s,可测试Float=%2f</string>
代码:
/**
* 测试string.xml的使用
* XLIFF,全称叫 XML 本地化数据交换格式,英文全称 XML Localization Interchange File Format
* */
private void testStringXml(){
//normal
tv_string.setText(R.string.textview_string);
//super
String[] array_string = getResources().getStringArray(R.array.android_study_modules);
LogUtil.i("array_string.length="+array_string.length+",content="+ Arrays.toString(array_string));
String format_string = getString(R.string.textview_string_format);
LogUtil.i("format_string org = "+format_string);
format_string = String.format(format_string,array_string.length,Arrays.toString(array_string),3.333f);
LogUtil.i("format_string java code = "+format_string);
tv_string_format.setText(format_string);
format_string = getString(R.string.textview_string_format,array_string.length,Arrays.toString(array_string),3.333f);
LogUtil.i("format_string android code = "+format_string);
tv_string_format.setText(format_string);
}
3、代码实现各种文字样式(SpannableString的运用,文字内部超链接,下划线,滚动,阴影,拉伸,粗体斜体,图片加载,第三方字体,奇奇怪怪的文字)
tv-3.png
<!--part 3-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@color/white"
android:orientation="vertical">
<TextView
style="@style/text_part_title_style"
android:layout_margin="3dp"
android:text="@string/textview_title_3" />
<TextView
android:id="@+id/tv_code_italic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="代码实现:斜体" />
<TextView
android:id="@+id/tv_code_bottom_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="代码实现:下划线" />
<TextView
android:id="@+id/tv_code_autolink"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="代码实现:AutoLinkALL" />
<TextView
android:id="@+id/tv_code_autolink2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="代码实现:定制化AutoLink" />
<TextView
android:id="@+id/tv_code_asset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="代码实现:第三方asset字体应用" />
<TextView
android:id="@+id/tv_code_fun_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="代码实现:乱七八糟,大小上下颜色各不同的文字,真的很好玩" />
<TextView
android:id="@+id/tv_code_diff_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="代码实现:大小,颜色,最低高度,居中,背景色,内距,拉伸_文字间隔,阴影,粗体斜体,加载图片" />
</LinearLayout>
/**
* 测试斜体
* 貌似必须加上MONOSPACE,否则中文字无法斜体
* */
private void testItalic(){
String aaa = tv_code_italic.getText().toString();
/*方法1:全部是斜体粗体*/
tv_code_italic.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC);
/*方法2:部分斜体(中文字的话没法斜体)*/
//SpannableString spn = new SpannableString(aaa);
//what,start,end,flag
//spn.setSpan(spn,0,3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//tv_code_italic.setText(spn);
/*方法3:使用画笔(中文字的话没法斜体)*/
//tv_code_italic.getPaint().setFakeBoldText(true);
}
/**
* 测试中划线/下划线
* */
private void testTxtLine(){
/*方法1:paint : STRIKE_THRU_TEXT_FLAG=中划线(删除线) , UNDERLINE_TEXT_FLAG=下划线*/
tv_code_bottom_line.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);//getPaint().setFlags();
tv_code_bottom_line.getPaint().setAntiAlias(true);//抗锯齿
/*方法2:html标签类文字*/
//String htmlString = "<u>我是html下划线</u>";
//tv_code_bottom_line.setText(Html.fromHtml(htmlString));
/*方法3:SpannablString类,一般用于某个文字下划线*/
//String spanString = "我是spna文字,啦啦1234";
//SpannableString content = new SpannableString(spanString);
//content.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
//tv_code_bottom_line.setText(content);
}
/**
* 测试autoLink内容
* none|web|phone|mail|map
* */
private void testAutoLink(){
/*固定的 autolink all*/
final String contact = "Email: [email protected]\n" +
"Phone: 189111111111\n" +
"Fax: +47-12345678\n" +
"HTTP: http://www.baidu.com";
tv_code_autolink.setAutoLinkMask(Linkify.ALL); // or set 'android:autoLink' in layout xml
tv_code_autolink.setText(contact);
/*定制的 autolink all*/
//将TextView的显示文字设置为SpannableString
tv_code_autolink2.setText(getClickableSpan());
//设置该句使文本的超连接起作用
tv_code_autolink2.setMovementMethod(LinkMovementMethod.getInstance());
}
//设置超链接文字
private SpannableString getClickableSpan() {
SpannableString spanStr = new SpannableString("使用该软件,即表示您同意该软件的使用条款和隐私政策");
//设置下划线文字
spanStr.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的单击事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
//startActivity(new Intent(MainActivity.this, UsageActivity.class));
ToastUtil.showShort(instance,"点击了使用条款");
}
}, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置下划线文字
spanStr.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的单击事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
//startActivity(new Intent(MainActivity.this, PrivacyActivity.class));
ToastUtil.showShort(instance,"点击了隐私政策");
}
}, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanStr;
}
/**
* 测试第三方asset中字体
* 如果全局引用第三方字体两种比较好方式
* 1、MyApplication通过反射定义此typeface,然后在theme中引用,然后套用此theme
* 优化一点,可以通过注解+反射的方式,类似bufferfly框架中
* 2、各种自定义控件中属性使用新typeface
* 3、单个使用慢慢设置...
*
* 全局使用请看HelloApp.java这个Application文件
* */
private void testAssetFont(){
//maybe exception
Typeface ttf = Typeface.createFromAsset(getAssets(),"fonts/SIMKAI.TTF");
tv_code_asset.setTypeface(ttf);
}
/**
* 测试同一段文字显示乱七八糟有趣的
* 主要是SpannableString
* */
private void testFunnyTextView(){
String funnyString = tv_code_fun_style.getText().toString();
SpannableString spna = new SpannableString(funnyString);
// 字体颜色
spna.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 背景色
spna.setSpan(new BackgroundColorSpan(Color.RED), 2, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
// 粗体
spna.setSpan(new StyleSpan(Typeface.BOLD), 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
// 字体大小
spna.setSpan(new AbsoluteSizeSpan(50), 6, 8, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
// 下划线
spna.setSpan(new URLSpan(""), 8, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 删除线(中划线)
spna.setSpan(new StrikethroughSpan(), 10, 12, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
// 胖瘦字体
spna.setSpan(new ScaleXSpan(2.0f), 12, 13, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
spna.setSpan(new ScaleXSpan(0.5f), 13, 14, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
// 显示
tv_code_fun_style.setText(spna);
}
/**
* 测试用代码输出风格迥异的文字
* 设置各种尺寸要用到sp,dp和px,最多是px
* */
private void testTextViewCode(){
//设置背景色,其他:setBackgroundResource(resid),setBackground(drawable)
tv_code_diff_style.setBackgroundColor(AppUtil.getColor(instance,R.color.wx_blue));
//设置字体颜色
tv_code_diff_style.setTextColor(Color.WHITE);
//设置大小
tv_code_diff_style.setTextSize(18f);//默认用的sp为单位,不需要修改
//设置宽度:非固定高度的,设置match_parent等需要从他父控件的param开始设置
//tv_code_diff_style.setWidth(100);//pix
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
//params.width = 100;params.height=100;params.weight=1;
tv_code_diff_style.setLayoutParams(params);
//设置居中
tv_code_diff_style.setGravity(Gravity.CENTER);
//设置最低高度
tv_code_diff_style.setMinHeight(DisplayUtil.dip2px(instance,30f));//pix
//设置内距
tv_code_diff_style.setPadding(10,10,10,10);
//设置拉伸_文字间隔
tv_code_diff_style.setScaleY(1.2f);//setScaleX
//设置阴影
tv_code_diff_style.setShadowLayer(2.5f,15f,5f,Color.RED);
//设置斜体粗体
tv_code_diff_style.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC);
//设置加载图片
Drawable drawable= getResources().getDrawable(R.mipmap.android_label);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());//必有,不然不显示
tv_code_diff_style.setCompoundDrawables(drawable,null,null,null);
}