2017-10-11 2 views
2

Ich habe auf einem Listview basiert auf Positionsänderung der folgenden GradientenGradienten Zentrum dynamisch ändern

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<gradient 
    android:angle="90" 
    android:centerColor="#42f448" 
    android:centerX="0.5" 
    android:centerY="0.5" 
    android:endColor="#000000" 
    android:startColor="#000000" 
    android:type="linear" /> 

Was ich tun muss, ist das Zentrum des Gradienten zu ändern. Ist es möglich, diesen Gradienten programmgesteuert zu erstellen?

Ich habe diesen Ansatz versucht, aber wenn ich die Mittelwerte ändern, passiert nichts, es bleibt fest:

int colors[] = {0xff000000, 0xff42f448, 0xff000000}; 
    GradientDrawable shape = new GradientDrawable(); 
    shape.setOrientation(GradientDrawable.Orientation.TOP_BOTTOM); 
    shape.setColors(colors); 
    shape.setGradientCenter(0.3f, 0.3f); 
    view.setBackgroundDrawable(shape); 

Was bin ich? Vielen Dank.

+1

Sie können nicht. Sieht da ist ein offenes Problem. Überprüfen Sie diese Antwort: https://Stackoverflow.com/a/14383974/334522 – sromku

+0

@sromku Ich sah diesen Beitrag, aber es ist 4 Jahre alt, ich dachte, vielleicht wurde es gelöst – Phantom

+0

Leider war es nicht, wie es von den letzten Kommentaren aussieht von 2017 - https://issuetracker.google.com/issues/36944181 :( – sromku

Antwort

1

Sie können Ihr Ziel erreichen, indem Shader mit

ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() { 
    @Override 
    public Shader resize(int width, int height) { 
     return new LinearGradient(width/2, 0, width/2, height, 
       new int[]{0xff000000, 0xff42f448, 0xff000000}, 
       new float[]{0, 0.3f, 1}, // start, center and end position 
       Shader.TileMode.CLAMP); 
    } 
}; 

PaintDrawable pd = new PaintDrawable(); 
pd.setShape(new RectShape()); 
pd.setShaderFactory(sf); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
    layout.setBackground(pd); 
} else 
    layout.setBackgroundDrawable(pd); 
+0

Ich habe Ihre Lösung versucht, aber das Ergebnis ist das gleiche. Das .setGradientCenter tut nichts, wenn ich die Farben so anwende. – Phantom

+0

@Phantom I mein Code bearbeitet – SiSa

+0

Danke, diese Lösung funktioniert.Ich habe Ihre Antwort als akzeptiert markiert – Phantom