2012-05-01 14 views
25

Ho esperienza con RelativeLayout ma non ho mai incontrato un modo per risolvere il problema che mi viene presentato (a parte i valori dei margini di codifica rigidi, che voglio . per evitare)Android RelativeLayout allinea il centro di una vista nell'angolo in alto a destra di un'altra vista

voglio provare a creare qualcosa di simile al seguente immagine in una RelativeLayout:

enter image description here

la scatola è il suo punto di vista e voglio avere la vista che contiene il cerchio arancione essere centrato nell'angolo in alto a destra della vista che contiene la casella blu.

Ho provato con android:alignTop="boxView" e android:alignRight="boxView" ma questo ha messo il mio cerchio arancione completamente nella mia scatola. Voglio che sia così che il cerchio sia centrato sopra l'angolo in alto a destra della scatola.

Qualcuno sa come posso ottenere tale risultato con un RelativeLayout? preferibilmente senza avere margini hardcode lontano dal bordo dello schermo per la vista a punti arancioni.

+0

Perché non si desidera utilizzare il margine per questo. Il margine sembra il modo perfetto per realizzare questo. – Bobbake4

+0

Solo non voglio dargli un margine per quanto lontano dal bordo dello schermo. Se potessi allinearlo alla scatola e poi spostarlo più e più della metà del suo diametro con un margine che sarebbe ideale in realtà. Ma posso solo capire come farlo dicendogli quanto sia lontano dal bordo dello schermo, piuttosto che quanto lontano dal punto in cui voglio allinearmi. – FoamyGuy

risposta

29

Questo codice crea ciò che si sta cercando, ma utilizza i margini. Ora puoi impostare il margine nel codice se questa è una struttura dinamica che stai creando. Come puoi vedere ho usato margini negativi per spostare la forma in alto a destra al di fuori della casella blu. Questi devono essere la metà dell'altezza del cerchio che stai cercando di spostare. Puoi fare tutto questo in codice per centrare il cerchio nell'angolo in alto a destra.

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

     <LinearLayout 
      android:id="@+id/linearLayout1" 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentLeft="true" 
      android:background="#0000FF" 
      android:orientation="vertical" > 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="26dp" 
      android:layout_height="26dp" 
      android:layout_alignRight="@+id/linearLayout1" 
      android:layout_alignTop="@+id/linearLayout1" 
      android:layout_marginRight="-13dp" 
      android:layout_marginTop="-13dp" 
      android:background="#FF00FF" 
      android:orientation="vertical" > 
     </LinearLayout> 

    </RelativeLayout> 
+3

Non conoscevo margini negativi. Perfetto, grazie. – FoamyGuy

+0

Si noti che questo non funziona se la seconda vista è dimensionata da un'immagine, poiché i disegni non hanno una dimensione coerente in DP (la loro dimensione in pixel salta da un bucket DPI al successivo invece di ridimensionare continuamente). Quindi non puoi fare solo 26dp/2 = 13dp. Una soluzione è quella di scegliere una dimensione che è decisamente più grande dell'immagine e aggiungere un layout di wrapper attorno alla vista con quella dimensione definita (con la vista originale centrata in essa), quindi è possibile calcolare la metà di esso. – Karu

+0

Margini negativi! Sì! – RexSplode

Problemi correlati