Wie wende ich eine Folienanimation zwischen zwei Aktivitäten in Android an?

Lesezeit: 10 Minuten

Benutzer-Avatar
Jignesh Ansodariya

Ich möchte einen Gleiteffekt von links nach rechts erzielen, wenn ich mich von einer Aktivität zur anderen bewege. Dafür verwende ich den folgenden Code, aber ich bekomme keine Ergebnisse. Bitte korrigieren Sie mich.

In Java beide Dateien:

super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);

Zwei Dateien im res/anim-Verzeichnis:

fadein.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_out_right"
    android:toAlpha="1.0" >
</alpha>

fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_in_left"
    android:toAlpha="1.0" >
</alpha>

  • Ich habe diesen Code verwendet: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); Sie können diese Beispiele in sehen GmailAnimation oder LopeAnimationen. Darin sieht man auch mehr Bloggen.

    – Cabezas

    15. Februar 2017 um 12:08 Uhr

Benutzer-Avatar
Geboren um zu gewinnen

Fügen Sie diese beiden Dateien im Ordner res/anim hinzu.

R.anim.slide_out_bottom

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="@integer/time_duration_max"
    android:fromXDelta="0%"
    android:fromYDelta="100%"
    android:toXDelta="0%"
    android:toYDelta="0%" />
</set>

R.anim.slide_in_bottom

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="@integer/time_duration_max"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="100%" /> 
</set>

Und schreiben Sie die folgende Codezeile in Ihren View-Click-Listener.

startActivity(new Intent(MainActivity.this, NameOfTargetActivity.class));
overridePendingTransition(R.anim.slide_out_bottom, R.anim.slide_in_bottom);

  • Danke – Wo soll ich jetzt die umgekehrte Animation platzieren, wenn ich durch Drücken der Zurück-Taste zur alten Aktivität zurückkehre?

    – Em Ae

    8. Dezember 2015 um 2:43 Uhr

  • @EmAe, ich habe eine ähnliche Frage gestellt und hier selbst beantwortet: stackoverflow.com/questions/39711666/…. Hoffe es wird dir helfen!

    – P. Kuijpers

    7. Dezember 2016 um 19:54 Uhr


  • @Born To Win Wenn möglich, können Sie eine umgekehrte Animation hinzufügen.

    – Amit Vaghela

    31. Mai 2018 um 13:04 Uhr

  • sind die anim nicht falsch herum? Es ist (enterAnim, exitAnim)

    – hmac

    29. Juli 2021 um 13:31 Uhr

Benutzer-Avatar
Shohan Ahmed Sijan

Geben Sie hier die Bildbeschreibung ein

Sie können Ihre standardmäßige Aktivitätsanimation überschreiben und sie funktioniert besser als overridePendingTransition. Ich verwende diese Lösung, die für jede Android-Version funktioniert. Kopieren Sie einfach 4 Dateien und fügen Sie einen 4-Zeilen-Stil wie folgt hinzu:

Erstellen Sie eine „CustomActivityAnimation“ und fügen Sie diese Ihrem Basisdesign durch „windowAnimationStyle“ hinzu.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Erstellen Sie dann einen Animationsordner unter dem res-Ordner und erstellen Sie dann diese vier Animationsdateien im Animationsordner:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Wenn Sie auf ein Problem stoßen, können Sie meine herunterladen Beispielprojekt von github.

