J'ai trois activités dont les modes de lancement sont à instance unique.
En utilisant onfling()
, je les balance à gauche et à droite.
Le problème est que lorsque je balaie de droite à gauche, la transition de la diapositive est correcte, mais lorsque je balaie de gauche à droite, la transition de balayage de droite à gauche est obtenue.
Je sais pourquoi cela se produit parce que j'envoie toujours de nouvelles intentions. Mais maintenant je dois changer l’animation de glisser de gauche à droite.
Je sais qu'il existe une méthode appelée overridingTransitionPending()
, mais je ne sais pas comment définir mon animation en XML.
Utiliser ce xml dans res/anim/
C'est pour l'animation de gauche à droite:
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate Android:fromXDelta="-100%" Android:toXDelta="0%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700"/>
</set>
C'est pour l'animation de droite à gauche:
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:fromXDelta="0%" Android:toXDelta="100%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700" />
</set>
Dans votre code, utilisez l’intention de gauche à droite:
this.overridePendingTransition(R.anim.animation_enter,
R.anim.animation_leave);
Dans votre code, utilisez l’intention comme pour de droite à gauche
this.overridePendingTransition(R.anim.animation_leave,
R.anim.animation_enter);
Si vous souhaitez que la transition fonctionne pour toute l'application, vous pouvez créer un rootacivity
et en hériter dans l'activité dont vous avez besoin. Dans onCreate de Root Activity, appelez overridePendingTransition
avec la direction souhaitée. Et onStart
appelez overridePendingTransition
avec une autre direction si l'activité reprend. Ici, je donne le code complet ci-dessous. Corrigez-moi si je me trompe.
créer ce fichier xml sur votre dossier anim
anim_slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<translate
Android:duration="600"
Android:fromXDelta="100%"
Android:toXDelta="0%" >
</translate>
</set>
anim_slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<translate
Android:duration="600"
Android:fromXDelta="-100%"
Android:toXDelta="0%" >
</translate>
</set>
anim_slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<translate
Android:duration="600"
Android:fromXDelta="0%"
Android:toXDelta="-100%" >
</translate>
</set>
anim_slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<translate
Android:duration="600"
Android:fromXDelta="0%"
Android:toXDelta="100%" >
</translate>
</set>
RootActivity
import Android.app.Activity;
import Android.os.Bundle;
public class RootActivity extends Activity {
int onStartCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onStartCount = 1;
if (savedInstanceState == null) // 1st time
{
this.overridePendingTransition(R.anim.anim_slide_in_left,
R.anim.anim_slide_out_left);
} else // already created so reverse animation
{
onStartCount = 2;
}
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
if (onStartCount > 1) {
this.overridePendingTransition(R.anim.anim_slide_in_right,
R.anim.anim_slide_out_right);
} else if (onStartCount == 1) {
onStartCount++;
}
}
}
FirstActivity
import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;
public class FirstActivity extends RootActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tvTitle);
tv.setText("First Activity");
Button bt = (Button) findViewById(R.id.buttonNext);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(i);
}
});
}
}
SecondActivity
import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;
public class SecondActivity extends RootActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tvTitle);
tv.setText("Second Activity");
Button bt = (Button) findViewById(R.id.buttonNext);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(SecondActivity.this, ThirdActivity.class);
startActivity(i);
}
});
}
}
ThirdActivity
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;
public class ThirdActivity extends RootActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tvTitle);
tv.setText("Third Activity");
Button bt = (Button) findViewById(R.id.buttonNext);
bt.setText("previous");
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
et enfin manifeste
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.transitiontest"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk
Android:minSdkVersion="8"
Android:targetSdkVersion="18" />
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name="com.example.transitiontest.FirstActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
Android:name="com.example.transitiontest.SecondActivity"
Android:label="@string/app_name" >
</activity>
<activity
Android:name="com.example.transitiontest.ThirdActivity"
Android:label="@string/app_name" >
</activity>
</application>
</manifest>
Fait un exemple de code implémentant la même chose avec des effets de diapositive de gauche, droite, haut et bas. (Pour ceux qui ne veulent pas faire tous ces fichiers XML animés :))
Commander le code sur github
Vous pouvez écraser votre animation d'activité par défaut. Voici la solution que j'utilise:
Créez un "CustomActivityAnimation" et ajoutez-le à votre thème de base par "windowAnimationStyle".
<!-- 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>
Créez un dossier anim sous le dossier res puis créez ces quatre fichiers d’animation:
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>
Ceci est mon exemple de projet dans github.
C'est tout ... Bon codage :)
En outre, vous pouvez faire ceci:
FirstClass.this.overridePendingTransition(Android.R.anim.slide_in_left, Android.R.anim.slide_out_right);
Et vous n'avez pas besoin d'ajouter d'animation xml
Si vous souhaitez appliquer l'animation à " activité " commencez, écrivez ci-dessous le code.
startActivity(intent);
overridePendingTransition(R.anim.opening_anim, R.anim.closing_anim);
Si vous voulez appliquer l'animation sur " dialogue ", ajoutez d'abord le code ci-dessous dans le fichier
styles.xml
<style name="my_style”>
<item
name="@Android:windowEnterAnimation">@anim/opening_anim</item>
<item
name="@Android:windowExitAnimation">@anim/closing_anim</item>
</style>
tilisez ce style tel que défini ci-dessous.
final Dialog dialog = new Dialog(activity);
dialog.getWindow().getAttributes().windowAnimations = R.style.my_style;
Si vous souhaitez appliquer l'animation à " view ", écrivez ci-dessous le code
txtMessage = (TextView) findViewById(R.id.txtMessage);
// load the animation
animFadein = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.animation);
// start the animation
txtMessage.startAnimation(animFadein);
Ci-dessous, j'ai mentionné la plupart de l'animation
.xml
code.
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<alpha
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="1"
Android:fromAlpha="1.0"
Android:toAlpha="1.0"/>
</set>
==========================================
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<alpha
Android:fromAlpha="0.0"
Android:toAlpha="1.0"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="300"
Android:repeatCount="0" />
</set>
=========================================
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<alpha
Android:fromAlpha="1.0"
Android:toAlpha="0.0"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="300"
Android:repeatCount="0" />
</set>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromYDelta="-100%p" Android:toYDelta="0" Android:duration="400"/>
</set>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromYDelta="0" Android:toYDelta="100%p" Android:duration="400"/>
</set>
=========================================
<?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="300"/>
<alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>
=========================================
<?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="300"/>
<alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>
=========================================
<?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="300"/>
<alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>
=========================================
<?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="300"/>
<alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromYDelta="100%p" Android:toYDelta="0" Android:duration="300"/>
<alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromYDelta="0" Android:toYDelta="-100%p" Android:duration="300"/>
<alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromDegrees="0"
Android:toDegrees="-90"
Android:pivotX="50%"
Android:pivotY="50%"
Android:duration="0" Android:fillAfter="true">
</rotate>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<scale Android:fromYScale="0" Android:toYScale="1.0"
Android:fromXScale="0" Android:toXScale="1.0"
Android:duration="500" Android:pivotX="100%"
Android:pivotY="100%" />
</set>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<scale Android:fromYScale="1.0" Android:toYScale="0"
Android:fromXScale="1.0" Android:toXScale="0"
Android:duration="500"/>
</set>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<scale
Android:fromXScale="1.0" Android:toXScale="0.8"
Android:fromYScale="1.0" Android:toYScale="0.8"
Android:pivotX="50%p" Android:pivotY="50%p"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="100"
/>
<scale
Android:fromXScale="1.0" Android:toXScale="0.0"
Android:fromYScale="1.0" Android:toYScale="1.0"
Android:pivotX="50%p" Android:pivotY="50%p"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="150"
Android:startOffset="100"
/>
=========================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<scale
Android:fromXScale="0.0" Android:toXScale="1.0"
Android:fromYScale="1.0" Android:toYScale="1.0"
Android:pivotX="50%p" Android:pivotY="50%p"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="150"
Android:startOffset="250"
/>
<scale
Android:fromXScale="0.8" Android:toXScale="1.0"
Android:fromYScale="0.8" Android:toYScale="1.0"
Android:pivotX="50%p" Android:pivotY="50%p"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="100"
Android:startOffset="400"
/>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<alpha Android:fromAlpha="0.0"
Android:toAlpha="1.0"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:duration="800"
Android:repeatMode="reverse"
Android:repeatCount="infinite"/>
</set>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<scale
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="1000"
Android:fromXScale="1"
Android:fromYScale="1"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toXScale="3"
Android:toYScale="3" >
</scale>
</set>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<scale
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="1000"
Android:fromXScale="1.0"
Android:fromYScale="1.0"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toXScale="0.5"
Android:toYScale="0.5" >
</scale>
</set>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<alpha
Android:duration="1000"
Android:fromAlpha="0.0"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:toAlpha="1.0" />
</set>
=======================================
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<alpha
Android:duration="1000"
Android:fromAlpha="1.0"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:toAlpha="0.0" />
</set>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/linear_interpolator"
Android:fillAfter="true">
<translate
Android:fromXDelta="0%p"
Android:toXDelta="80%p"
Android:duration="1000" />
</set>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true">
<scale
Android:duration="800"
Android:fromXScale="1.0"
Android:fromYScale="0.0"
Android:interpolator="@Android:anim/linear_interpolator"
Android:toXScale="1.0"
Android:toYScale="1.0" />
</set>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<scale
Android:duration="800"
Android:fromXScale="1.0"
Android:fromYScale="1.0"
Android:interpolator="@Android:anim/linear_interpolator"
Android:toXScale="1.0"
Android:toYScale="0.0" />
</set>
=======================================
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true"
Android:interpolator="@Android:anim/bounce_interpolator">
<scale
Android:duration="800"
Android:fromXScale="1.0"
Android:fromYScale="0.0"
Android:toXScale="1.0"
Android:toYScale="1.0" />
</set>
Je n'ai trouvé aucune solution pour ce type d'animation avec ViewPropertyAnimator.
Voici un exemple:
Mise en page:
<FrameLayout
Android:id="@+id/child_view_container"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/child_view"
Android:gravity="center_horizontal"
Android:layout_gravity="center_horizontal"
/>
</FrameLayout>
Animate - De droite à gauche et quitter la vue:
final childView = findViewById(R.id.child_view);
View containerView = findViewById(R.id.child_view_container);
childView.animate()
.translationXBy(-containerView.getWidth())
.setDuration(TRANSLATION_DURATION)
.setInterpolator(new AccelerateDecelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
childView.setVisibility(View.GONE);
}
});
Animate - Right to left enter view:
final View childView = findViewById(R.id.child_view);
View containerView = findViewById(R.id.child_view_container);
childView.setTranslationX(containerView.getWidth());
childView.animate()
.translationXBy(-containerView.getWidth())
.setDuration(TRANSLATION_DURATION)
.setInterpolator(new AccelerateDecelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
childView.setVisibility(View.VISIBLE);
}
});
Si votre niveau d'API est supérieur ou égal à 19, vous pouvez utiliser translation
comme ci-dessus. Si votre niveau d'API est inférieur à 19, vous pouvez consulter un didacticiel similaire: http://trickyandroid.com/fragments-translate-animation/
Pour la diapositive droite à gauche
res/anim/in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:fromXDelta="100%" Android:toXDelta="0%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700" />
</set>
res/anim/out.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:fromXDelta="0%" Android:toXDelta="-100%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700" />
</set>
dans le fichier Activity Java:
Intent intent = new Intent(HomeActivity.this, ActivityCapture.class);
startActivity(intent);
overridePendingTransition(R.anim.in,R.anim.out);
vous pouvez modifier la durée dans les fichiers xml pour une animation de diapositive plus longue ou plus courte.