2014-06-25 3 views
17

Ich liebe die neue Touch-Ripple-Animation, die in der neuen Android L-Version als Teil der neuen UI-Philosophie Material Design eingeführt wurde.L-release-ähnliche Touch-Ripple-Animation auf Pre-L

Sie ein Video davon im offiziellen Design-Spezifikation unter Oberflächenreaktion finden Sie hier: http://www.google.com/design/spec/animation/responsive-interaction.html

Es ist im Grunde ein dunkelgrauer Kreis, der in der Mitte der Ansicht blendet und wächst, wie es aus schwindet wieder, schließlich füllen Sie die gesamte Ansicht mit einem hellen Grau, bevor sie wieder verschwinden.

Ich möchte die gleiche Animation zu einer Ansicht in meiner App hinzufügen, die auf ICS ausgerichtet ist.

Ich bin ein bisschen ratlos, wie Sie diese Animation in meiner Anwendung hinzufügen. Die offiziellen Dokumente unter http://developer.android.com/training/animation/index.html scheinen keine Animationen zu enthalten, die "innerhalb einer Ansicht" stattfinden. Ich möchte auch nicht, wenn möglich, vorgezeichnete Rahmenanimationen (eine PNG-Ressource pro Rahmen) verwenden.

Wie würde ich das umsetzen? Jede Hilfe wird sehr geschätzt!

+0

Ich würde bis morgen warten (wenn die neuen L-related APIs veröffentlicht werden), so können wir sehen, ob es etwas in der Support-Bibliothek geben wird, um dies zu unterstützen. –

+0

Der beste Weg ist die Verwendung eines benutzerdefinierten Zeichens. Bitte sehen Sie meine vorherige Antwort: http://StackOverflow.com/Questions/24213356/Animating-Actionbars-icon/24214040#24214040 (achten Sie darauf, auch die Kommentare auf die Antwort zu lesen) – Budius

Antwort

18

Etwas, das ich gekocht schnell auf, bei weitem nicht ideal, aber hey, es ist etwas: Gist

Im Grunde einen Kreis auf der Basis eines animierten Radius zeichnen. Um den genauen L-Effekt zu erhalten, sollten einige Feinabstimmungen vorgenommen werden. Der interessante Code:

@Override 
public boolean onTouchEvent(@NonNull final MotionEvent event) { 
    if (event.getActionMasked() == MotionEvent.ACTION_UP) { 
     mDownX = event.getX(); 
     mDownY = event.getY(); 

     ObjectAnimator animator = ObjectAnimator.ofFloat(this, "radius", 0, getWidth() * 3.0f); 
     animator.setInterpolator(new AccelerateInterpolator()); 
     animator.setDuration(400); 
     animator.start(); 
    } 
    return super.onTouchEvent(event); 
} 

public void setRadius(final float radius) { 
    mRadius = radius; 
    if (mRadius > 0) { 
     RadialGradient radialGradient = new RadialGradient(
       mDownX, 
       mDownY, 
       mRadius * 3, 
       Color.TRANSPARENT, 
       Color.BLACK, 
       Shader.TileMode.MIRROR 
     ); 
     mPaint.setShader(radialGradient); 
    } 
    invalidate(); 
} 

private Path mPath = new Path(); 
private Path mPath2 = new Path(); 

@Override 
protected void onDraw(@NonNull final Canvas canvas) { 
    super.onDraw(canvas); 

    mPath2.reset(); 
    mPath2.addCircle(mDownX, mDownY, mRadius, Path.Direction.CW); 

    canvas.clipPath(mPath2); 

    mPath.reset(); 
    mPath.addCircle(mDownX, mDownY, mRadius/3, Path.Direction.CW); 

    canvas.clipPath(mPath, Region.Op.DIFFERENCE); 

    canvas.drawCircle(mDownX, mDownY, mRadius, mPaint); 
} 

In ihrem Vortrag "Was in Android ist neu", sprachen sie über, dass diese Animation passiert eigentlich auf einem separaten "Render-Thread", das sein Debüt in der L-Release machen . Dies ermöglicht glattere Animationen, selbst wenn der UI-Thread gerade aktiv ist oder etwas anderes kostet.

+0

Vielen Dank! Ich schätze, ich werde irgendwann eine Kombination aus Ihrer Antwort und Budius Kommentar verwenden. –

+0

Ihre Idee ist großartig, aber der Farbverlauf sollte bleiben, während der Benutzer den Knopf berührt, nein? –

+0

Gibt es einen merklichen Leistungseinfluss auf Pre-L-Geräte ohne den Render-Thread? – Xiao

5

Meine Antwort ist etwas spät, aber ich wollte meine Lösung auch teilen. Ich habe eine andere Klasse namens TouchEffectAnimator mit der Idee von Niek Haarman erstellt. Danke an Herrn Haarman übrigens.

Sie können die Klasse und eine Beispielverwendung davon on this gist sehen. Auch ich werde es einfach erklären.

Die Klasse enthält alle notwendigen Methoden und Variablen und erstellt die gleiche Animation, die Android L (Vorschau) derzeit hat. Zur Verwendung dieser Klasse:

  • Erstellen Sie eine benutzerdefinierte Ansicht. (Im Wesentlichen habe ich ein LinearLayout erstellt.)
  • Initialisieren Sie das TouchEffectAnimator-Objekt.
  • Definieren Sie einige Attribute wie Farbe, Effekttyp, Dauer und Größe der Clip-Ecken.
  • Rufen Sie die onTouchEvent Methode des TouchEffectAnimator innerhalb der Ansicht onTouchEvent.
  • Rufen Sie die onDraw Methode des TouchEffectAnimator innerhalb der Ansicht OnDraw.

und das ist es. Aber es gibt zwei Dinge, die getan werden sollten, damit diese Klasse richtig funktioniert.

  • sollte es sein, einige OnClickListener auf der Ansicht der UP Berührungsereignis zu erhalten.
  • Es sollte ein benutzerdefinierter oder transparenter Hintergrund für die Ansicht festgelegt werden. Wenn nichts als Hintergrund eingestellt ist, wird die Animation nicht angezeigt.

Ich hoffe, es funktioniert auch für Sie.

P.S. Ich habe diese Klasse für mein Bibliotheksprojekt Android FlatUI Kit erstellt. Sie können die Verwendung dieser Klasse auch in der FlatButton-Klasse sehen.

+0

Schön, danke für das Teilen, ich werde versuchen, Ihren TouchEffectAnimator zu tunen, es funktioniert perfekt! – 2Dee

+0

Das funktioniert super, abgesehen von einer kleinen Inkonsistenz, die ich beobachtet habe. Wenn die erste Berührungstaste eine QUICK-Taste ist (state_pressed wird nur sehr wenig Zeit haben), ist die Animation nicht korrekt. – Sreeraj