Vielen Dank

  • Ich verwende Android 6 Huawei und es funktioniert sehr gut. 🙂

    – Shohan Ahmed Sijan

    8. Mai 2017 um 12:27 Uhr

  • sehr schön … funktioniert sehr gut … wir müssen nicht in aller Absicht hinzufügen, dass dies ein Vorteil dieser Methode ist … als Shohan

    – Manthan Patel

    30. Oktober 2017 um 6:20 Uhr

  • Ich liebe solche Lösungen! Legen Sie es an einen Ort und funktioniert überall wie ein Zauber!

    – vepzfe

    13. Dezember 2018 um 13:19 Uhr

  • Dies ist die beste Lösung. Keine Notwendigkeit, in Java/Kotlin zu programmieren. Legen Sie einfach diese XML-Dateien ab und alles ist einfach erledigt.

    – Mohit Rajput

    19. Februar 2020 um 7:08 Uhr

  • Dies ist eine magische Lösung und verdient 1000 Upvotes. So einfache und elegante Lösungen findet man selten. Und das Beste daran ist, dass keine hässliche lange Codierung erforderlich ist, einfach XML erledigt alles.

    – Zeeshan

    26. Juli 2020 um 13:37 Uhr


protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);

         new Handler().postDelayed(new Runnable() {
             public void run() {

                     /* Create an intent that will start the main activity. */
                     Intent mainIntent = new Intent(SplashScreen.this,
                             ConnectedActivity.class);
                     mainIntent.putExtra("id", "1");

                     //SplashScreen.this.startActivity(mainIntent);
                     startActivity(mainIntent);
                     /* Finish splash activity so user cant go back to it. */
                     SplashScreen.this.finish();

                     /* Apply our splash exit (fade out) and main
                        entry (fade in) animation transitions. */
                     overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
             }
     }, SPLASH_DISPLAY_TIME);   
    }

  • Bitte vermeiden Sie diese Art von verzögertem Aktivitätsstart! Es startet Ihre MainActivity, auch wenn Ihre App nicht mehr im Vordergrund ist.

    – Benoît

    10. April 2019 um 9:49 Uhr

Schieben Sie mit Alpha-Animation mit ein paar Notizen nach oben / unten

Geben Sie hier die Bildbeschreibung ein

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0"/>
    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1"/>
</set>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="0"
        android:toYDelta="100%p"/>
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0.5"/>
</set>

no_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    android:fromYDelta="0"
    android:toYDelta="0"/>

Erste Aktivität

startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up,  R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate

Zweite Aktivität

finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);

Fertig

MEHR

Ich versuche, die Folienanimation wie eine iOS-Animation zu machen, wenn ein Ansichtsmodell vorhanden ist (wie diese https://www.youtube.com/watch?v=deZobvh2064) aber scheiterte.

Wenn Sie sich die aktuelle iOS-Animation ansehen, werden Sie sehen: Die Animation von unten mit Alpha (ca. 50%), dann geht es sehr schnell, dann langsamer, die Animationszeit beträgt ungefähr> 500 ms (ich verwende Trim-Video-Tools, um die Animationszeit zu zählen
https://www.kapwing.com/trim-video also kann es nicht genau 100%)

Dann versuche ich, mich auf Android zu bewerben.
Um Alpha zu machen, verwende ich <alpha> und Erfolg.
Damit die Animation schneller startet als langsamer, verwende ich android:interpolator="a decelerate interpolator" aber es wäre fast gescheitert.

Es gibt 3 Standardwerte decelerate interpolator im Android
@android:interpolator/decelerate_quad -> Faktor = 1
@android:interpolator/decelerate_cubic -> Faktor = 1,5
@android:interpolator/decelerate_quint _> Faktor = 2,5
(höherer Faktor <=> Animation startet am Anfang schneller und am Ende langsamer)
Hier ist eine gute Anleitung http://cogitolearning.co.uk/2013/10/android-animations-tutorial-5-more-on-interpolators/ um es zu verstehen

Ich habe 3 oben versucht, ich kann es nicht wie iOS erreichen, die Animation kann nicht schneller starten als iOS. Dann erstelle ich einen benutzerdefinierten decelerateInterpolator mit Faktor = 3 wie

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:factor="3" />

und ich steigere die Dauer mal ab 500 -> 750. Es funktioniert gut (sehr ähnlich wie iOS). Es funktioniert jedoch nur auf einigen Geräten gut, auf einigen Geräten ist die Animation ziemlich langsam. Später weiß ich, dass die Animation auf verschiedenen Geräten unterschiedlich sein kann (z. B. einige Geräte werden schneller und einige langsamer), sodass ich die Animation nicht auf allen Android-Geräten ähnlich machen kann. Daher benutze ich nicht interpolator. Ich weiß nicht, ob mein Test genau 100 % ist oder nicht, aber ich hoffe, diese Erfahrung hilft

Benutzer-Avatar
Rohit Singh

Hier ist eine Folienanimation für Sie.

Geben Sie hier die Bildbeschreibung ein

Angenommen, Sie haben zwei Aktivitäten.

  1. MovieDetailActivity
  2. AllCastActivity

Und auf Knopfdruck passiert das.

Geben Sie hier die Bildbeschreibung ein

Sie können dies in 3 einfachen Schritten erreichen

1) Inhaltsübergang aktivieren

Gehen Sie zu Ihrem style.xml und fügen Sie diese Zeile hinzu, um den Inhaltsübergang zu aktivieren.

<item name="android:windowContentTransitions">true</item>

2) Schreiben Sie den standardmäßigen Eintritts- und Austrittsübergang für Ihre AllCastActivity

