2010-02-08 20 views
17

Sto creando una barra di avanzamento personalizzata (posizionata sotto un WebView) e quello che vorrei disegnare è una linea a 1p tra la WebView e la ProgressBar. Sto modificando drawable esistente, vale a dire progress_horizontal.xml, e ho cercato qualcosa di simile:Disegno bordo superiore su una forma su Android

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

    (...) 

    <item> 
    <shape android:shape="line"> 
     <stroke android:width="1dp" android:color="#FF000000" /> 
    </shape> 
    </item> 

</layer-list> 

Questa linea però è verticalmente centrato ma voglio che sia disegnata in cima alla drawable. L'unica idea che potrei venire in mente è di utilizzare questo gradiente "hacky" di seguito:

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

    (...) 

    <item> 
    <shape> 
     <gradient 
      android:startColor="#FF000000" 
      android:centerColor="#00000000" 
      android:centerY="0.01" 
      android:endColor="#00000000" 
      android:angle="270" 
     /> 
    </shape> 
    </item> 

</layer-list> 

Avete idee migliori come disegnare una singola forma di linea allineata alla parte superiore del drawable definita con layer-list?

risposta

47

ho trascorso un po 'cercando di capire questo fuori pure. Speriamo che ci sia un modo migliore per farlo, ma qui è il metodo che ho usato, che è anche un po 'di hacker, ma nel caso in cui aiuti qualcuno, ho pensato di condividerlo.

Il primo elemento nell'elenco dei livelli deve essere un solido di qualsiasi colore che si desidera sia il bordo. Seguendo questo sarebbe la cosa che si desidera avere il bordo, con imbottitura su qualsiasi lato si desidera che il bordo sia acceso.

Ad esempio:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="YOUR BORDER COLOR" /> 
     </shape> 
    </item> 
    <item android:top="YOUR TOP BORDER THICKNESS"> 
     THE THING YOU WANT A BORDER ON 
    </item> 
</layer-list> 

L'idea è che l'imbottitura sull'elemento rivela la forma solida dietro di esso, dando l'apparenza confine. È possibile aggiungere il riempimento su qualsiasi lato per aggiungere un bordo. Immagino che potresti diventare più complicato e avere anche bordi colorati differenti.

Sembra una modifica, ma ha funzionato per me.

MODIFICA: ho detto "padding" ma in liste layer è più di un offset.

+0

funziona! Grazie – Kevin

+9

Questo ovviamente non funziona con una "COSA" trasparente. – Kenneth

+0

Grazie per questo. :) Ho aggiunto un ulteriore livello per avere un bordo inferiore di cui ho bisogno. – KarenAnne

12

stavo passando attraverso tutti gli argomenti correlati ma nessuno poteva risolvere il mio problema. Ma alcuni di questi sono stati molto utili per capire come funzionano i parametri della lista di livelli o della forma.

Il mio problema era definire un pulsante con una sfumatura lineare e tracciare una linea superiore e una inferiore in colori diversi. Dopo tutto ho violato questa soluzione. Ho salvato il file res unter/drawable/blue_btn.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true" >   
     <shape android:shape="rectangle"> 
      <solid android:color="@color/blue_end" /> 
      <padding 
        android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
      <stroke 
       android:width="1dp" 
       android:color="@color/bottomline_btn" />       
     </shape>  
    </item> 
    <item> 
     <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
      <item> 
       <shape android:shape="rectangle"> 
        <solid android:color="@color/blue" /> 
        <gradient 
         android:startColor="@color/blue" 
         android:endColor="@color/blue_end" 
         android:angle="270" /> 
       </shape> 
      </item> 
      <item android:top="0dp" android:bottom="-1dp" android:left="-1dp" android:right="-1dp"> 
       <shape android:shape="rectangle"> 
        <stroke 
         android:width="1dp" 
         android:color="@color/topline_btn" />      
        <solid android:color="#00000000" /> 
        <corners android:radius="0dp" /> 
       </shape> 
      </item> 
      <item android:top="-1dp" android:bottom="0dp" android:left="-1dp" android:right="-1dp"> 
       <shape android:shape="rectangle"> 
        <stroke 
         android:width="1dp" 
         android:color="@color/bottomline_btn" />       
        <solid android:color="#00000000" /> 
        <corners android:radius="0dp" /> 
       </shape> 
      </item>   
     </layer-list> 
    </item> 
</selector> 


<color name="topline_btn">#31ffffff</color> 
<color name="bottomline_btn">#31000000</color> 

<color name="blue">#449def</color> 
<color name="blue_end">#2f6699</color> 
0

La mia soluzione è quella di aggiungere 9-patch come l'ultimo elemento di livello:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <shape> 
      <solid android:color="@color/tab_button_active_layer2" /> 
     </shape> 
    </item> 
    <item android:bottom="@dimen/tab_button_active_bottom_bar_width"> 
     <shape> 
      <solid android:color="@color/tab_button_active_layer1" /> 
     </shape> 
    </item> 
    <!-- 9-patch drawable --> 
    <item android:drawable="@drawable/tab_button_border_top"/> 
</layer-list>