2013-07-13 9 views
8

Mi piacerebbe creare una forma di rettangolo con due colori solidi (orizzontalmente) per realizzare qualcosa di simile:forma rettangolare con due colori a tinta unita

enter image description here

Ho sentito parlare layer-list, io se ho potuto usare contiene due rettangoli con un colore diverso ma sembra che stenda solo le forme verticalmente.

C'è un modo per ottenere questo utilizzando lalyer-list o devo usare qualcosa di completamente diverso? Mi piacerebbe mantenerlo semplice con la possibilità di cambiare i colori della forma in fase di esecuzione.

Grazie.

+0

vedere nove drawable di patch – pskink

+0

@ Nathan vedere la mia risposta! –

risposta

6

È possibile creare drawable personalizzato per questo. Estendi solo la classe Drawable.

Ecco un esempio di codice che disegna un rettangolo come desiderato, è possibile fornire qualsiasi numero di colori.

public class ColorBarDrawable extends Drawable { 

    private int[] themeColors; 

    public ColorBarDrawable(int[] themeColors) { 
     this.themeColors = themeColors; 
    } 

    @Override 
    public void draw(Canvas canvas) { 

     // get drawable dimensions 
     Rect bounds = getBounds(); 

     int width = bounds.right - bounds.left; 
     int height = bounds.bottom - bounds.top; 

     // draw background gradient 
     Paint backgroundPaint = new Paint(); 
     int barWidth = width/themeColors.length; 
     int barWidthRemainder = width % themeColors.length; 
     for (int i = 0; i < themeColors.length; i++) { 
      backgroundPaint.setColor(themeColors[i]); 
      canvas.drawRect(i * barWidth, 0, (i + 1) * barWidth, height, backgroundPaint); 
     } 

     // draw remainder, if exists 
     if (barWidthRemainder > 0) { 
      canvas.drawRect(themeColors.length * barWidth, 0, themeColors.length * barWidth + barWidthRemainder, height, backgroundPaint); 
     } 

    } 

    @Override 
    public void setAlpha(int alpha) { 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 

    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.OPAQUE; 
    } 

} 
+0

Grazie. Ha funzionato :) – nathan

+0

Come possiamo impostare gli angoli arrotondati con questa soluzione ??? –

16

questo sarà sicuramente disegnare la forma secondo il vostro requisito:

Regola la dimensione del <item> di cui hai bisogno!

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

    <item 
     android:left="50dip"> 
     <shape 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:shape="rectangle" > 
      <solid android:color="#0000FF" /> 
     </shape> 
    </item> 
    <item android:right="50dip"> 
     <shape 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:shape="rectangle" > 
      <solid android:color="#ff0000" /> 
     </shape> 
    </item> 

</layer-list> 
+2

Nice One .. È possibile aggiungere solo il bordo arrotondato a lati specifici? – Bora

+2

possiamo fare il lato sinistro match_parent? – bharv14

+1

Ottima soluzione, grazie! –

0

Questo vi darà due colori metà e metà verticalmente. Inserisci questo codice in una risorsa drawable.

<item 
    android:top="320dip"> 
    <shape 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle" > 
     <solid android:color="@color/red" /> 
    </shape> 
</item> 
<item android:bottom="320dip"> 
    <shape 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle" > 
     <solid android:color="@color/yellow" /> 
    </shape> 
</item> 
Problemi correlati