Как центрировать пользовательский вид на Android? - PullRequest
9 голосов
/ 19 января 2012

Я пытаюсь центрировать вид для разных разрешений, используя макет и свойства гравитации, но это не работает. Есть ли способ сделать центр пользовательского просмотра горизонтально при разных разрешениях?

Нужно ли что-то делать с методом 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 ]

1 голос
/ 20 января 2012

Если у вас есть View внутри макета, например FrameLayout, вы должны установить View 'layout_gravity на center.Не путайте это с gravity!

Кроме того, действительно может потребоваться переопределить onMeasure ().Прочтите документацию , чтобы решить, нужно ли вам ее переопределить.Если вы это сделаете, имейте в виду, что параметры закодированы с View.MeasureSpec.

0 голосов
/ 30 мая 2016

Вы должны реализовать в своем пользовательском классе просмотра

@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);
        }
    


    Теперь вы можете использовать следующий для вашего пользовательскогоВид:

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

    enter image description here

    PS Вы видите, что android:layout_centerHorizontal="true" не дает эффекта.Причина заключается в использовании родительской ширины в onMeasure вместо вычисления точной ширины.

0 голосов
/ 21 января 2012

Вот пример, как центрировать две кнопки на экране.Это также должно работать с вашим 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>
...