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.
In situations where there isn't a simple property getter/setter you should use ValueAnimator and perform the animation manually.
Assuming:
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();
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With