ObjectAnimatoranimationLinearLayout宽度
好的,所以我检查了http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html
他说你可以在给定的时间内animation物体的属性。 而我试着在物体周围移动,看起来很好。 当我改变一个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 …没有运气ofc。
任何人都做了这样的事情? 我用旧的android.view.animation,我得到了我想要的,但我对未来好奇。
在没有简单的属性getter / setter的情况下,您应该使用ValueAnimator并手动执行animation。
假设:
- v是你animation的视图
- END_WIDTH是视图的目标宽度(以像素为单位)。
- DUARTION是animation的所需长度,以毫秒为单位。
你的代码应该是这样的:
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();
这是值得的作品。 在更改布局参数的宽度后,您必须重置布局参数对象。
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();
你犯了一个错误
params.weight = myWidth;
我认为这是params.width不params.weight
我已经创build了一个小型库ViewPropertyObjectAnimator
,可以用一个非常简单的方法来做到这一点(并使用Tomer Weller提出的类似方法)。
你可以实现这个animation(假设mLinearLayout
是animationView
, mEndWidth
是View's
宽度的最终值):
ViewPropertyObjectAnimator.animate(mLinearLayout).width(mEndWidth).start();
我认为一个更好的方法是使用View的scaleX和scaleY属性,这些属性在View类中一直定义下来,所以对于任何视图或布局都是有效的。
例如,考虑这一点
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(MyLinearLayout,"ScaleX",0,1); objectAnimator.setDuration(300); objectAnimator.start();
有用。
- SecurityException:调用者uid XXXX与authentication者的uid不同
- GooglePlayServicesUtil与GoogleApiAvailability
- Android应用中的Google Analytics(分析) – 处理多个活动
- IntelliJ的IDEA – 不能build立任何东西,总是得到“包R不存在”
- 如何在Android中绘制时设置线的宽度?
- Android-错误:任务执行失败':app:transformClassesWithDexForRelease'
- Google Map Api v2在日志中显示“V / GoogleSignatureVerifier:签名无效”错误消息
- Unicode字符不显示在TextView.setText中
- 如何使微调器宽度与最大可用项目宽度相同