Circular offenbaren Übergang für neue Aktivität

Wie pro https://developer.android.com/training/material/animations.html

Mit der Methode ViewAnimationUtils.createCircularReveal() können Sie einen Beschneidungskreis animieren, um eine Ansicht anzuzeigen oder auszublenden.

  • Ringformen für L Vorschau funktioniert nicht
  • Wie man mehrere Videodateien gleichzeitig in einem Layout nebeneinander in einer anderen Ansicht in Android spielt
  • Android-Software-Tastatur wechseln zwischen numerisch und alphabetisch programmgesteuert
  • AppCompat v21 Dark ToolBar Stil
  • Ist eine "Globals" -Klasse mit statischen Variablen in Android sicher?
  • Setzen Sie die Wiedergabe des YouTube-Players fort, während Sie das Gerät mit separaten Ausrichtungslayouts drehen
  • Um eine bisher unsichtbare Ansicht mit diesem Effekt zu verdeutlichen:

     // previously invisible view View myView = findViewById(R.id.my_view); // get the center for the clipping circle int cx = (myView.getLeft() + myView.getRight()) / 2; int cy = (myView.getTop() + myView.getBottom()) / 2; // get the final radius for the clipping circle int finalRadius = Math.max(myView.getWidth(), myView.getHeight()); // create the animator for this view (the start radius is zero) Animator anim = ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius); // make the view visible and start the animation myView.setVisibility(View.VISIBLE); anim.start(); 

    Das soll eine Ansicht verraten. Wie kann ich das verwenden, um eine ganze Aktivität zirkulär zu enthüllen, ohne gemeinsame Elemente?

    Im Einzelnen möchte ich, dass meine searchActivity aus der Suchaktionstaste in der Symbolleiste zirkulär erscheint.

  • Android Split String
  • In Android, wie man EditText der festen Breite zu erstellen?
  • Android-Aktivität als Dialog, aber ohne Titelleiste
  • Wie bekomme ich die Scroll-Position von GridView?
  • Android-Prozess Audio für Gitarren-Tuner
  • Android ListView Zeilen in ScrollView nicht vollständig angezeigt - abgeschnitten
  • 5 Solutions collect form web for “Circular offenbaren Übergang für neue Aktivität”

    Nachdem ich eine Lösung für einen halben Tag ohne Ergebnis gesucht habe, kam ich mit einer eigenen Implementierung auf. Ich verwende eine transparente Aktivität mit einem passenden Root-Layout. Das Wurzellayout ist eine Ansicht, die dann mit createCircularReveal() .

    Mein Code sieht so aus:

    Theme Definition in styles.xml

     <style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowIsTranslucent">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item> </style> 

    Aktivitätsdefinition in AndroidManifest.xml

     <activity android:name=".ui.CircularRevealActivity" android:theme="@style/Theme.Transparent" android:launchMode="singleTask" /> 

    Dann habe ich ein Layout für meine Tätigkeit erklärt (ich habe DrawerLayout gewählt, damit ich einen NavDrawer haben kann. Jedes Layout sollte hier arbeiten.)

     <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/honey_melon" > <!-- Insert your actual layout here --> </FrameLayout> </android.support.v4.widget.DrawerLayout> 

    Wichtig ist die FrameLayout mit der ID root_layout . Diese Ansicht wird in der Aktivität aufgedeckt werden.

    Schließlich habe ich CircularRevealActivity implementiert und onCreate() :

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); overridePendingTransition(R.anim.do_not_move, R.anim.do_not_move); setContentView(R.layout.activity_reveal_circular); if (savedInstanceState == null) { rootLayout.setVisibility(View.INVISIBLE); ViewTreeObserver viewTreeObserver = rootLayout.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { circularRevealActivity(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { rootLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { rootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } }); } } } 

    Es war wichtig, circularRevealActivity() in einen OnGlobalLayoutListener , da die Ansicht für die Animation gezeichnet werden muss.

    circularRevealActivity() sieht aus wie Ishaans Vorschlag:

     private void circularRevealActivity() { int cx = rootLayout.getWidth() / 2; int cy = rootLayout.getHeight() / 2; float finalRadius = Math.max(rootLayout.getWidth(), rootLayout.getHeight()); // create the animator for this view (the start radius is zero) Animator circularReveal = ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, 0, finalRadius); circularReveal.setDuration(1000); // make the view visible and start the animation rootLayout.setVisibility(View.VISIBLE); circularReveal.start(); } 

    Bearbeiten 1

    Die Definition für R.anim.do_not_move wurde hinzugefügt. Allerdings sollte es auch ohne diese Zeile funktionieren, wenn Ihr Design keine Standardübergänge für Aktivitäten festlegt. Gib mir Bescheid

    R.anim.do_not_move:

     <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="0" android:toYDelta="0" android:duration="@android:integer/config_mediumAnimTime" /> </set> 

    Um die CircularReveal Animation umzukehren, tauschen Sie die Argumente startRadius und endRadius . Außerdem müssen Sie einen AnimatorListener onAnimationEnd() und in der onAnimationEnd() können Sie finishAfterTransition() aufrufen. Dies ist für, wenn Sie die up navigation drücken oder klicken Sie auf die back button .

    Ich denke, Sie können ActivityOptionsCompat.makeClipRevealAnimation .

    [ https://developer.android.com/reference/android/support/v4/app/ActivityOptionsCompat.html#makeClipRevealAnimation(android.view.View , int, int, int, int)] ( https://developer.android .com / reference / android / support / v4 / app / ActivityOptionsCompat.html # makeClipRevealAnimation (android.view.View , int, int, int, int))

    Wenn Sie die Rundschreiben beim Verlassen der Aktivität umkehren möchten, verwenden Sie die folgende Änderung an onBackPressed ().

     @Override public void onBackPressed() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { int cx = rootLayout.getWidth(); int cy = 0; float finalRadius = Math.max(rootLayout.getWidth(), rootLayout.getHeight()); Animator circularReveal = ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, finalRadius, 0); circularReveal.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { rootLayout.setVisibility(View.INVISIBLE); finish(); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); circularReveal.setDuration(400); circularReveal.start(); }else{ super.onBackPressed(); } } 

    Ou muss die Kreisansicht zeichnen, und danach solltest du eine Animation erstellen.

    Erstellen der Kreisansicht:

     public class Circle extends View { private static final int START_ANGLE_POINT = 90; private final Paint paint; private final RectF rect; private float angle; public Circle(Context context, AttributeSet attrs) { super(context, attrs); final int strokeWidth = 40; paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(strokeWidth); //Circle color paint.setColor(Color.RED); //size 200x200 example rect = new RectF(strokeWidth, strokeWidth, 200 + strokeWidth, 200 + strokeWidth); //Initial Angle (optional, it can be zero) angle = 120; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawArc(rect, START_ANGLE_POINT, angle, false, paint); } public float getAngle() { return angle; } public void setAngle(float angle) { this.angle = angle; } } 

    Erstellen der Animationsklasse, um den neuen Winkel einzustellen:

     public class CircleAngleAnimation extends Animation { private Circle circle; private float oldAngle; private float newAngle; public CircleAngleAnimation(Circle circle, int newAngle) { this.oldAngle = circle.getAngle(); this.newAngle = newAngle; this.circle = circle; } @Override protected void applyTransformation(float interpolatedTime, Transformation transformation) { float angle = oldAngle + ((newAngle - oldAngle) * interpolatedTime); circle.setAngle(angle); circle.requestLayout(); } } 

    Setzen Sie den Kreis in Ihr Layout:

     <com.package.Circle android:id="@+id/circle" android:layout_width="300dp" android:layout_height="300dp" /> 

    Und endlich die Animation:

     Circle circle = (Circle) findViewById(R.id.circle); CircleAngleAnimation animation = new CircleAngleAnimation(circle, 240); animation.setDuration(1000); circle.startAnimation(animation); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.