我想将Android TextView中的单个字符与顶部对齐,类似于上标,但是上标字符的顶部与其他字符匹配'上衣。
为了简单起见,我尝试用Spannable来实现这一点,但是,没有什么是可以工作的。我怎么能做到这一点?
编辑:我应该更清楚地说明我想要所有角色'顶部对齐。常规上标不起作用。答案 0 :(得分:2)
试试这个:
func buttonDidSelect(index: Int){
println("button at \(index) pressed")
}
修改强>
将myTextView.setText(Html.fromHtml("123<sup>4</sup>"));
方法中的html
替换为these之一
答案 1 :(得分:2)
上标的问题是它将文本的底部放在字体的大约中间位置。它没有对齐顶部或将字体更改为较小的尺寸,如我的图像示例。
我到达的解决方案扩展了SuperscriptSpan。这将改变基线并缩小字体大小。请注意,它包含一个用于设置shiftPercentage的构造函数。这个百分比可以解释上升值和正在使用的字符高度之间的误差(在我的情况下是数字。)对于默认的android字体,0.25似乎是一个合适的值。
class TopAlignSuperscriptSpan extends SuperscriptSpan {
//divide superscript by this number
protected int fontScale = 2;
//shift value, 0 to 1.0
protected float shiftPercentage = 0;
//doesn't shift
TopAlignSuperscriptSpan() {}
//sets the shift percentage
TopAlignSuperscriptSpan( float shiftPercentage ) {
if( shiftPercentage > 0.0 && shiftPercentage < 1.0 )
this.shiftPercentage = shiftPercentage;
}
@Override
public void updateDrawState( TextPaint tp ) {
//original ascent
float ascent = tp.ascent();
//scale down the font
tp.setTextSize( tp.getTextSize() / fontScale );
//get the new font ascent
float newAscent = tp.getFontMetrics().ascent;
//move baseline to top of old font, then move down size of new font
//adjust for errors with shift percentage
tp.baselineShift += ( ascent - ascent * shiftPercentage )
- (newAscent - newAscent * shiftPercentage );
}
@Override
public void updateMeasureState( TextPaint tp ) {
updateDrawState( tp );
}
}
//let's apply it to a string
str.setSpan( new TopAlignSuperscriptSpan( (float)0.25 ), start, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE );