Android 用于设置字母间距的字符样式/span
允许设置字母间距/字符间距 是否存在允许在Android 用于设置字母间距的字符样式/span,android,textview,Android,Textview,允许设置字母间距/字符间距 是否存在允许在文本视图中的文本子集上设置字母间距的相应设置?您可以查看实现所需内容的实现 编辑:确定,如果要应用于文本的一小部分,可以执行以下操作: CharSequence firstPart = "First Part"; CharSequence thirdPart = "Third Part"; SpannableStringBuilder middlePart = new SpannableStringBuilder("Middle Part"); int
文本视图中的文本子集上设置字母间距的相应设置?您可以查看实现所需内容的实现
编辑:确定,如果要应用于文本的一小部分,可以执行以下操作:
CharSequence firstPart = "First Part";
CharSequence thirdPart = "Third Part";
SpannableStringBuilder middlePart = new SpannableStringBuilder("Middle Part");
int spacing = 2;
final String nonBreakingSpace = "\u00A0";
for (int i = middlePart.length() - 1; i >= 1; i--){
middlePart.insert(i, nonBreakingSpace);
middlePart.setSpan(new ScaleXSpan(spacing), i, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
((TextView) rootView.findViewById(R.id.text_view)).setText(TextUtils.concat(firstPart, " ", middlePart, " ", thirdPart));
但这并不完美
编辑:
明确地说,这是上述代码的结果
第一行(“Custom Spanable”)是上面代码(+/-)的结果。第二行(“字母间距”)是属性android:letterSpacing=“1”
的结果
正如你所看到的,正如我所说的,它并不完美,但却是我为棒棒糖前的设备找到的唯一解决方案
我还认为你问题的全部目的是使它与棒棒糖前的设备兼容。我的错
干杯所以我通过编写自己的span类解决了这个问题,它可以在API级别21及以上工作
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Parcel;
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;
/**
* Created by alex on 19/02/2015.
*/
@TargetApi(21)
public class LetterSpacingSpan extends MetricAffectingSpan {
private float letterSpacing;
/**
* @param letterSpacing
*/
public LetterSpacingSpan(float letterSpacing) {
this.letterSpacing = letterSpacing;
}
public float getLetterSpacing() {
return letterSpacing;
}
@Override
public void updateDrawState(TextPaint ds) {
apply(ds);
}
@Override
public void updateMeasureState(TextPaint paint) {
apply(paint);
}
private void apply(TextPaint paint) {
paint.setLetterSpacing(letterSpacing);
}
}
您可以使用我在Kotlin中编写的这个函数。它将允许您在一个文本视图中修改两个字母之间的字母间距,而不会影响其他字母
fun SpannableStringBuilder.setLetterSpacingBetweenTwoLettersSpans(
firstLetter: Char,
secondLetter: Char,
spacing: Float
) {
forEachIndexed { charIndex, startingChar ->
if (startingChar == firstLetter && get(charIndex + 1) == secondLetter) {
var negative = spacing < 0
if (get(lastIndex) != ' ') append(' ')
forEachIndexed { index, _ ->
if (index > charIndex) {
val appliedSpacing = if (index == charIndex + 1) {
if (negative) -abs(spacing) else spacing
} else {
if (negative) spacing else -spacing
}
if (index != lastIndex) {
setSpan(object : MetricAffectingSpan() {
override fun updateMeasureState(textPaint: TextPaint) { apply(textPaint) }
override fun updateDrawState(tp: TextPaint?) { tp?.let { apply(tp) } }
private fun apply(paint: TextPaint) { paint.letterSpacing = appliedSpacing }
}, index, index + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
negative = !negative
}
}
}
}
}
我认为1f看起来好像在两个字母之间留出了一个空格。负片也可以。解决方案似乎是在整个TextView
上设置间距,而不是使用字符样式设置文本的子集/span我怀疑ScaleXSpan
与否类似,我不这么认为setLetterSpacing
应该调整字距,而setTextScaleX
水平“拉伸”文本视图。我刚刚测试了这个,ScaleXSpan
拉伸了我想要设置字母间距的文本。如果您测试过这个,您将得到与我相同的最终结果。我甚至附上了一个屏幕截图来证明它。@commonware谢谢你的评论供我参考,我修复了它:)这解决了什么问题?如果是API级别21及以上,您可以直接在TextView上设置字母间距。这允许您在跨距(文本的一部分)上设置字母间距。如果在整个TextView上设置字母间距,它将应用于整个TextView。
val spannableStringBuilder = SpannableStringBuilder()
spannableStringBuilder.append("Bear")
spannableStringBuilder.setLetterSpacingBetweenTwoLettersSpans(
firstLetter = "e",
secondLetter = "a"
spacing = 1f // Negative works aswell (that's why I initially did it)
)
yourTextView.text = spannableStringBuilder