ObjectAnimator为LinearLayout宽度设置动画

时间:2011-10-26 13:03:38

标签: android

好的,所以我检查了一下 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

然后我尝试使用“myWidth”扩展LinearLayout

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,我得到了我想要的东西,但我对未来感到好奇。

5 个答案:

答案 0 :(得分:120)

在没有简单属性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(); 

答案 1 :(得分:20)

这是值得的。更改布局参数上的宽度后,必须重置布局参数对象。

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();

答案 2 :(得分:7)

我创建了一个小型库ViewPropertyObjectAnimator,可以用一种非常简单的方式完成这项工作(并使用Tomer Weller提出的类似方法)。

您可以使用(假设mLinearLayout是动画View并且mEndWidthView's宽度的结束值)来实现此动画:

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

答案 3 :(得分:6)

你犯了一个错误

 params.weight = myWidth;

我认为 params.width 不是 params.weight

答案 4 :(得分:0)

我认为更好的方法是使用View的scaleX和scaleY属性,这些属性在View类中一直定义,因此它几乎适用于任何视图或布局。

例如,请考虑这个

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

有效。