50 votes

Comment étendre une hauteur de mise en page avec animation ?

Je ne pouvais pas trouver un bon exemple pour savoir comment faire cela.

J'ai un RelativeLayout défini avec une hauteur x.

Je veux ajouter un bouton qui étend la hauteur à la hauteur x+y.

quelqu'un peut-il me référer à un bon exemple sur la façon de le faire par programme ?

73voto

the_prole Points 71

Vous avez marqué la solution qui était la plus proche. C'est la solution exacte. J'ai eu le même problème. Espérons que cette réponse aidera d'autres.

Instanciation ResizeAnimation

 ResizeAnimation resizeAnimation = new ResizeAnimation(
     view, 
     targetHeight, 
     startHeight
); 
resizeAnimation.setDuration(duration); 
view.startAnimation(resizeAnimation);

ResizeAnimation devrait ressembler à ceci

 public class ResizeAnimation extends Animation {
    final int targetHeight;
    View view;
    int startHeight;

    public ResizeAnimation(View view, int targetHeight, int startHeight) {
        this.view = view;
        this.targetHeight = targetHeight;
        this.startHeight = startHeight;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        int newHeight = (int) (startHeight + targetHeight * interpolatedTime);
        //to support decent animation, change new heigt as Nico S. recommended in comments
        //int newHeight = (int) (startHeight+(targetHeight - startHeight) * interpolatedTime);
        view.getLayoutParams().height = newHeight;
        view.requestLayout();
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
}

17voto

Lukap Points 7412

Vous avez besoin d'une animation à l'échelle voici la documentation officielle

c'est dans le code

 private void animate() {
    ImageView imageView = (ImageView) findViewById(R.id.ImageView01);
    ScaleAnimation scale = new ScaleAnimation((float)1.0, (float)1.5, (float)1.0, (float)1.5);
    scale.setFillAfter(true);
    scale.setDuration(500);
    imageView.startAnimation(scale); 
}

16voto

Maneesh Points 3325

Veuillez vérifier ci-dessous la nouvelle réponse modifiée comme ci-dessous. Mais ici, vous devez connaître la nouvelle hauteur exacte.

 public class LayoutAnimationActivity extends Activity {
    RelativeLayout ril1;
    Button btn;
    int initialHeight;
    int actualHeight;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        ril1 = (RelativeLayout) findViewById(R.id.relativeLayout1);
        btn = new Button(this);
        btn.setWidth(100);
        btn.setHeight(200);
        btn.setText("Button");
        actualHeight = 210;
        Ani a = new Ani();
        a.setDuration(2000);
        ril1.startAnimation(a);
    }

    class Ani extends Animation {
        public Ani() {}

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            int newHeight;

            newHeight = (int) (initialHeight * interpolatedTime);

            ril1.removeAllViews();
            btn.setWidth(100);
            btn.setHeight(300);
            btn.setText("as");
            ril1.addView(btn);             
            ril1.getLayoutParams().height = newHeight;
            ril1.requestLayout();
        }

        @Override
        public void initialize(int width, int height, int parentWidth, int parentHeight) {
            super.initialize(width, height, parentWidth, parentHeight);
            initialHeight = actualHeight;
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };
}

6voto

GLee Points 981

Deux façons simples de le faire sans classe Animation

1) Définissez android:animateLayoutChanges="true" dans votre fichier de mise en page xml

2) Utiliser un animateur ViewProperty

 layout.setPivot(0);
layout.animate().scaleY(scaleFactor).setDuration(500);

Le pivot indique à la vue d'où partir, la valeur par défaut est au milieu, ce qui, d'après mon expérience, n'est presque jamais ce que vous voulez. La durée est facultative (par défaut = 1000).

2voto

adsl99801 Points 21
final Button button1 = (Button) view.findViewById(R.id.button);
    final CollapseAnimator animator = new CollapseAnimator(topLayout);

    final ViewTreeObserver.OnGlobalLayoutListener listener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int mHeight = button1.getMeasuredHeight();
            KLog.i("onGlobalLayout() mHeight:" + mHeight);
            animator.setValues(mHeight*2, mHeight);

        }
    };
    button1.getViewTreeObserver().addOnGlobalLayoutListener(listener);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view.post(new Runnable() {
                @Override
                public void run() {
                    button1.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
                    animator.collapse();

                }
            });

        }
    });

et classe

 public class CollapseAnimator {
    private View view;
    private boolean collapse=true;
    private int duation=300;
    private int destHeight=300;
    private ValueAnimator animator;
    private int originHeight=0;
    private int from=0;
    private int to=0;


    public CollapseAnimator(View view ) {
        this.view = view;
    }

    public void setValues(int destHeight,int originHeight){
        this.destHeight = destHeight;
        this.originHeight=originHeight;
        from=originHeight;
        to=originHeight;
    }
    public void collapse(){


        from=to;
        if(collapse){

            to=destHeight;
            collapse=false;
        }else{
            to=originHeight;
            collapse=true;
        }
        KLog.i("from:" + from+",to:"+to);
        animator = ValueAnimator.ofInt(from, to);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int val = (Integer) valueAnimator.getAnimatedValue();
                ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
                layoutParams.height = val;
                view.setLayoutParams(layoutParams);
            }
        });
        animator.setDuration(duation);
        animator.start();
    }
}

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