在TextView中设置文本的上升,下降和基线

时间:2016-08-16 06:14:21

标签: android textview

我需要两个TextView才能拥有相同的基线,上升,下限,下降值。在绘制文本后是否可以更改TextView的FontMetrics?

2 个答案:

答案 0 :(得分:2)

已经太晚了,但我也遇到了这个问题,我用一些技巧解决了。 (just modify baseline,不上升,下降或其他什么)

  1. 请注意fontMetrics' values(上升,下降,下限,顶部)取决于textSize

    所以我们必须在fontMetrics' values之后使用view is drawn。 (如果是autoSizing或其他东西)

      

    使用Sa Qada's answer

    在视图绘制后执行某些操作
  2. baseline is always 0.下降,上升,上限,下限是相对值。

      

    参考此Suragch's answer

  3. 更改fontMetrics'值不会影响UI。

    设置自定义基线(textview的文本位置),只需使用填充。 下面的代码与两个TextView对齐基线。

    // this is kotlin code, but I'm sure you can understand
    // align textview2 to textview1's baseline
    
    val tv1Baseline = tv1.paddingBottom + tv1.paint.fontMetrics.bottom
    val tv2Baseline = tv2.paddingBottom + tv2.paint.fontMetrics.bottom
    val newPaddingOffset = tv1Baseline - tv2Baseline
    
    tv2.setPadding(tv2.paddingLeft, tv2.paddingTop, tv2.paddingRight,
                   tv2.paddingBottom + newPaddingOffset)
    

答案 1 :(得分:1)

这里有一个解决方案来对齐基线(注意Suragch answer中底部的差异和TextView.getBaseline()的返回值的定义),它将tv2基线与tv1s相对应':

private void alignWeatherTextBaseline(View tv1, View tv2) {
    int tv1Baseline = tv1.getTop() + tv1.getBaseline();
    int tv2Baseline = tv2.getTop() + tv2.getBaseline();
    int newPaddingOffset = tv1Baseline - tv2Baseline;

    if (newPaddingOffset != 0) {
        tv2.setPadding(tv2.getPaddingLeft(),
                tv2.getPaddingTop(), tv2.getPaddingRight(),
                tv2.getPaddingBottom() - newPaddingOffset);
    }
}

请注意以下事项:

  • 如果可以使用多行文字,则需要编写正确的getLastLineBaseline()并使用它代替标准getBaseline()
  • 如果视图尚未布局,您可以从getBaseline()获取无效值(0或-1)