web-dev-qa-db-fra.com

Comment développer une hauteur de mise en page avec une animation?

Je n'ai pas pu trouver un bon exemple sur la façon de procéder.

J'ai un ensemble RelativeLayout avec une hauteur x.

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

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

43
piojo

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;
        }
    };
}
16
Maneesh

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

Instancier ResizeAnimation

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

ResizeAnimation classe 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;
    }
}
65
the_prole

Vous avez besoin d'une animation à l'échelle ici est 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); 
}
18
Lukap

Deux façons simples de le faire sans classe Animation:

1 jeu Android:animateLayoutChanges="true" dans votre fichier de mise en page xml

2) Utilisez un animateur ViewProperty

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

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

4
GLee
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();
    }
}
2
adsl99801