如何在Android上集中自定义视图?

时间:2012-01-19 19:20:57

标签: android layout view center

我正在尝试使用布局和重力属性将视图置于不同分辨率的中心,但它无法正常工作。有没有办法让自定义视图中心水平跨越不同的分辨率?

我是否需要对onMeasure方法做点什么?

这是我现在正在尝试的事情之一,视图位于中心的左侧..

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <RelativeLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="50dp"
        android:gravity="center_horizontal">

        <com.application.app.ui.CustomView
            android:id="@+id/ivCoinAnimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"/>


    </RelativeLayout>


</FrameLayout>

3 个答案:

答案 0 :(得分:1)

假设您在View等布局中有FrameLayout,则可以将View&#39; layout_gravity设置为center。不要将其与gravity混合起来!

此外,确实可能需要覆盖onMeasure()。阅读it's documentation以确定是否需要覆盖它。如果这样做,请注意参数是使用View.MeasureSpec编码的。

答案 1 :(得分:0)

您应该在自定义View类中实现

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)


在其中,您应该计算自定义视图的高度和宽度。 如果您需要在父级布局中集中自定义视图 - 请确保:

  • 自定义视图高度!=父视图高度

和/或

  • 自定义视图宽度!=父视图宽度


例如:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        final int height = mCircleRadius * 2; //calculated
        final int width = getMeasuredWidth(); //parent width

        setMeasuredDimension(width, height);
    }


现在您可以使用next作为自定义视图:

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"

enter image description here

P.S。您看到android:layout_centerHorizontal="true"没有效果。原因是在 onMeasure 中使用父级宽度,而不是计算精确宽度。

答案 2 :(得分:-1)

以下是如何将两个按钮置于屏幕中心的示例。这也适用于您的CustomView。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_vertical">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal">

        <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
        <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

    </LinearLayout>
</LinearLayout>