属性动画和视图动画不同之处在于, 属性动画后的view新位置是可以响应点击事件等, 属性动画移动的带有View的属性,而视图动画移动的只是视图而已, 交互事件依然在原位置才能响应。
1、ObjectAnimator:
创建一个ObjectAnimator需要通过静态工厂方法:传入的参数代表所要应用动画的view, 应用动画的哪个属性, 以及最后的可变参数代表相应属性的应用动画后的值(或范围);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "width", 300);
animator.setDuration(1000);
animator.start();
这里需要一个包装类来get、set这些属性的值:
class WrapperView{
private View mTarget;
public WrapperView(View view){
mTarget = view;
}
public void setWidth(int width){
mTarget.getLayoutParams.width = width;
mTarget.requestLayout();
}
public int getWidth() {
return mTarget.getLayoutParams.width;
}
}
改写:
WrapperView wrapper = new WrapperView(view);
ObjectAnimator.ofInt(wrapper, "width", 300).setDuration(1000).start();
注意:
ofInt(), ofFloat(), 代表最后一个可变参数的值的类型;
除了自定义的width,height属性,ObjectAnimator还有可以直接使用的属性:
1、translateX和translateY(增量);
2、rotate(2D)和rotateX,rotateY(3D)
3、 scaleX和scaleY (缩放)
4、pivotX和pivotY(缩放或旋转的转轴)
5、x和y(相对于左上方的坐标+translateX和translateY,代表最终坐标)
6、alpha(范围在0~1,0为完全透明)
另外,如果要使用多个属性的动画效果,类似于AnimationSet, 通过PropertyValuesHolder可以把多个属性的动画效果放在一起:
PropertyValuesHolder pvh1 = new PropertyValuesHolder("translateX", 100);
PropertyValuesHolder pvh2 = new PropertyVaulesHolder("alpha", 0.5f);
PropertyVaulesHolder pvh3 = new PropertyValuesHolder("y", 200);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(view, pvh1,pvh2, pvh3);
objectAnimator.setDuration(1000);
objectAnimator.start();
这样子就能做到多个属性一起动画啦