Wie malt man eine Farbverlauf in Android auf einer Leinwand mit der Farbe ändern?

Ich muss den Hintergrund meiner Leinwand eine Farbe mit Schattierung / Gradienten angewendet malen, aber jeder onDraw Anruf Ich möchte gern die Farbe ändern.

Ich habe Schwierigkeiten, dies zu tun, ohne ein neues Objekt zu erstellen, jedes onDraw-Aufruf. Wer hat irgendwelche Ideen? Wenn ich drawPaint () verwende und einen neuen Shader () auf meine Farbe setze, dann habe ich ein neues Shader-Objekt erstellt und wenn ich einen neuen GradientDrawable () anlege, habe ich auch. Ich möchte GC vermeiden.

  • Erkennung Android-Anwendung geht auf Hintergrund
  • ADT 21 Update nicht von Eclipse erkannt
  • AutoCompleteTextView Problem beim verlorenen Fokus
  • View.getViewTreeObserver () addOnGlobalLayoutListener leckt Fragment
  • Wie kann man listFooter nicht anklicken
  • Android - Wie kann ich den Menüpunkt Text außerhalb von onOptionsItemsSelected oder onCreateOptionsMenu dynamisch ändern
  • Ich dachte, ich könnte ein GradientDrawable () -Objekt wiederverwenden und die .setColor () -Methode anrufen, aber das setzt einfach alle vorhandenen Gradientendaten zurück und malt die Zeichenkette als solide Farbe.

    Jemand?

  • Android-Adb-Push-to-Location im Gerät ohne sdcard und kein Root-Zugriff
  • Leider hat die Kamera aufgehört
  • Soundpool-Load-Sound Eine Komponente des Namens 'OMX.qcom.audio.decoder.aac' existiert bereits und ignoriert diese
  • Beispiel mit Androids lrucache
  • Swipe Geste funktioniert nicht in YouTubePlayerView im Vollbildmodus
  • Ndk-build Befehl nicht gefunden in Ubuntu Terminal
  • 3 Solutions collect form web for “Wie malt man eine Farbverlauf in Android auf einer Leinwand mit der Farbe ändern?”

    Leider musst du immer einen neuen LinearGradient erstellen. Beachten Sie, dass Sie kein GradientDrawable verwenden müssen, können Sie die Form selbst mit einer Farbe zeichnen, auf der Sie den Shader setzen.

    Ich denke, was du tun willst ist das. Erstellen Sie ein LayerDrawable und legen Sie dann zwei Drawables ein. Das erste Drawable, das Sie einfügen, sollte seine Farbe auf die Farbe einstellen, die Sie Ihren Hintergrund haben möchten, und der zweite sollte ein Gradient sein, der so eingerichtet ist, dass er schwarz ist und von Alpha 0 auf Alpha 255 übergeht.

    Weitere Informationen finden Sie unter: http://developer.android.com/guide/topics/resources/drawable-resource.html#LayerList

    Diese Frage ist noch fast in der Mitte des Jahres 2017 gültig. Ich wollte einen reibungslosen Übergang für Farbveränderungen für meine benutzerdefinierte Ansicht schaffen. Ich habe Shader mit LinearGradients benutzt.

    Meine Absicht war, einen reibungslosen Übergang zwischen einem behinderten und behinderten Zustand meiner Ansicht zu machen.

    Mein Fall ist noch komplizierter durch Konstruktion und Zweck der Ansicht. Es ist ein Schieberegler. Also meine Ansicht besteht aus fast 2 identischen Ebenen, die man oben auf den zweiten mit Leinwand gezeichnet hat. Drittes Element ist ein Zeiger.

    Beide Ebenen verwenden LinearGradients, Zeiger verwenden eine einzelne Farbe.

    Summing all Ich habe einen Übergang zwischen 5 Farben zur gleichen Zeit zu tun:

    • Start und Endfarbe für die untere Schicht – ein LinearGradient,
    • Start- und Endfarbe für Top-Layer – Zweiter LinearGradient,
    • Zeigerfarbe – normale Farbe;

    Lösung dafür ist 5 separate ValueAnimatoren. Das Wichtigste ist, ValueAnimator.ofArgb () zu verwenden:

    private ValueAnimator frontStartColorAnimator; private ValueAnimator frontEndColorAnimator; private ValueAnimator bottomStartColorAnimator; private ValueAnimator bottomEndColorAnimator; private ValueAnimator pointerColorAnimator; private AnimatorSet colorsAnimatorSet; ... frontStartColorAnimator = ValueAnimator.ofArgb(frontLayerStartColor, frontLayerDisabledStartColor); frontStartColorAnimator.setDuration(animationDuration); frontStartColorAnimator.setInterpolator(new LinearInterpolator()); frontStartColorAnimator.addUpdateListener(animation -> shaderFrontLayerStartColor = (int) animation.getAnimatedValue()); frontEndColorAnimator = ValueAnimator.ofArgb(frontLayerEndColor, frontLayerDisabledEndColor); frontEndColorAnimator.setDuration(animationDuration); frontEndColorAnimator.setInterpolator(new LinearInterpolator()); frontEndColorAnimator.addUpdateListener(animation -> { shaderFrontLayerEndColor = (int) animation.getAnimatedValue(); frontLayerPaint.setShader(new LinearGradient(0, 0, getWidth(), 0, shaderFrontLayerStartColor, shaderFrontLayerEndColor, Shader.TileMode.CLAMP)); }); bottomStartColorAnimator = ValueAnimator.ofArgb(bottomLayerStartColor, bottomLayerDisabledStartColor); bottomStartColorAnimator.setDuration(animationDuration); bottomStartColorAnimator.setInterpolator(new LinearInterpolator()); bottomStartColorAnimator.addUpdateListener(animation -> shaderBottomLayerStartColor = (int) animation.getAnimatedValue()); bottomEndColorAnimator = ValueAnimator.ofArgb(bottomLayerEndColor, bottomLayerDisabledEndColor); bottomEndColorAnimator.setDuration(animationDuration); bottomEndColorAnimator.setInterpolator(new LinearInterpolator()); bottomEndColorAnimator.addUpdateListener(animation -> { shaderBottomLayerEndColor = (int) animation.getAnimatedValue(); backLayerPaint.setShader(new LinearGradient(0, 0, 0, getHeight(), shaderBottomLayerStartColor, shaderBottomLayerEndColor, Shader.TileMode.CLAMP)); }); pointerColorAnimator = ValueAnimator.ofArgb(pointerEnabledColor, pointerDisabledColor); pointerColorAnimator.setDuration(animationDuration); pointerColorAnimator.setInterpolator(new LinearInterpolator()); pointerColorAnimator.addUpdateListener(animation -> { pointerColor = (int) animation.getAnimatedValue(); pointerPaint.setColor(pointerColor); }); colorsAnimatorSet = new AnimatorSet(); colorsAnimatorSet.playTogether(frontStartColorAnimator, frontEndColorAnimator, bottomStartColorAnimator, bottomEndColorAnimator, pointerColorAnimator); ... colorsAnimatorSet.start(); 

    Ich war auch besorgt über die Schaffung eines neuen LinearGradient auf jedem Animations-Update, aber dann habe ich GPU Profiling auf Gerät mit "On Screen als Bars" gestartet. Alles ist gut und läuft in sicherer Marge.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.