一、基础文本样式定制
1.1 字体文件加载与替换
Android原生支持通过Typeface类实现字体替换,推荐使用ResourcesCompat工具类确保兼容性。示例代码展示如何加载assets目录下的字体文件:
// 加载自定义字体Typeface customFont = ResourcesCompat.getFont(context, R.font.custom_bold);TextView textView = findViewById(R.id.sample_text);textView.setTypeface(customFont);
实现要点:
- 字体文件需放置在
res/font目录 - 支持TTF/OTF格式
- 建议使用Vector Asset Studio生成兼容性更好的字体资源
1.2 复合样式设置
通过SpannableString实现文本内不同区域的样式差异:
SpannableString spannable = new SpannableString("混合样式文本");spannable.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);spannable.setSpan(new RelativeSizeSpan(1.5f), 3, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);textView.setText(spannable);
支持类型:
- 颜色:
ForegroundColorSpan - 大小:
RelativeSizeSpan - 背景:
BackgroundColorSpan - 删除线:
StrikethroughSpan - 下划线:
UnderlineSpan
二、动态跑马灯效果实现
2.1 自定义TextView组件
通过继承AppCompatTextView实现可控的跑马灯效果,关键代码解析:
public class MarqueeTextView extends AppCompatTextView {private boolean mAutoScroll = true;public MarqueeTextView(Context context) {super(context);init();}private void init() {setEllipsize(TextUtils.TruncateAt.MARQUEE);setMarqueeRepeatLimit(-1); // 无限循环setSingleLine(true);setSelected(true);}public void setAutoScroll(boolean enable) {mAutoScroll = enable;setFocusable(enable);setFocusableInTouchMode(enable);}}
实现原理:
- 必须设置
singleLine="true" - 通过
ellipsize="marquee"启用跑马灯 - 动态控制
focusable属性实现效果启停
2.2 XML布局配置
<com.example.MarqueeTextViewandroid:id="@+id/marquee_text"android:layout_width="200dp"android:layout_height="wrap_content"android:text="动态跑马灯效果演示"android:textColor="#333333"android:textSize="16sp"android:focusable="true"android:focusableInTouchMode="true"/>
优化建议:
- 宽度建议使用固定值或
match_parent - 文本过长时建议设置
maxLines="1" - 配合
animationDuration属性控制滚动速度
三、高级文本效果实现
3.1 渐变色文本
通过Shader实现文本渐变效果:
TextView gradientText = findViewById(R.id.gradient_text);LinearGradient gradient = new LinearGradient(0, 0, 0, gradientText.getTextSize(),Color.parseColor("#FF0000"),Color.parseColor("#0000FF"),Shader.TileMode.CLAMP);gradientText.getPaint().setShader(gradient);gradientText.invalidate();
参数说明:
- 起始/结束坐标:控制渐变方向
- 起始/结束颜色:定义渐变范围
- TileMode:重复模式(CLAMP/REPEAT/MIRROR)
3.2 动态虚化效果
结合BlurMaskFilter实现文字模糊:
TextView blurText = findViewById(R.id.blur_text);BlurMaskFilter blurFilter = new BlurMaskFilter(10f, // 模糊半径BlurMaskFilter.Blur.NORMAL // 模糊类型);blurText.getPaint().setMaskFilter(blurFilter);
模糊类型:
- NORMAL:均匀模糊
- SOLID:内部实心外部模糊
- OUTER:仅外部模糊
- INNER:仅内部模糊
3.3 点击交互效果
通过ClickableSpan实现文本区域点击:
SpannableString clickableText = new SpannableString("点击查看详情");clickableText.setSpan(new ClickableSpan() {@Overridepublic void onClick(View widget) {// 处理点击事件}@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);ds.setColor(Color.BLUE);ds.setUnderlineText(true);}}, 2, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);textView.setMovementMethod(LinkMovementMethod.getInstance());textView.setText(clickableText);
实现要点:
- 必须设置
MovementMethod - 可自定义下划线样式
- 支持嵌套其他Span类型
四、性能优化建议
- 字体缓存:对重复使用的字体进行全局缓存
```java
private static Map typefaceCache = new HashMap<>();
public static Typeface getTypeface(Context context, int resId) {
String key = context.getResources().getResourceEntryName(resId);
if (!typefaceCache.containsKey(key)) {
typefaceCache.put(key, ResourcesCompat.getFont(context, resId));
}
return typefaceCache.get(key);
}
```
- 跑马灯优化:
- 避免在滚动列表中使用
- 动态控制focus状态减少重绘
- 建议文本长度不超过3倍视图宽度
- 渐变效果优化:
- 复用Shader对象
- 避免在onDraw中频繁创建
- 考虑使用View的layerType加速渲染
五、常见问题解决方案
- 跑马灯不滚动:
- 检查是否设置
singleLine="true" - 确认视图获得焦点(
isFocused()返回true) - 检查父容器是否拦截焦点
- 自定义字体不生效:
- 确认字体文件已正确放置
- 检查资源ID是否正确
- 测试使用系统字体验证基础功能
- 渐变效果显示异常:
- 检查Shader坐标是否匹配文本尺寸
- 确认视图已调用invalidate()
- 测试不同Android版本的兼容性
通过系统掌握这些文本显示技术,开发者可以创建出更具吸引力和交互性的用户界面。建议在实际开发中结合具体场景选择合适的效果组合,同时注意性能优化和跨设备兼容性测试。