2015-04-27 6 views
10

Vorrei una sfumatura che passi da un colore iniziale a un colore finale a una velocità non lineare. Il gradiente cambierebbe solo lungo un singolo asse cartesiano. Un RadialGradient o SweepGradient non è quello a cui mi riferisco qui.Android supporta la progressione non lineare nei gradienti?

La mia domanda è, Android fornisce supporto per il controllo dei gradienti di transizione, senza scrivere uno Shader personalizzato?

risposta

1

Sì, in una certa misura. LinearGradient ha un costruttore che accetta più colori e posizioni, quindi puoi approssimare la progressione non lineare usando la funzione lineare a tratti.

Il codice qui sotto si basa sulla risposta https://stackoverflow.com/a/4381192/8568479

ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() { 
    @Override 
    public Shader resize(int width, int height) { 
     LinearGradient gradient = new LinearGradient(0, 0, width, height, 
      new int[] { 
       Color.parseColor("#000000"), 
       Color.parseColor("#777777"), 
       Color.parseColor("#FFFFFF") 
      }, 
      new float[] { 0, 0.3f, 1 }, 
      Shader.TileMode.REPEAT 
     ); 
     return gradient; 
    } 
}; 

PaintDrawable p = new PaintDrawable(); 
p.setShape(new RectShape()); 
p.setShaderFactory(shaderFactory); 

È possibile aggiungere il numero di fermate di cui hai bisogno per rendere il gradiente aspetto liscio. Ho anche trovato utile questo collegamento per selezionare i coefficienti per un gradiente dall'aspetto lineare https://css-tricks.com/easing-linear-gradients/