直接上布局代码
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_purple"
android:gravity="center_horizontal"
android:text="@string/text_dushu"
android:textColor="@android:color/white"
android:textSize="25sp"
android:textStyle="bold|italic" />
<com.la.mytextview.LastSpacingTextView
android:id="@+id/main_tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_purple"
android:gravity="center_horizontal"
android:textColor="@android:color/white"
android:textSize="25sp"
android:textStyle="bold|italic" />
<TextView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_purple"
android:gravity="center_horizontal"
android:text="@string/text_dushu"
android:textColor="@android:color/white"
android:textSize="25sp"
android:textStyle="bold|italic" />
从上图中看出,如果在TextView直接设置android:textStyle="bold|italic"属性,发现右边的字会被切去一些。
至于如何解决,方法我我目前知道如下两种:
方法1:固定TextView的宽
大家可以看第一TextView和最后一个TextView中的区别,就是设置为android:layout_width="200dp",这样就把文字的显示区域变为200dp,文本“笔友城堡”就有足够的显示空间了。
这样做是挺好,但如果不知道文字多长呢?比如切换语言,”笔友城堡“的英文是“125 books for reading”(谷歌翻译),宽度200dp或许就无法容纳这些字体了。
因此方法1只是不是最合适的解决方法。
方法2:文本最后新增一个空格
思路:我们知道TextView的显示长度是根据文本的长度来显示的,因此我们可以在文本末再新增一个空格,这样让TextView的显示区域更大一些。
最后实现的代码如下:
package com.la.mytextview;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ScaleXSpan;
import android.util.AttributeSet;
import android.widget.TextView;
/**
*
* @author
*
*/
public class LastSpacingTextView extends TextView {
private CharSequence originalText = "";
private float SCALE_X = 1.0f; // x轴缩放比例
public LastSpacingTextView(Context context) {
this(context, null);
}
public LastSpacingTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LastSpacingTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setText(CharSequence text, BufferType type) {
originalText = text;
applyLastLetterSpacing();
}
@Override
public CharSequence getText() {
return originalText;
}
private void applyLastLetterSpacing() {
// 如果是空就没必要处理了
if (this == null || this.originalText == null) {
return;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < originalText.length(); i++) {
String c = "" + originalText.charAt(i);
builder.append(c);
}
builder.append("\u00A0");// 末端新增一个空格
SpannableString finalText = new SpannableString(builder.toString());
// 为了让空格看起来很明显,我们对空格进行一定的缩放
finalText.setSpan(new ScaleXSpan(SCALE_X),
builder.toString().length() - 1, builder.toString().length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
super.setText(finalText, BufferType.SPANNABLE);
}
}
本文具体代码实现参考《Android Study 之真正解决TextView字间距,那些扯淡的边儿去吧》,有需要的直接访问,多谢。
历史上的今天
暂无评论...
随机推荐
JNI异常的使用
前言JNI中也存在异常,如果出现异常不处理就会让程序崩溃。因此JNI中定义了异常相关函数用于处理异常。下面就介绍一写常用的异常处理函数。正文Throw# env : JNI接口指针# obj : 一个java.lang.Throwable对象# 如果成功时返回0;失败时为负值jint...
Files.walkFileTree简介
前言简单记录一下Files.walkFileTree()的使用。在Android sdk版本大于 Build.VERSION_CODES.O中可以使用。正文Files.walkFileTree()中方法有两个# 第一个public static Path walkFileTre...
Launcher的两次启动
前言这个问题,类似的之前也有记录过,但由于自己记性太差,又忘了怎么分析,因此重新记录于此,方便自己查阅。好记性不如烂笔头正文问题Android P机器开机启动后,发现Launcher3的Activity(也就是Launcher)启动了两次。日志只截取了部分且重要的日志Activit...
冯骥才:青云楼主
青云楼主,海河边一小文人的号。嘛叫小文人?就是在人们嘴边绝对挂不上号,可提起他来差不多还都知道的那类文人。此君脸窄身簿,皮黄肉干,胳膊大腿又细又长,远瞧赛几根竹竿子上凉着的一张豆皮。但人不可貌相,海不可斗量。他能写能画,能刻图章,连托裱的事也行;可行家们说他——手糙了点儿。因故,天津卫的买卖没他写...
老舍:理想的生活,不是房子车子票子
我的理想家庭要有七间小平房:一间是客厅,古玩字画全非必要,只要几把很舒服宽松的椅子,一二小桌。一间书房,书籍不少,不管什么头版与古本,而都是我所爱读的;一张书桌,桌面是中国漆的,放上热茶杯不至烫成个圆白印;文具不讲究,可是都很好用;桌上老有一两枝鲜花,插在小瓶里。两间卧室,我独居一间,没有臭...
sleep和wait的区别简介
前言记录一下sleep和wait的区别正文wait必须搭配synchronize一起使用,而sleep不需要;进入wait状态的线程能够被 notify 和 notifyAll 线程唤醒,而 sleep 状态的线程不能被 notify 方法唤醒;wait 通常有条件地执行,线程...