Почему моя графика иногда центрируется с использованием относительного макета? - PullRequest
0 голосов
/ 04 июня 2011

У меня была проблема, которая очень странная для меня. Графика, которую я использую, иногда центрируется по причинам, которые я не могу понять, но только на определенных экранах. Верхний рисунок - плохой пример, нижний - тот, который я хотел бы получить. Кажется, что это не зависит от версии Android, и хорошее и плохое были воспроизведены на Android 1.6, а плохое было воспроизведено на 2.1. Кажется, это зависит только от размера ...

Bad version

Good level layout

соответствующий код XML:

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
  android:layout_height="fill_parent" android:layout_width="fill_parent">
    <com.google.ads.AdView android:id="@+id/adView" 
        ads:loadAdOnCreate="true" ads:adSize="BANNER" 
        ads:adUnitId="@string/admob_unit_id" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" ></com.google.ads.AdView>
    <pearsonartphoto.AJEG.number_pad android:id="@+id/numberpad" 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:layout_above="@id/adView" 
        android:layout_centerHorizontal="true"></pearsonartphoto.AJEG.number_pad>
    <pearsonartphoto.AJEG.Level_Score_bar android:id="@+id/Score_Bar" 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent"></pearsonartphoto.AJEG.Level_Score_bar>
    <ImageView android:id="@+id/logo_image" 
        android:layout_below="@id/Score_Bar" 
        android:layout_above="@id/numberpad" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/level_logo" 
        android:layout_alignParentLeft="true" 
        android:layout_centerInParent="false"
        android:gravity="left"></ImageView>
    <TextView android:id="@+id/number_select" 
        android:layout_above="@id/numberpad"
        android:layout_below="@id/Score_Bar"
        android:text="0" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        style="@style/numberSelect" 
        android:layout_centerHorizontal="true"
        android:gravity="center"></TextView>
    <pearsonartphoto.AJEG.number_viewer android:id="@+id/numberviewer" 
        android:layout_alignParentRight="true" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_below="@id/Score_Bar"></pearsonartphoto.AJEG.number_viewer>
</RelativeLayout>

Как вы можете видеть, я четко установил гравитацию изображения влево, приказал выровнять его по левому краю родителя, но по неизвестной причине он хочет выровнять центр.

Ответы [ 3 ]

2 голосов
/ 25 июня 2011
Please try this code,, 

<?xml version="1.0" encoding="utf-8"?>

  <RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
       xmlns:ads = "http://schemas.android.com/apk/lib/com.google.ads"
       android:layout_width = "fill_parent"
       android:layout_height = "fill_parent">

   <RelativeLayout android:id = "@+id/1stRLayout" 
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_alignParentBottom = "true">

    <com.google.ads.AdView android:id = "@+id/adView" 
        ads:loadAdOnCreate = "true" 
        ads:adSize = "BANNER" 
        ads:adUnitId = "@string/admob_unit_id" 
        android:layout_width = "wrap_content" 
        android:layout_height = "wrap_content">
    </com.google.ads.AdView>
  </RelativeLayout>


  <RelativeLayout android:id = "@+id/2ndRLayout" 
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_above = "@id/1stRLayout"
        android:gravity = "center">

    <pearsonartphoto.AJEG.number_pad android:id = "@+id/numberpad" 
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content">
    </pearsonartphoto.AJEG.number_pad>  
  </RelativeLayout>

  <RelativeLayout android:id = "@+id/3rdRLayout"
        android:layout_width = "fill_parent"
        android:layout_height = "70dp"
        android:layout_above = "@id/2ndRLayout">

    <ImageView android:id = "@+id/logo_image" 
        android:layout_width = "wrap_content" 
        android:layout_height = "wrap_content" 
        android:src = "@drawable/level_logo" 
        android:layout_marginLeft = "8dp"
        android:layout_alignParentLeft = "true"
        android:layout_marginTop = "6dp">
    </ImageView>

    <TextView android:id = "@+id/number_select" 
        android:layout_width = "wrap_content" 
        android:layout_height = "wrap_content" 
        android:text = "0"  
        style = "@style/numberSelect" 
        android:layout_centerInParent = "true">
    </TextView>

    <pearsonartphoto.AJEG.number_viewer android:id = "@+id/numberviewer" 
        android:layout_width = "wrap_content" 
        android:layout_height = "wrap_content" 
        android:layout_marginRight = "8dp"
        android:layout_alignParentRight = "true"
        android:layout_marginTop = "6dp">
    </pearsonartphoto.AJEG.number_viewer>
  </RelativeLayout>

  <RelativeLayout android:id = "@+id/4thRLayout"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_alignParentTop = "true">

    <pearsonartphoto.AJEG.Level_Score_bar android:id = "@+id/Score_Bar" 
        android:layout_height = "wrap_content" 
        android:layout_width = "fill_parent">
    </pearsonartphoto.AJEG.Level_Score_bar>
  </RelativeLayout>

</RelativeLayout>
0 голосов
/ 05 июня 2011

Мне удалось решить вопрос с помощью хитрости, которую я должен был вставить по другой причине. Это работает, однако, чтобы решить две проблемы одним камнем.

По сути, мой ImageView стал таким:

<ImageView android:id="@+id/logo_image" 
    android:layout_below="@id/Score_Bar" 
    android:layout_above="@id/numberpad" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/level_logo" 
    android:layout_alignParentLeft="true" 
    android:layout_toLeftOf="@id/number_select" 
    android:layout_centerInParent="false"
    android:gravity="left"></ImageView>

Ключевым битом была строка android:layout_toLeftOf="@id/number_select", заставляющая изображение не перекрываться с textView с номером. Слева не совсем, но они, по крайней мере, не пересекаются, так что сейчас я говорю достаточно хорошо.

0 голосов
/ 04 июня 2011

С вашим определением макета ImageView layout_above="@+id/numberpad вы можете столкнуться с проблемами, которые вы определили как numberviewer ниже. Код выше должен решить эту проблему.

Используйте @+id только при определении макета. Остальное использовать @id.

Кроме того, при определении позиции макета в пределах RelativeLayout вам следует рассмотреть возможность размещения элементов, которые расположены относительно других элементов, в нижней части файла макета.

Вы также можете использовать layout_alignParentTop, layout_alignParentLeft, layout_alignParentRight или layout_alignParentBottom при размещении абсолютных элементов в пределах RelativeLayout. Вы обязательно должны сделать это в вашем случае.

...