Анимация ObjectAnimator LinearLayout width
Хорошо, поэтому я проверил
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
Затем я попытался расширить 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 тоже... без везения .cc.
Кто-нибудь преуспел в этом? Я использовал старый android.view.animation, и я получил то, что хотел, но мне интересно в будущем.
Ответы
Ответ 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();
Ответ 2
За что это стоит того. После того, как вы измените ширину параметров макета, вы должны reset объект params layout.
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();
Ответ 3
Вы допустили ошибку
params.weight = myWidth;
Я думаю, что это params.width не params.weight
Ответ 4
Я создал небольшую библиотеку ViewPropertyObjectAnimator
, которая может сделать это очень простым способом (и использует подобный подход к этому предложенный Tomer Weller).
Вы можете достичь этой анимации (при условии, что mLinearLayout
- это анимированные View
и mEndWidth
- конечное значение ширины View's
):
ViewPropertyObjectAnimator.animate(mLinearLayout).width(mEndWidth).start();
Ответ 5
Я думаю, что лучший способ добиться этого - использовать свойство View scaleX и scaleY, которые определены в классе View полностью, поэтому он будет действителен практически при любом представлении или макете.
Например, рассмотрим этот
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(MyLinearLayout,"ScaleX",0,1);
objectAnimator.setDuration(300);
objectAnimator.start();
Он работает.