【问题标题】:ObjectAnimator animate LinearLayout widthObjectAnimator 为 LinearLayout 宽度设置动画
【发布时间】:2011-10-26 13:03:37
【问题描述】:

好的,所以我检查了 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,我得到了我想要的,但我对未来很好奇。

【问题讨论】:

  • 不幸的是,我有一个类似的问题。我没有为宽度设置动画,而是尝试为 weightSum (确实有一个 getter/setter)设置动画以达到相同的效果。也许您可以尝试类似的方法来实现您想要的,但我无法让它发挥作用:stackoverflow.com/questions/8341745/…。如果我有一些结果,我会及时通知你

标签: android


【解决方案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(); 

【讨论】:

  • END_WIDTH ?好吧,我已经膨胀了这个视图,在我的 xml 布局中它有 match_content(约束布局为 0dp),那么为什么我必须以编程方式设置它呢?动画应该从 0px 到布局中设置的大小
【解决方案2】:

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

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

【讨论】:

  • 要使这与 NineOldAndroids 一起工作,请将评估方法签名更改为使用整数而不是对象。 public Integer evaluate(float fraction, Integer startValue, Integer endValue)
  • 不要使用评估器来执行视图更改。改为添加AnimatorUpdateListener
  • @BraisGabin 那么正确的电话是什么?
  • 添加一个监听器并在那里做
【解决方案3】:

我创建了一个小型库 ViewPropertyObjectAnimator,它可以以非常简单的方式做到这一点(并使用与 Tomer Weller 提出的类似方法)。

您可以使用以下方法实现此动画(假设mLinearLayout 是动画View 并且mEndWidthView's 宽度的最终值):

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

【讨论】:

    【解决方案4】:

    你错了

     params.weight = myWidth;
    

    我认为是 params.width 而不是 params.weight

    【讨论】:

      【解决方案5】:

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

      例如,考虑这个

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

      有效。

      【讨论】:

      • 不,它不起作用。这会缩放(即拉伸)视图,这与仅放大视图不同,保持视图内容的比例不变。
      • 它只是从中心延伸视图,但我需要从左侧
      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      相关资源
      最近更新 更多