2016-04-28 7 views
2

Ich habe eine lineare Layout-Ansicht, deren Hintergrund ich auf ovale Form einfarbig gesetzt habe. Bisher habe ich den Hintergrund als Kreis. Jetzt möchte ich dasselbe erreichen, d. H. Die Form kann gezeichnet werden, um einen Kreis mit 2 Farben zu erhalten. Siehe Anhang.Android ovale Form 2 Farben

enter image description here

+0

u wollen das Bild u rechts erreichen? –

+0

Hi @ZahanSafallwa ja das ist, was ich erreichen möchte über –

+0

Verwenden Sie eine 'LayerDrawable' mit zwei Ebenen: eine ist normal blau ovale Form und die zweite ist eine grüne ovale Form um die' ClipDrawable' gewickelt, aber ehrlich gesagt, warum es zu machen so komplex, wenn Sie eine benutzerdefinierte "Drawable" -Klasse erstellen können, wo Sie zeichnen können, was Sie wollen? – pskink

Antwort

3

erstellen shape.xml in Ihrem ziehbar Ordner shape.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval" > 
<gradient android:startColor="#0000FF" android:endColor="#00FF00" 
android:angle="270"/> 
</shape> 
+0

und fügen Sie diese shape.xml in Ihre Ansicht Hintergrund –

+0

Schöne Antwort, wird es genau so aussehen, wie oben in Bild erwähnt, indem er ersetzt Android: Shape =" Oval "-Linie mit Android: Shape =" Ring ". So wird final xml wie folgt aussehen: -

Insgesamt Ihre Antwort ist einfach genial. @ Damini –

1

Diese spät kommen könnte, aber ich hatte Probleme bei der Suche gute Antwort so meine nehmen hören.

Ich habe ein benutzerdefiniertes Zeichen verwendet, um den Kreis und damit einen LinearGradient-Shader zu zeichnen, der von Positions-Array konfiguriert ist, um keinen Gradientenübergang zu haben. Die Richtung der Verlaufslinie wird im LinearGradient-Konstruktor konfiguriert (hier ist es diagonal).

public class MultiColorCircleDrawable extends Drawable { 

    private Paint paint; 
    private int[] colors; 

    public MultiColorOvalDrawable(int[] colors) { 
     this.colors = colors; 
    } 

    private void init() { 
     paint = new Paint(); 
     paint.setShader(createShader()); 
    } 

    private Shader createShader() { 
     int[] colorsArray = new int[colors.length * 2]; 
     float[] positions = new float[colors.length * 2]; 

     for (int i = 0; i < colors.length; i++) { 
      int y = i * 2; 
      int color = colors[i]; 
      colorsArray[y] = color; 
      colorsArray[y+1] = color; 
      positions[y] = 1f/colors.length * i; 
      positions[y+1] = 1f/colors.length * (i+1); 
     } 

     Rect bounds = getBounds(); 
     int width = bounds.right - bounds.left; 
     int height = bounds.bottom - bounds.top; 

     return new LinearGradient(0, 0, width, height, colorsArray, positions, Shader.TileMode.REPEAT); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     if (null == paint) { 
      init(); 
     } 

     Rect bounds = getBounds(); 
     int width = bounds.right - bounds.left; 
     int height = bounds.bottom - bounds.top; 
     canvas.drawCircle(width/2, height/2, (width/2) - strokeWidth, maskPaint); 
    } 

    @Override 
    public void setAlpha(int i) { 

    } 

    @Override 
    public void setColorFilter(ColorFilter colorFilter) { 

    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.OPAQUE; 
    } 
} 
4
<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval"> 

    <gradient 
     android:centerX="-1" 
     android:type="sweep" 
     android:startColor="color1" 
     android:endColor="color2" 
     /> 

</shape> 
+0

Wenn Sie eine Antwort geben, ist es vorzuziehen, [eine Erklärung dafür zu geben, WARUM Ihre Antwort] (http://stackoverflow.com/help/how-to-answer) die eine ist. –

+1

Audo Es funktioniert, aber was muss ich tun, wenn ich möchte, dass Farben vertikal (LINKS/RECHTS) anstatt horizontal geteilt werden? – murt