22 votes

Comment réduire une activité de finition à un rectangle ?

Dans mon application Android, j'ai un Activity . Il est lancé depuis l'extérieur de mon application en utilisant ActivityOptions.makeScaleUpAnimation pour augmenter l'échelle à partir d'un rectangle "d'origine". Lorsque mon Activity Enfin, j'aimerais que l'animation soit inversée, c'est-à-dire qu'elle se rétrécisse à ce rectangle lorsqu'elle s'estompe.

Je sais que je peux obtenir le rectangle avec getIntent().getSourceBounds() et j'espérais pouvoir utiliser la fonction overridePendingTransition() lors de la finition pour obtenir cet effet, mais overridePendingTransition() ne peut accepter qu'une ressource XML fixe : il ne semble pas y avoir de moyen de faire dépendre cette animation des limites de la source. Y a-t-il quelque chose d'autre que je puisse utiliser pour obtenir cet effet ?

Mon application est pour API 11+, mais comme il s'agit d'un effet cosmétique seulement, je serais satisfait d'une solution qui dépend d'une version ultérieure.

8voto

AjayV Points 209

Je ne pense pas qu'il existe un moyen de réduire la fenêtre d'activité autre que l'appel à overridePendingTransition. Cependant, ce code peut aider :

Augmentation d'échelle

ActivityOptions opts = ActivityOptions.makeCustomAnimation(getActivity(), R.anim.scale_up, 0) ; startActivity(new Intent(this, SecondActivity.class),opts.toBundle()) ;

Voici le fichier d'animation à l'échelle :

<set  xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
    android:fromXScale="0"
    android:toXScale="1.0"
    android:fromYScale="0"
    android:toYScale="1.0"
    android:pivotX="50%p"
    android:pivotY="50%p"
    android:duration="500"/>
</set>

Réduire l'échelle

Appeler ce code à partir de l'activité en cours :

finish();

overridePendingTransition(0, R.anim.scale_down);

Voici le fichier d'animation à échelle réduite :

<set xmlns:android="http://schemas.android.com/apk/res/android">
   <scale
    android:fromXScale="1.0"
    android:toXScale="0"
    android:fromYScale="1.0"
    android:toYScale="0"
    android:pivotX="50%p"
    android:pivotY="50%p"
    android:duration="250"/>
</set>

Vous pouvez faire varier les échelles X et Y pour obtenir le rectangle souhaité. J'espère que cela vous aidera.

3voto

AjayV Points 209

Sur la base de mon dernier commentaire, voici la solution que j'ai essayée et qui fonctionne. Il se peut que vous deviez la modifier pour qu'elle corresponde à vos besoins.

Mettre en place une activité avec un arrière-plan transparent et sans titre dans le manifeste :

       <activity
        android:name="com.example.backgroundsensor.AnimatedActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:label="Animated activity" /> 

et laissez-le définir la vue de contenu avec une mise en page comme :

  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/container"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@android:color/transparent"
   tools:ignore="MergeRootFrame" >

    <View
         android:id="@+id/visibleAreaView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="center"
        android:background="@android:color/holo_green_dark" />

 </FrameLayout>

Le visibleAreaView est

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.animated_activity);

      // set the bounds of the animateView
  }

A

boolean animateFirst=true;
@Override
public void finish() {
     if(animateFirst)
     {
         animateFirst = false;
         loadAnim();

     }else
     {
         super.finish();
     }
}

 public void loadAnim() {

    View v = findViewById(R.id.animateView);
    float x= v.getX() + v.getRight()/2;
    float y = v.getY();
    anim = new ScaleAnimation(1.0f, 0.0f,1.0f, 0.0f, x, y);
    anim.setDuration(300);
    anim.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            findViewById(R.id.animateView).setVisibility(View.GONE);
            AnimatedActivity.this.finish();
        }
    });
    v.startAnimation(anim);

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X