第一次发文章好紧张哦,一定要我。
一、引用
1、TextView实战之你真的懂我么?
2、Android TextView 添加下划线的几种方式
3、Android在一个TextView里显示不同样式的字体
4、盘点Android使用自定义字体遇到的坑
5、Android应用使用第三方字体
二、实例
1、完全靠xml布局实现的各式文字样式(超链接,下划线,滚动,阴影,拉伸,粗体斜体,图片加载)
图例:xml:
2、textview和string.xml的部分使用(格式化文字和string-array)
图例:xml:
string.xml等:
- 组件
- 控件
- 数据库
- 通信
- 多媒体
- 文件
- 设备
测试StringFormat:StringArray有%d个数据=%s,可测试Float=%2f
代码:
/**
* 测试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的运用,文字内部超链接,下划线,滚动,阴影,拉伸,粗体斜体,图片加载,第三方字体,奇奇怪怪的文字)
图例:xml:
代码:
/**
* 测试斜体
* 貌似必须加上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 = "我是html下划线";
//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);
}