2012-01-19 13 views
8

Próbuję wyśrodkować widok dla różnych rozdzielczości przy użyciu układu i właściwości grawitacji, ale to nie działa. Czy istnieje sposób, aby ustawić niestandardowe centrum widoku w poziomie w różnych rozdzielczościach?Jak wyśrodkować niestandardowy widok na Androida?

Czy muszę coś zrobić w metodzie onMeasure?

Oto jedna z tych rzeczy, próbuję teraz, widok jest na lewo od centrum ..

<?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> 
+0

Czy możesz podać mały przykład tego, co próbujesz? Powinno być możliwe wyśrodkowanie widoku za pomocą niektórych zagnieżdżonych liniowych atrybutów liniowych i atrybutu grawitacji. – henrik

+0

Dodano przykład jednej z rzeczy, którą próbowałem – tresnotas

Odpowiedz

1

Zakładając masz View wewnątrz układzie jak FrameLayout, ustaw View ' s layout_gravity do center. Nie mieszaj tego z gravity!

Oczywiście może być konieczne przesłonięcie narzędzia onMeasure(). Przeczytaj it's documentation, aby zdecydować, czy chcesz go zastąpić. Jeśli tak, pamiętaj, że parametry są kodowane View.MeasureSpec.

-1

Oto przykład na wyśrodkowanie dwóch przycisków na ekranie. Powinno to również działać z twoim 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> 
0

Należy wdrożyć w widoku niestandardowego klasy

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


W nim należy obliczyć wysokość i szerokość dla widoku niestandardowego. Jeśli trzeba centralnego widoku niestandardowego w układzie dominującej - upewnij się, że:

  • zwyczaj Zobacz height = rodzic Zobacz wysokość

I/LUB

  • zwyczaj Zobacz szerokości! ! = rodzic Wyświetl szerokość


Na przykład:

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


Teraz można korzystać dalej z widoku niestandardowego:

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

enter image description here

PS: Widzisz, że android:layout_centerHorizontal="true" nie daje żadnego efektu. Powodem jest użycie nadrzędnej szerokości w onMeasure zamiast obliczania dokładnej szerokości.

Powiązane problemy