android animate height - Анимация ObjectAnimator LinearLayout width




3 Answers

В ситуациях, когда нет простого свойства getter / setter, вы должны использовать ValueAnimator и выполнять анимацию вручную.

Предполагая, что:

  • v - вид, который вы анимации
  • END_WIDTH - целевая ширина представления в пикселях.
  • DURATION - желаемая длина анимации в миллисекундах.

Ваш код должен выглядеть примерно так:

    ValueAnimator anim = ValueAnimator.ofInt(v.getMeasuredWidth(), END_WIDTH);
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            int val = (Integer) valueAnimator.getAnimatedValue();
            ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
            layoutParams.width = val;
            v.setLayoutParams(layoutParams);
        }
    });
    anim.setDuration(DURATION);
    anim.start(); 
animation valueanimator

Хорошо, поэтому я проверил http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html

Он говорит, что вы можете анимировать свойство объекта за определенное время. И я попытался перемещаться по объектам, и все выглядит отлично. Я столкнулся с проблемой, когда я изменил ширину LinearLayout. Я получил это:

10-26 14:51:27.190: E/PropertyValuesHolder(12681): Couldn't find setter/getter for       property width with value type float

Затем я попытался расширить LinearLayout, с "myWidth"

public void setMyWidth(int myWidth) {
    LinearLayout.LayoutParams params = (LayoutParams) getLayoutParams();
    params.weight = myWidth;
    setLayoutParams(params);
    requestLayout();
    this.myWidth = myWidth;
}

Неудачно. Затем я попытался изменить LayoutParams.width, получается, что ширина и высота являются единственными общедоступными свойствами в истории java, а ObjectAnimator нужен getter и setter. Неудачно. Я смущен, чтобы сказать, что я пытался расширить LayoutParams тоже ... без везения.

Кто-нибудь преуспел в этом? Я использовал старый android.view.animation, и я получил то, что хотел, но мне интересно в будущем.




Вы допустили ошибку

 params.weight = myWidth;

Я думаю, что это params.width не params.weight




Я думаю, что лучшим способом добиться этого было бы использовать свойство View's scaleX и scaleY, которые определены полностью в классе View, поэтому он будет действителен практически при любом представлении или макете.

Например, рассмотрим это

ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(MyLinearLayout,"ScaleX",0,1);
objectAnimator.setDuration(300);
objectAnimator.start();

Оно работает.




Related


Tags

android