TextView
TextView 的跑马灯效果
示例
<TextView android:id="@+id/tv_marque" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:focusableInTouchMode="true" android:focusable="true" android:textSize="24dp" android:text="一个很长的字符串..." />
注意点
- android:singleLine="true" 是必须的。否则,一行显示不了的话;会多行显示
- android:ellipsize="marquee" 是指定一行内容显示不下的情况下,使用跑马灯效果
- android:marqueeRepeatLimit="marquee_forever" 在 android:ellipsize="marquee" 情况下使用,跑马灯无限循环。当然,这里的"marquee_forever"可以是整数,表示循环次数
- android:focusableInTouchMode="true"和 android:focusable="true" 是为了让该TextView获取焦点
- 必须获取焦点,如果布局中有自动获取焦点的比如EditText的话,不会显示这种效果
- 因为焦点的问题,同一布局中只能有一个TextView有跑马灯的效果
复制粘贴
默认情况下,TextView是不能够选择的,如果要让其可以复制粘贴的话
android:textIsSelectable="true"
常用的Span
Span的分类
- 修改字符文本格式时 使用 CharacterStyle
- 修改字符外观时 使用 UpdateAppearance
- 修改文字段落格式时 使用 ParagraphStyle
- 修改文字大小度量时 使用 UpdateLayout
删除线
- 可以用Spannable实现
private void addStrikeSpan() {
SpannableString spanString = new SpannableString("删除线");
StrikethroughSpan span = new StrikethroughSpan();
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView.append(spanString);
}
private void addUnderLineSpan() {
SpannableString spanString = new SpannableString("下划线");
UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView.append(spanString);
}
- 还可以用以下代码实现
// 设置中划线并加清晰
textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
// 去除下划线
textView.getPaint().setFlags(0);
同一个textview中设置字体大小不一样
- 使用AbsoluteSizeSpan
private void initGiftList() {
TextView[] gifts = new TextView[]{mTvgift01, mTvgift02, mTvgift03};
TextView[] coins = new TextView[]{mTvGiftCoin01, mTvGiftCoin02, mTvGiftCoin03};
int sp11 = (int) AppUtils.getRawSize(TypedValue.COMPLEX_UNIT_SP, 11, mContext);
int sp10 = (int) AppUtils.getRawSize(TypedValue.COMPLEX_UNIT_SP, 10, mContext);
for (int i = 0; i < coins.length; ++i) {
Spanny wave = new Spanny();
wave.append(String.valueOf(WAVES[i]))
.append(" ")
.append(mContext.getString(R.string.video_send_gift_wave));
gifts[i].setText(wave);
Spanny coin = new Spanny();
coin.append(String.valueOf(WAVES[i] * WAVE_TO_COIN), new ForegroundColorSpan(mRed), new AbsoluteSizeSpan(sp11))
.append(mContext.getString(R.string.video_send_gift_coin_unit), new ForegroundColorSpan(mGray), new AbsoluteSizeSpan(sp10));
coins[i].setText(coin);
}
}
多个TextView的属性
- 使用TextAppearanceSpan
- TextAppearanceSpan也不是支持所有的TextView属性,如果要看支持哪些属性,查看它的源码
Spanny sp = new Spanny();
sp.append(mContext.getString(R.string.qiandao))
.append(" " + days + " ", new TextAppearanceSpan(mContext, R.style.sign_top))
.append(mContext.getString(R.string.day));
TextView阴影效果
字体阴影需要四个相关参数:
- android:shadowColor:阴影的颜色
- android:shadowDx:水平方向上的偏移量
- android:shadowDy:垂直方向上的偏移量
- Android:shadowRadius:是阴影的的半径大小
例子
<TextView
android:id="@+id/tv_fans_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="@dimen/normal_horizonal_padding"
android:paddingLeft="@dimen/normal_horizonal_padding"
android:paddingRight="@dimen/normal_horizonal_padding"
android:paddingStart="@dimen/normal_horizonal_padding"
android:textColor="@color/white"
android:shadowColor="@color/kas_black"
android:shadowRadius="2"
android:shadowDx="0"
android:shadowDy="0"
android:textSize="14sp" />