84 votes

Comment puis-je animer View.setVisibility(GONE)

Je veux faire un Animation d'un View il obtient visibilité de l'ensemble de GONE. Au lieu de simplement dissapearing, l' View devrait effondrement. J'ai essayé cela avec un ScaleAnimation mais alors l' View est l'effondrement, mais la mise en page seulement redimensionner l'espace après (ou avant) l' Animation s'arrête (ou commence).

Comment puis-je faire de l' Animation , de sorte que, tandis que l'animation, le plus faible Views va rester directement ci-dessous le contenu, au lieu d'avoir un espace vide?

98voto

Vinay Wadhwa Points 3309

Mettre la vue dans une mise en page, si ce n’est pas et la valeur `` pour cette mise en page.

51voto

Andy Points 3031

Il ne semble pas être un moyen facile de le faire par le biais de l'API, parce que l'animation change juste le rendu de la matrice de la vue, et non pas la taille réelle. Mais nous pouvons définir une marge négative de tromper LinearLayout en pensant que la vue est de plus en plus petits.

Donc, je vous recommande de créer votre propre Animation de classe, basée sur ScaleAnimation, et en remplaçant la "applyTransformation" méthode pour définir de nouvelles marges et mise à jour de la mise en page. C'est comme ça...

public class Q2634073 extends Activity implements OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.q2634073);
        findViewById(R.id.item1).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        view.startAnimation(new MyScaler(1.0f, 1.0f, 1.0f, 0.0f, 500, view, true));
    }

    public class MyScaler extends ScaleAnimation {

        private View mView;

        private LayoutParams mLayoutParams;

        private int mMarginBottomFromY, mMarginBottomToY;

        private boolean mVanishAfter = false;

        public MyScaler(float fromX, float toX, float fromY, float toY, int duration, View view,
                boolean vanishAfter) {
            super(fromX, toX, fromY, toY);
            setDuration(duration);
            mView = view;
            mVanishAfter = vanishAfter;
            mLayoutParams = (LayoutParams) view.getLayoutParams();
            int height = mView.getHeight();
            mMarginBottomFromY = (int) (height * fromY) + mLayoutParams.bottomMargin - height;
            mMarginBottomToY = (int) (0 - ((height * toY) + mLayoutParams.bottomMargin)) - height;
        }

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            if (interpolatedTime < 1.0f) {
                int newMarginBottom = mMarginBottomFromY
                        + (int) ((mMarginBottomToY - mMarginBottomFromY) * interpolatedTime);
                mLayoutParams.setMargins(mLayoutParams.leftMargin, mLayoutParams.topMargin,
                    mLayoutParams.rightMargin, newMarginBottom);
                mView.getParent().requestLayout();
            } else if (mVanishAfter) {
                mView.setVisibility(View.GONE);
            }
        }

    }

}

L'habituelle mise en garde s'applique: parce que nous sommes remplacement d'une méthode protégée (applyTransformation), ce n'est pas garanti dans les futures versions d'Android.

7voto

Udinic Points 1945

J’ai utilisé la même technique que Andy ici a présenté. J’ai écrit ma propre classe d’Animation pour cela, qui animent la valeur de la marge, provoquant l’effet de l’élément disparaissent/apparaisse. Il ressemble à ceci :

J’ai un exemple complet qui fonctionne sur mon blog post http://udinic.wordpress.com/2011/09/03/expanding-listview-items/

2voto

Learn OpenGL ES Points 932

J’ai utilisé la même technique comme Andy ici et il affiné afin qu’il peut être utilisé pour étendre et de s’effondrer sans pépins, également en utilisant une technique décrite ici : http://stackoverflow.com/a/11426510/1317564

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