2012-05-21 3 views
6

Sto cercando di capire come creare una riga 3x3 di piccoli rettangoli in un file xml androide.
Questo non è davvero mi sta avvicinando (2 piccoli rettangoli, ma si sovrappongono):Disegno di più rettangoli in un file xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:left="20dp" android:top="20dp" android:right="25dp" android:bottom="25dp" > 
     <shape android:shape="rectangle"> 
      <stroke android:width="1px" android:color="#fff" /> 
      <solid android:color="#00FF0000" /> 
      <corners android:radius="3dp" /> 
     </shape> 
    </item> 


    <item android:left="30dp" android:top="30dp" android:right="35dp" android:bottom="25dp" > 
    <shape android:shape="rectangle"> 
      <stroke android:width="1px" android:color="#fff" /> 
      <solid android:color="#00FF0000" /> 
      <corners android:radius="3dp" /> 
      <size android:width="10dp" 
        android:height="10dp"/> 
     </shape> 
    </item> 


</layer-list> 

risposta

1

prega di consultare i documentation of Layer Lists.

Sarà chiarire, che top, left, bottom e right sono attributi in dimensione per gli offset della voce: fino a che punto l'oggetto in sé deve essere collocato dal confine del suo genitore (lo strato-list) .

Se sapete che il vostro livello-list è dire 130 dp di larghezza e 130 dp alto, e si desidera rettangoli 3x3 lì, offset del primo dovrebbe essere

top: 10 
left: 10 
bottom: 90 
right: 90 

e del prossimo (prima riga, seconda colonna):

top: 10 
left: 50 
bottom: 90 
right: 50 
+0

e la seconda fila superiore: 50 sinistra: 10 inferiore: 50 destra: 90 terza fila superiore: 90 sinistra: 10 inferiore: 10 destra: 90 – Lunf

6

Parte del problema è che i singoli elementi in un elenco di livelli vengono ridimensionati in base alla dimensione complessiva del drawable. Come descritto in the docs, è possibile aggirare il problema avvolgendo i quadratini in un disegno bitmap. Qualcosa del genere potrebbe funzionare. In primo luogo, definire la forma di base come drawable separata:

drawable/square.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <stroke android:width="1px" android:color="#fff" /> 
    <solid android:color="#00FF0000" /> 
    <corners android:radius="3dp" /> 
    <size android:width="10dp" android:height="10dp"/> 
</shape> 

(EDIT: Sarebbe bello se si potesse fare quanto sopra, ma , purtroppo, come @Someone da qualche parte ha sottolineato in un commento, non è possibile fare riferimento drawable forma all'interno di un tag <bitmap>. dovrete creare la piazza come un vero e proprio grafica bitmap per il resto di questo per lavorare.)

Poi si può definire un layer-lista che non scalerà le singole piazze:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- first row --> 
    <item android:left="20dp" android:top="20dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 
    <item android:left="35dp" android:top="20dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 
    <item android:left="50dp" android:top="20dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 

    <!-- second row --> 
    <item android:left="20dp" android:top="35dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 
    <item android:left="35dp" android:top="35dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 
    <item android:left="50dp" android:top="35dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 

    <!-- third row --> 
    <item android:left="20dp" android:top="50dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 
    <item android:left="35dp" android:top="50dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 
    <item android:left="50dp" android:top="50dp"> 
     <bitmap android:src="@drawable/square" android:gravity="top|left" /> 
    </item> 
</layer-list> 

non ho ancora testato questo, quindi potrebbe essere un po 'fuori, ma si dovrebbe essere in grado di modificarlo per ottenere quello che vuoi L'importante è liberarsi del ridimensionamento.

+0

mi piace dove sta andando, ma sul mio display non compare nulla. Qualche idea? – WOPR

+0

@ user1059096 - Hm. Non so perché non funzioni. (In realtà, c'è un grosso problema: ogni volta che appare il tag '', è sbagliato. Dovrebbe essere: ''. Il '' drawable richiede un riferimento a una bitmap grezza e stavo cercando di usarlo per fare riferimento a '' drawable.) Ma anche con quella modifica, non funziona (come ho appena confermato). Lo esaminerò di più quando avrò un po 'più di tempo. È molto strano –

+0

** questo non funziona ** una bitmap non può caricare una forma xml - risulta in un messaggio di errore ' richiede un attributo src valido'. Quindi sembrerebbe che qualcosa di così fondamentale come generare un'immagine da strati di forme non sia nemmeno possibile. –

0

Come la discussione ha già rivelato, l'utilizzo di bitmap è limitato a bitmap reali; altri drawable (XML) non possono essere usati qui.

ScaleDrawables dovrebbe essere una soluzione adatta a te. Dovrebbero offrire gli attributi necessari per regolare la loro posizione all'interno del riquadro di delimitazione risultante.

Tuttavia, ScaleDrawables soffrono il fatto che essi sono destinati per le animazioni. Sembrano iniziare con un livello di 0, che li rende invisibilmente piccoli. Inoltre, non sembra possibile impostare il livello in XML.

Se si può vivere con la fissazione di un livello sui vostri ScaleDrawables nel codice, fare un tentativo.

Vedere anche this question.