【问题标题】:How to center text vertically in a TextView that contains text with different sizes?如何在包含不同大小文本的 TextView 中垂直居中文本?
【发布时间】:2018-06-25 08:38:39
【问题描述】:

我的布局中有一个 TextView,其中包含不同大小的文本:

这是通过 SpannableString 实现的:

SpannableString spannableString = new SpannableString("$20 Rewards");
    spannableString.setSpan(
            new AbsoluteSizeSpan(getResources().getDimensionPixelSize(R.dimen.textSize_16)), 0,
            3, 0);

    textView.setText(spannableString);

我的问题是较小的文本没有垂直居中,如上图所示。我已将 android:gravity="center_vertical" 添加到 TextView,但无济于事:

<TextView
    android:id="@+id/tv_hotel_rewards"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:background="@drawable/bg_dark_blue_partial_round"
    android:gravity="center_vertical"
    android:paddingBottom="4dp"
    android:paddingEnd="8dp"
    android:paddingStart="8dp"
    android:paddingTop="4dp"
    android:textColor="@color/white"
    android:textSize="@dimen/textSize_12"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tv_hotel_price"
    tools:text="$140 Rewards"/>

任何人都知道如何垂直居中,或者是否可以使用单个 TextView?

【问题讨论】:

    标签: android textview spannablestring


    【解决方案1】:

    默认情况下,TextView 将在同一基线上绘制其中的所有文本。但是,您可以使用MetricAffectingSpan 修改某些字符的基线。通过对所有“小”文本应用跨度,您可以将其基线向上移动,使其垂直居中。

    public class CenterVerticalSpan extends MetricAffectingSpan {
    
        @Override
        public void updateMeasureState(@NonNull TextPaint textPaint) {
            textPaint.baselineShift += getBaselineShift(textPaint);
        }
    
        @Override
        public void updateDrawState(TextPaint textPaint) {
            textPaint.baselineShift += getBaselineShift(textPaint);
        }
    
        private int getBaselineShift(TextPaint tp) {
            float total = tp.ascent() + tp.descent();
            return (int) (total / 2f);
        }
    }
    
    SpannableString spannableString = new SpannableString("$20 Rewards");
    spannableString.setSpan(new AbsoluteSizeSpan(fontSize), 0, 3, 0);
    spannableString.setSpan(new CenterVerticalSpan(), 3, spannableString.length(), 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 2017-11-13
      • 2013-10-15
      • 1970-01-01
      • 2018-04-03
      • 2014-03-23
      • 2015-09-16
      相关资源
      最近更新 更多