我需要两个TextView才能拥有相同的基线,上升,下限,下降值。在绘制文本后是否可以更改TextView的FontMetrics?
答案 0 :(得分:2)
已经太晚了,但我也遇到了这个问题,我用一些技巧解决了。 (just modify baseline
,不上升,下降或其他什么)
请注意fontMetrics' values
(上升,下降,下限,顶部)取决于textSize
。
所以我们必须在fontMetrics' values
之后使用view is drawn
。 (如果是autoSizing或其他东西)
在视图绘制后执行某些操作
baseline is always 0.
下降,上升,上限,下限是相对值。
参考此Suragch's answer。
更改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()