public void setAnimation()
{
    if(Build.VERSION.SDK_INT>20) {
        Slide slide = new Slide();
        slide.setSlideEdge(Gravity.LEFT);
        slide.setDuration(400);
        slide.setInterpolator(new AccelerateDecelerateInterpolator());
        getWindow().setExitTransition(slide);
        getWindow().setEnterTransition(slide);
    }
}

3) Aktivität mit Absicht starten

Schreiben Sie diese Methode in Ihre MovieDetailActivity anfangen AllCastActivity

public void startActivity(){

Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putStringArrayListExtra(MOVIE_LIST, movie.getImages());

  if(Build.VERSION.SDK_INT>20)
   {
       ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(BlankActivity.this);
       startActivity(i,options.toBundle());
   }
   else {
       startActivity(i);
   }
}

Am wichtigsten!

legen Sie Ihre setAnimation()Methode vor setContentView() Methode andernfalls funktioniert die Animation nicht.
Also dein AllCastActivity.javasollte so aussehen

 class AllCastActivity extends AppcompatActivity {

   @Override
   protected void onCreate(Bundle savedInstaceState)
   {
      super.onCreate(savedInstaceState);

      setAnimation();

      setContentView(R.layout.all_cast_activity);

      .......
   }

   private void setAnimation(){

      if(Build.VERSION.SDK_INT>20) {
      Slide slide = new Slide();
      slide.setSlideEdge(Gravity.LEFT);
      ..........
  }
}

Benutzer-Avatar
Suraj Rao

Hoffentlich wird es für Sie funktionieren.

startActivityForResult( intent, 1 , ActivityOptions.makeCustomAnimation(getActivity(),R.anim.slide_out_bottom,R.anim.slide_in_bottom).toBundle());

Benutzer-Avatar
Jamil Hasnine Tamim

Kotlin-Beispiel:

    private val SPLASH_DELAY: Long = 1000

    internal val mRunnable: Runnable = Runnable {
        if (!isFinishing) {
            val intent = Intent(applicationContext, HomeActivity::class.java)
            startActivity(intent)
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
            finish()
        }
    }


   private fun navigateToHomeScreen() {
        //Initialize the Handler
        mDelayHandler = Handler()

        //Navigate with delay
        mDelayHandler!!.postDelayed(mRunnable, SPLASH_DELAY)

    }

    public override fun onDestroy() {

        if (mDelayHandler != null) {
            mDelayHandler!!.removeCallbacks(mRunnable)
        }

        super.onDestroy()
    }

Animationen im Animationsordner ablegen:

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_longAnimTime"
        android:fromXDelta="100%p"
        android:toXDelta="0%p">
</translate>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_longAnimTime"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p">
</translate>

VERWENDUNGSZWECK

  navigateToHomeScreen();

1256960cookie-checkWie wende ich eine Folienanimation zwischen zwei Aktivitäten in Android an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy