如何在TextView中垂直对齐字符?

时间:2015-06-05 19:14:52

标签: android textview

我想将Android TextView中的单个字符与顶部对齐,类似于上标,但是上标字符的顶部与其他字符匹配'上衣。

IMAGE

为了简单起见,我尝试用Spannable来实现这一点,但是,没有什么是可以工作的。我怎么能做到这一点?

编辑:我应该更清楚地说明我想要所有角色'顶部对齐。常规上标不起作用。

2 个答案:

答案 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 );