属性动画系统允许动画 View 对象并提供很多比 view 动画系统更高级的功能。 view动画系统通过改变绘制方式来变换 View 对象, view 动画 是被 view 的 容器所处理的,因为 View 本身没有要操控的属性。结果就是 View 被动画了,但 View 对象本身并没有变化。在 Android3.0 中,新的属性和相应的 getter 和 setter 方法被加入以克服此缺点。 属性动画系统可以通过改变 View 对象的真实属性来动画 Views 。而且, View 也会在其属性改变时自动调用 invalidate() 方法来刷新屏幕。 View 类中的能促进属性动画能力的的新属性有:
要动画一个 View 对象的属性,比如它的颜色或旋转值,你所有需要做的就是创建一个属性 animator 然后指定你想动画的 View 属性。例如: ObjectAnimator.ofFloat(myView,"rotation", 0f, 360f); 用 ViewPropertyAnimator 进行动画ViewPropertyAnimator 提供了一个同时动画某个 View 中的多个属性的简便方法,只需使用一个 Animator 对象。它的行为很像 ObjectAnimator ,因为它修改了真正的 view 属性,但是它对于同时动画多个属性更在行。另外,使用ViewPropertyAnimator 的代码更加简洁易懂。下面的代码片段演示了当同时动画一个 View 的 x 和 y 属性时使用多个 ObjectAnimator 对象、单个 ObjectAnimator 、和 ViewPropertyAnimator 的不同。 多个 ObjectAnimator 对象 ObjectAnimatoranimX = ObjectAnimator.ofFloat(myView, "x", 50f); ObjectAnimatoranimY = ObjectAnimator.ofFloat(myView, "y", 100f); AnimatorSetanimSetXY = new AnimatorSet(); animSetXY.playTogether(animX,animY); animSetXY.start(); 一个 ObjectAnimator PropertyValuesHolderpvhX = PropertyValuesHolder.ofFloat("x", 50f); PropertyValuesHolderpvhY = PropertyValuesHolder.ofFloat("y", 100f); ObjectAnimator.ofPropertyValuesHolder(myView,pvhX, pvyY).start(); ViewPropertyAnimator myView.animate().x(50f).y(100f); 在 XML 中声明动画属性动画系统使你能够使用 XML 声明属性动画而不用写代码。通过在 XML 中定义动画,你可以轻易的在多个 activit y 中重用你的动画,并且可以更容易的修改动画顺序。 为了区分使用了新的属性动画 API 和使用了旧的 view 动画框架的文件,从Android3.1 开始,你应该将属性动画 XML 文件保存到 res/animator/ 文件夹下 ( 而不是 res/anim/ ) 。使用 animator 时,其文件夹的名字是可选的,但是当你要使用EclipseADT plugin (ADT 11.0.0+) 中的 layout 编辑工具时就是必须的了,因为 ADT 只去 res/animator/ 文件夹下搜寻属性动画资源。 下面的属性动画类具有支持 XML 中声明的能力:
下面的例子顺序的播放两个 objectanimation 动画 的 集合,第一个也是一个 set ,这个子 set 同时 播放两个 object animation : <setandroid:ordering="sequentially"> <set> <objectAnimator android:propertyName="x" android:duration="500" android:valueTo="400" android:valueType="intType"/> <objectAnimator android:propertyName="y" android:duration="500" android:valueTo="300" android:valueType="intType"/> </set> <objectAnimator android:propertyName="alpha" android:duration="500" android:valueTo="1f"/> </set> 要播放此动画,你必须在你的代码中 inflateXML 资源成一个 AnimatorSet 对象,然后设置所有动画的目标对象,再开始动画。调用 setTarget() 为所有的子集AnimatorSet 设置单个对象很简单。下面的代码演示了如何做: AnimatorSetset = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.anim.property_animator); set.setTarget(myObject); set.start(); property_animator 是 XML 文件的名字。 (责任编辑:好模板) |