今天项目遇到了动画属性方面的问题,看了一下代码,发现动画的属性怎么不是我们平时用的''alpha"、"translationX"的属性,好吧,原来是可以自己定义动画属性名的。
下面是以我项目中的问题做例子:
- 自定义一个view
public class ScaleView extends View {
public ScaleView(Context context) {
this(context, null);
}
public ScaleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
}
- 给自定义的动画属性定义一个属性名,如我们平常使用的"translationX"、"translationY"、"alpha"等,在这里,我以'"myScale"为动画属性的名字,用这个这个属性来同时实现view的"scaleX"、"scaleY"的属性变化。
当然,自己可以组合,实现各种想要的动画,然后只要通过这个属性名,
就可以实现所要的动画,不用一个一个加到动画集合中了。
- 在自定义的view中,实现属性的settter和getter方法,这个是很重要的,没有实现的话,在开始动画的时候,就会因为取不到属性值而崩溃。
异常可能如下:
E/PropertyValuesHolder: Couldn't find no-arg method for property myScale: java.lang.NoSuchMethodException: getMyScale[]
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at android.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:513)
at android.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:392)
at android.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:544)
at android.animation.ValueAnimator.start(ValueAnimator.java:934)
at android.animation.ValueAnimator.start(ValueAnimator.java:957)
at android.animation.ObjectAnimator.start(ObjectAnimator.java:370)
在这里,我定义的方法为:
private float mScaleFraction;//保存fraction的值,在动画开始后,自动调用这两个方法
public void setMyScale(float fraction) {
mScaleFraction = fraction;
setScaleX(1f + fraction * 0.5f);//x、y都是放大0.5倍
setScaleY(1f + fraction * 0.5f);
}
public float getMyScale() {
return mScaleFraction;
}
注意 : 上面这两个方法是动画执行时自动调用,
fraction
的范围就是我们在定义动画时传入的,如ObjectAnimatior.ofFloat(targetObject, "myScale", 0f, 1f)
,其中0f、1f就是fraction变化的范围。
4 使用的话,跟我们平常使用动画是一样的。
ScaleView mScaleView;
ObjectAnimator animator = ObjectAnimator.ofFloat(mScaleView, "myScale", 0.0f, 1.0f);
animator.setDuration(3000);
animator.setRepeatCount(2);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.start();
注意:传入的属性名的命名,以我这里为例:"myScale", 那么在getter和setter中,就要以setMyScale(float)和getMyScale()为方法名了。
网友评论