2012-05-03 9 views
24

ho una forma semplice che voglio impostare la larghezza di:Figura Formato Drawable non funziona

<shape android:shape="rectangle"> 
    <solid android:color="@color/orange"/> 
    <size android:width="2dp"/> 
</shape> 

Tuttavia, quando ho assegnare questo per lo sfondo di un'EditText mostra solo uno sfondo arancione, invece di un rettangolo di larghezza 2 dpi. Perché non sta impostando le dimensioni funzionanti? Voglio creare un disegnabile trasparente con un rettangolo arancione sul lato sinistro. Ho anche questo avvolto in un selettore:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/orange"/> 
      <size android:width="2dp" android:height="6dp"/> 
     </shape> 
    </item> 
    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="@android:color/transparent"/> 
     </shape> 
    </item> 
</selector> 

Ho provato ad aggiungere altezza solo per vedere se sarebbe cambiare la dimensione. Non è così. È come se ignorasse completamente le dimensioni. WTF?

+0

Come doesnt lavoro per te? Esso funziona magicamente. forse il problema è nelle impostazioni del tuo layout? Vedi, se il tuo Layout ha wrap_content per altezza e larghezza. – Daler

+0

È piuttosto semplice. viene ignorato e creerà sempre una forma che riempie la vista. – afk5min

+0

Non sempre, certamente non con gli attributi di Draw/Top/Bott/etc. –

risposta

1

Ho avuto un problema simile.

Documentazione (http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape) dice:

<dimensioni>

La dimensione della forma. (...)

Nota: la forma si adatta alle dimensioni del contenitore Visualizza proporzionalmente alle dimensioni definite qui, per impostazione predefinita. Quando si utilizza la forma in un ImageView, è possibile limitare il ridimensionamento impostando android: scaleType su "center".

Se ho capito correttamente, significa che il tag "dimensione" non è per l'impostazione delle dimensioni ma per l'impostazione delle proporzioni.

+4

Quindi dice che larghezza/altezza sono numeri interi, ma ciò che hai postato suona come potrebbero essere percentuali (0..1) o è grande quanto la dimensione del contenitore (0..view.width) ?! O stai dicendo che ha senso e sai come funziona e può spiegarlo meglio dei documenti? Non capisco appieno il tuo punto. In entrambi i casi probabilmente garantisce un bug per chiarire la documentazione estremamente orribile o correggere il codice in modo che sia effettivamente larghezza e altezza. – chubbsondubs

5

Solo per specificare la risposta di user983447 - l'attributo di dimensione indica davvero una proporzione. È necessario impostare la dimensione per tutte le forme nell'elenco layer e verrà utilizzata come proporzione durante il ridimensionamento, ad esempio l'attributo layout_weight di LinearLayout. Quindi è meglio dargli un nome, non un size ma un weight

Qui di seguito è un work-around come implementare linee bianche superiore e inferiore senza usare l'attributo size:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape> 
      <solid android:color="#fff" /> 
     </shape> 
    </item> 
    <item android:top="1dp" android:bottom="1dp"> 
     <shape> 
      <solid android:color="#888" /> 
     </shape> 
    </item> 
</layer-list> 
+0

Questo ha delle cattive prestazioni dovute al sovrascrittura di gpu (due forme riempiono tutti i pixel quando vuoi solo due linee di pixel) – Gilian

+0

@Gilian correggimi se sbaglio, ma questo xml viene compilato in qualche sottoclasse di un Drawable via aapt, quindi dopo la compilazione è fatta è solo una classe java, e le prestazioni saranno le stesse di qualsiasi 9-patch o bitmap dal punto di vista gpu. Quindi, se i disegni lo richiedono, non c'è modo di aggirare lo –

0

usato questo.

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

<stroke 
    android:color="@color/lgray" 
    android:width="1dip" /> 

<corners 
    android:bottomLeftRadius="0dip" 
    android:bottomRightRadius="0.1dip" 
    android:topLeftRadius="0dip" 
    android:topRightRadius="0.1dip" /> 

<solid android:color="@color/White" /> 

</shape> 

mettere questo rectangle.xml al drawable.and impostare la visualizzazione di sfondo.

3

Ho trovato che l'elenco dei livelli era molto subdolo per la prima volta Androider a causa di quanto segue. A prima vista molti pensano che gli attributi in alto, in basso, a destra, a sinistra siano DALL'alto, dal basso, dal lato destro, da sinistra. Dove un valore di quanto segue:

<item android:top="10dp"> 

Vorresti prelevare un punto di partenza 10 p dalla parte superiore del rispettivo contenitore. Questo non è il caso. Pensalo come OFF OF top, bottom, right, left. <item android:top="10dp"> ti arriverà ancora al punto di partenza 10dp OFF della parte superiore, ma cosa succede quando vuoi impostare il fondo?

<item android:bottom="20dp"> 

Questo non si otterrà un fondo a 20dp dall'alto, piuttosto un fondo di 20dp OFF del fondo del contenitore.

Così, per esempio con un contenitore 100dp, se si voleva un rettangolo con un bordo superiore a partire da 20dp ed un bordo inferiore a 40dp: attributo size

<item android:top="20" android:bottom="60dp"> 
+0

Questo l'ho capito davvero quando ho postato la domanda. Ci sarebbe poco da fare nel renderlo tutto in alto, a sinistra relativo per tutti i valori (cioè in alto, a sinistra, in basso, a destra) perché non si potrebbe mai definire una forma che si espande in modo che corrisponda al contenitore principale senza conoscere la dimensione del contenitore. In questo caso particolare avevo una forma che doveva essere una dimensione fissa, quindi volevo usare larghezza/altezza per impostare una dimensione, ma i documenti non spiegano il sistema di coordinate di quale larghezza/altezza sono così da lasciare indovinare. – chubbsondubs

+0

Grazie amico questa è stata una grande spiegazione! fammi capire dove ho sbagliato e risolvo finalmente dopo ore il problema! ma i pollici in su per te! +1 – Alexiscanny

1

della forma fornirà il valore per drawable.getIntrinsicWidth & getIntrinsicHeight.

se il contenitore del drawable (ad esempio ImageView, TextView) ha il parametro di layout WRAP_CONTENT, la dimensione del contenitore cambierà se il drawable DrawingState cambia.

, ma ci sono un bug nel quadro Android in esecuzione ImageView drawingState

ImageView solo aggiornare/ridimensionare la sua dimensione dalla dimensione drawable su state_selected ma non fare su state_activated

4

Può lavorare con un foreground. Sembra che tu non possa impostare la gravità di uno sfondo. Ma puoi in primo piano. Ho controllato le API 21, 23 e 24 (beh, con l'anteprima del design di Studio) e le seguenti posizioni un punto a cerchio solido sul ImageView.

<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/colorPrimary" /> 
    <size android:height="8dp" android:width="8dp" /> 
</shape> 

Con il layout snippet

<ImageView 
      android:foreground="@drawable/list_new_dot" 
      android:foregroundGravity="right|center_vertical" 
      tools:src="@drawable/model_1_sm" 
      /> 

UPDATE: Anche se sembra funzionare nello strumento di progettazione del layout, non sembra lo stesso nell'emulatore. UPDATE 2: Dal momento che questa risposta ha un paio di voti, si potrebbe voler controllare quello che ho effettivamente utilizzato al fine di mostrare un nuovo indicatore di punti: https://gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb