Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ObjectAnimator animate LinearLayout width

Tags:

android

Ok, so i checked out http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html

He says you can animate the property of an object in a given time. And i tried moving around objects and it looks fine. I encountered a problem when i went changing the width of a LinearLayout. I got this:

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

Then i tried extending LinearLayout, with "myWidth"

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

No luck. Then i tried changing LayoutParams.width, turns out width and height are the only public properties in java history, and ObjectAnimator needs getter and setter. No luck. I'm embarassed to say i tried extending LayoutParams too... with no luck ofc.

Anybody succeded doing such a thing? I used old android.view.animation and i got what i wanted, but i'm curious for the future.

like image 767
eyahn Avatar asked Oct 26 '11 13:10

eyahn


2 Answers

In situations where there isn't a simple property getter/setter you should use ValueAnimator and perform the animation manually.

Assuming:

  • v is the view you're animating
  • END_WIDTH is the target width of the view in pixels.
  • DURATION is the desired length of the animation in milliseconds.

Your code should look something like this:

    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();  
like image 165
Tomer Weller Avatar answered Oct 08 '22 17:10

Tomer Weller


For what it's worth this works. After you change the width on the layout params you have to reset the layout params object.

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(); 
like image 34
user123321 Avatar answered Oct 08 '22 17:10

user123321