Подтвердить что ты не робот

Анимация ObjectAnimator LinearLayout width

Хорошо, поэтому я проверил 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 тоже... без везения .cc.

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

4b9b3361

Ответ 1

В ситуациях, когда нет простого свойства 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(); 

Ответ 2

За что это стоит того. После того, как вы измените ширину параметров макета, вы должны reset объект params layout.

private class WidthEvaluator extends IntEvaluator {

    private View v;
    public WidthEvaluator(View v) {
        this.v = v;
    }

    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        int num = (Integer)super.evaluate(fraction, startValue, endValue);
        ViewGroup.LayoutParams params = v.getLayoutParams();
        params.width = num;
        v.setLayoutParams(params);
        return num;
    }
}

// your client code
ValueAnimator.ofObject(new WidthEvaluator(box), box.getWidth(), v.getWidth()).start();

Ответ 3

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

 params.weight = myWidth;

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

Ответ 4

Я создал небольшую библиотеку ViewPropertyObjectAnimator, которая может сделать это очень простым способом (и использует подобный подход к этому предложенный Tomer Weller).

Вы можете достичь этой анимации (при условии, что mLinearLayout - это анимированные View и mEndWidth - конечное значение ширины View's):

ViewPropertyObjectAnimator.animate(mLinearLayout).width(mEndWidth).start();

Ответ 5

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

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

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

Он работает.