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>
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);
}
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);
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
Schieben Sie die Alpha-Animation mit ein paar Noten nach oben/unten
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
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.
Nehmen wir an, Sie haben zwei Aktivitäten.
Und auf Knopfdruck geschieht dies.
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);
}
}
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);
..........
}
}
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.
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();