webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Folienanimation zwischen zwei Aktivitäten in Android anwenden?

Ich möchte einen gleitenden Effekt von links nach rechts erzielen, wenn ich von einer Aktivität zur anderen wechsle. Dafür verwende ich den folgenden Code, erhalte aber keine Ergebnisse. Bitte korrigiere 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>
44
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);   
    }
28
MAC

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

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"/>

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"/>

Schreiben Sie den folgenden Code in die onCreate () - Methode der nächsten Aktivität, die Sie durch den Intent durchlaufen.

overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
141
Born To Win

Sie können Ihre Standardaktivitätsanimation überschreiben, und sie ist besser als das Überschreiben von PendingTransition. 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 durch "windowAnimationStyle" Ihrem Basisdesign 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>

Dann erstellen Sie den anim-Ordner unter dem res-Ordner und erstellen Sie dann diese vier Animationsdateien in den anim-Ordner:

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 Probleme haben, können Sie mein Beispielprojekt von github herunterladen.

Vielen Dank

45

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

enter image description here

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);

Erledigt

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

Wenn Sie sich die aktuelle Animation für iOS ansehen, werden Sie sehen: Die Animation von unten mit Alpha (etwa 50%) geht dann sehr schnell und dann langsamer, die Animationszeit beträgt etwa> 500ms (Ich verwende Videotools zum Zählen der Animationszeit https://www.kapwing.com/trim-video so kann es nicht genau 100% sein) 

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

Es gibt 3 voreingestellte decelerate interpolator in Android
@Android:interpolator/decelerate_quad -> Faktor = 1
@Android:interpolator/decelerate_cubic -> Faktor = 1,5
@Android:interpolator/decelerate_quint _> Faktor = 2,5
(Animation mit höherem Faktor <=> startet schneller von Anfang an und langsamer am Ende)
Hier ist ein gutes Tutorial http://cogitolearning.co.uk/2013/10/Android-animations-tutorial-5-more-on-interpolators/ um es zu verstehen

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

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

und ich verlängere die Dauer von 500 -> 750. Es funktioniert gut (sehr ähnlich wie bei iOS). Es funktioniert jedoch nur in einigen Geräten gut, in einigen Geräten ist die Animation ziemlich langsam. Später weiß ich, dass die Animation auf verschiedenen Geräten unterschiedlich sein kann (z. B .: ein Gerät wird schneller und ein anderes Gerät wird langsamer). Daher kann ich die Animation nicht auf allen Android-Geräten erstellen. Daher verwende ich keine interpolator. Ich weiß nicht, ob meine Tests genau 100% sind oder nicht, aber ich hoffe, dass diese Erfahrung hilft

4
Linh

Sie könnten overridePendingTransition in startActivity anstelle von onCreate verwenden. Zumindest funktioniert das bei mir!

Siehe ein vollständiges Beispiel hier . Es enthält eine (umgekehrte) Animation auf BackPressed, also zur vorherigen Aktivität zurückkehren! In Ihrem speziellen Beispiel (Einblenden und Ausblenden) ist dies jedoch möglicherweise nicht erforderlich.

1
P Kuijpers

Hier ist eine Folienanimation für Sie.

 enter image description here

Nehmen wir an, Sie haben zwei Aktivitäten. 

  1. MovieDetailAktivität
  2. AllCastActivity 

Und auf Knopfdruck geschieht dies.

 enter image description here

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) Schreibe Standardeingabe und -übergang für 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, um AllCastActivity zu starten.

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!

setzen Sie Ihre setAnimation()method vor der setContentView()-Methode, da sonst die Animation nicht funktioniert.
___ Ihr AllCastActivity.Java sollte 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);
      ..........
  }
}
0
Rohit Singh

Folienanimationen können auf Aktivitätsübergänge angewendet werden, indem overridePendingTransition aufgerufen und Animationsressourcen für Eingabe- und Beendigungsaktivitäten übergeben werden.

Folienanimationen können nach rechts verschoben werden, nach links schieben, nach oben und nach unten gleiten.

Slide up

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:interpolator="@Android:anim/linear_interpolator">
    <scale
        Android:duration="800"
        Android:fromXScale="1.0"
        Android:fromYScale="1.0"
        Android:toXScale="1.0"
        Android:toYScale="0.0" />
</set>

Herunterrutschen

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:interpolator="@Android:anim/linear_interpolator">
    <scale
        Android:duration="800"
        Android:fromXScale="1.0"
        Android:fromYScale="0.0"
        Android:toXScale="1.0"
        Android:toYScale="1.0" />
</set>

overridePendingTransition (R.anim.slide_down, R.anim.slide_up);

Siehe Animationsbeispiele für Aktivitätsübergänge für weitere Beispiele für Aktivitätsübergänge.

0
Arnav Rao

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 in anim Ordner legen:

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();
0
Hitesh Sahu