Android textview的视图边界比内容大得多,如何删除它?

时间:2015-02-26 14:40:11

标签: android textview

我的问题是,当我打开开发人员选项中的设置以查看视图边界时,我可以看到橙色" 20"文本包含比要求更大的空间。 (顶部和底部)

我尝试设置:android:includeFontPadding="false"但这只是简单地推送内容,在文本容器的底部留下一个空的大空间。

如何删除多余的空间?

enter image description here

XML:

 <LinearLayout
    android:id="@+id/topDash"
    android:layout_width="180dp"
    android:layout_height="180dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:background="@drawable/circle_gray"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/RobotoTextView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/sog_C"
        android:textColor="@color/blue_medium"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/RobotoTextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="20"
        android:textColor="@color/orange"
        android:textSize="100sp" />

    <TextView
        android:id="@+id/robotoTextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="KM/H"
        android:textColor="@color/gray_darker"
        android:textSize="24sp" />
</LinearLayout>

1 个答案:

答案 0 :(得分:1)

非常好的问题。我不确定是否可以仅使用XML并且不为scrollY属性设置任何硬编码值,但我实现了一个没有硬编码值的小型自定义类,您可以在其他地方使用它而无需任何修改。在这种情况下onMeasure方法总是有帮助:)我在这里使用默认字体。如果您使用不同的字体,请拨打textPaint.setTypeface()并在textPaint.getTextBounds语句之前设置它。

public class CustomTextView extends TextView {
private int newWidth;
private int newHeight;

public CustomTextView(Context context) {
    super(context);
}

public CustomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if(newHeight == 0) {
        Rect textBounds = new Rect();
        Paint textPaint = new Paint();
        textPaint.setTextSize(getTextSize());
        textPaint.getTextBounds(getText().toString(), 0, getText().length(), textBounds);
        int descent = (int) textPaint.descent();
        newWidth = textBounds.width();
        newHeight = textBounds.height() - 2 * descent;
        setScrollY(descent);
    }

    setMeasuredDimension(newWidth, newHeight);
}
}

但是这个解决方案只适用于数字,为什么只有数字,因为下降,这就是为什么我们不能删除XML内部的额外空间,它是一个字体属性

descent