Android——SpannableString实现顶部对齐(上标,下标)

更新时间:2023-06-09 21:06:53 阅读: 评论:0

Android——SpannableString实现顶部对齐(上标,下标)
上⾯两张图,⼤家应该很熟悉这就是上标和下标的效果,实现代码如下:
上标:
代码1:
SpannableString ss = new SpannableString("RM123.456");
SuperscriptSpan superScriptTextSpan = new SuperscriptSpan();
ss.tSpan(superScriptTextSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
AbsoluteSizeSpan sizeSpan =new AbsoluteSizeSpan(18,true);
ss.tSpan(sizeSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
tvImageSpan.tText(ss);
效果如图:
代码2:
SpannableString ss = new SpannableString("RM123.456");
AbsoluteSizeSpan sizeSpan =new AbsoluteSizeSpan(18,true);
ss.tSpan(sizeSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
SuperscriptSpan superScriptTextSpan = new SuperscriptSpan();
ss.tSpan(superScriptTextSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
tvImageSpan.tText(ss);
效果如图:
请⼤家仔细观察上⾯两段代码和效果图,可以发现细微差别:
1、代码中设置字体⼤⼩和社这上标效果的代码顺序不同;
2、效果图中上标显⽰的位置不同,先设置上标效果,结果显⽰靠上,先设字体显⽰跟其他⽂字基本顶部对齐,基本达到我们想要的效果。下标:
代码1:
SpannableString ss = new SpannableString("RM123.456");
AbsoluteSizeSpan sizeSpan =new AbsoluteSizeSpan(18,true);
ss.tSpan(sizeSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
SubscriptSpan superScriptTextSpan = new SubscriptSpan();
ss.tSpan(superScriptTextSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
tvImageSpan.tText(ss);
效果如图:
代码2:
SpannableString ss = new SpannableString("RM123.456");
SubscriptSpan superScriptTextSpan = new SubscriptSpan();
ss.tSpan(superScriptTextSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
AbsoluteSizeSpan sizeSpan =new AbsoluteSizeSpan(18,true);
ss.tSpan(sizeSpan, 0, 2, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
tvImageSpan.tText(ss);
效果如图:
方特游乐园
同样,请⼤家仔细观察上⾯两段代码和效果图,可以发现:
1、代码中设置字体⼤⼩和社这上标效果的代码顺序不同;
2、效果图中上标显⽰的位置不同,先设字体显⽰跟其他⽂字底部对齐,先设置下标效果,结果显⽰截断。
注意:
这⾥⼀定要注意设置字体⼤⼩,否则,上标和下标将会超出TextView的显⽰范围被截断。
如下图:
可爱的家歌词原因也⽐较简单了,直接看源码:
SuperscriptSpan
public SuperscriptSpan(Parcel src) {
}
public int getSpanTypeId() {
return getSpanTypeIdInternal();
龙王庙在哪里}
/** @hide */
public int getSpanTypeIdInternal() {
return TextUtils.SUPERSCRIPT_SPAN;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
writeToParcelInternal(dest, flags);
}
/** @hide */
public void writeToParcelInternal(Parcel dest, int flags) {    }
@Override
public void updateDrawState(TextPaint tp) {
tp.balineShift += (int) (tp.ascent() / 2);
}
@Override
public void updateMeasureState(TextPaint tp) {
美熟吧
tp.balineShift += (int) (tp.ascent() / 2);
}
}
SubscriptSpan
public SubscriptSpan(Parcel src) {
}
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
/** @hide */
public int getSpanTypeIdInternal() {
return TextUtils.SUBSCRIPT_SPAN;
}
public int describeContents() {
return 0;
}
一个观念public void writeToParcel(Parcel dest, int flags) {
writeToParcelInternal(dest, flags);
}
/** @hide */
public void writeToParcelInternal(Parcel dest, int flags) {
}
@Override
public void updateDrawState(TextPaint tp) {
tp.balineShift -= (int) (tp.ascent() / 2);
}
@Override
public void updateMeasureState(TextPaint tp) {
tp.balineShift -= (int) (tp.ascent() / 2);
鱼类养殖
}
}
从源码中我们可以看出,上标SuperscriptSpan,下标SubscriptSpan本⾝不可以修改⼤⼩,只是修改了balineShift,即修改baline的位置,⽽且简单粗暴,直接取ascent的⼀半进⾏位移,所以⼤多数时候肯定达不到我们想要的效果,但这⾥也给了我们⼀个启发,我们可以通过修改balineShift来调
整上标或者下标的位置以打到我们想要的效果。
好了,说了这么多,我们该说说我们今天主要讨论的顶部对齐问题了,其实前⾯也提到了实现⽅式,这⾥我尝试了两种⽅式达到我们要的顶部对齐⽅式。
修改balineShift
public class SuperScriptTextSpan extends MetricAffectingSpan {
private int fontSizeSp = -1;
private boolean isSp;
public SuperScriptTextSpan(int fontSizeSp, boolean isSp) {
this.fontSizeSp = fontSizeSp;
this.isSp = isSp;
}
@Override
public void updateDrawState(TextPaint ds) {
float ascent = ds.ascent();
Log.d("SuperScriptTextSpan", "ascent-> " + ds.ascent());
if (fontSizeSp != -1) {
ds.tTextSize(isSp ? fontSizeSp * ds.density : fontSizeSp);        }手机扫一扫在哪里
float newAscent = ds.ascent();
贫困问题
Log.d("SuperScriptTextSpan", "newAscent-> " + ds.ascent());        ds.balineShift += ascent - newAscent;
//⽅法2:
//Rect bounds = new Rect();
//ds.getTextBounds("1A", 0, 2, bounds);
//int shift = p - bounds.bottom;
//if (fontSizeSp != -1) {
//    ds.tTextSize(isSp ? fontSizeSp * ds.density : fontSizeSp);        //}
//ds.getTextBounds("1A", 0, 2, bounds);
//shift += bounds.bottom - p;
//ds.balineShift += shift;
}
@Override
public void updateMeasureState(TextPaint p) {
updateDrawState(p);
}
}
修改Y坐标

本文发布于:2023-06-09 21:06:53,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1031172.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:效果   代码   设置   想要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图