概述:Animation Resource 动画资源, 可以定义两种动画类型。 一种是: Property Animation (属性动画), 这是通过改变一个对象的属性值,产生的动画效果。
另一种是: View Animation (视图动画) , 这类动画里面又包含了两种动画效果。
1. Tween Animation:通过改变一张图片的 样式,产生的动画效果。
2. Frame Animation:通过多张图片的有序显示达到的动画效果。(就像电影一样, 一帧一帧的播放效果)。
Property Animation (属性动画):
定义在xml中的动画, 通过修改目标对象的属性值, 比如 background color or alpha。
文件位置: res/animator/filename.xml
资源指向: ValueAnimator
, ObjectAnimator
, or AnimatorSet
.
引用方式: 1. 在java中:R.animator.filename.xml。 2. 在xml中:@[package:]animator/filename.xml
<set android:ordering=["together" | "sequentially"]> <objectAnimator android:propertyName="string" android:duration="int" android:valueFrom="float | int | color" android:valueTo="float | int | color" android:startOffset="int" android:repeatCount="int" android:repeatMode=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <animator android:duration="int" android:valueFrom="float | int | color" android:valueTo="float | int | color" android:startOffset="int" android:repeatCount="int" android:repeatMode=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <set> ... </set> </set>
文件必须有一个根节点, <set>, <objectAnimation>, <valueAnimator>。 <set>下面可以包含<set>。
下面是每个节点和属性的解释:
<set>:
其他动画属性的容器, <set>, <objectAnimation>, <valueAnimator>, 代表了AnimatorSet类。
android:ordering
关键字,有两个选项:1. sequentially, 表示按照集合队列播放动画。 2. together,表示所有效果一起进行。
<objectAnimator>:
android:propertyName
String类型, Required (必须要有这个属性)。 在代码中需要通过这个属性引用。比如你可以为一个TextView或者ImageView设置一个backgroudColor属性,和alpha属性在xml文件中。但是属性动画是不能在xml中设置的,只能在java代码中引用,先inflate这个动画xml资源文件, 然后调用loadAnimator()和setTarget()方法为一个对象设置属性动画。
android:valueTo
float, int, or color。Required。
android:valueFrom
float, int, or color.
android:duration
持续的毫秒数。
android:startOffset
start()方法调用之后, 等待的毫秒数。举例: 这个值写1000, 表示start()方法调用后, 1秒后再执行这个节点下的属性变化。
android:repeatCount
动画重复的次数。
android:repeatMode
动画重复的模式。
android:valueType
关键字。有两个选项。 1. intType。 2. floatType。
<animator>
这个节点下面的属性, 基本和上面的无差别。
实例:
xml文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@mipmap/ic_launcher" /> </LinearLayout>
属性动画文件: 这个文件要建在 res/animator 文件下, 如果你的res下没有这个文件夹,你要新建一个名为animator的文件夹。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially"> <set> <objectAnimator android:duration="5000" android:propertyName="x" android:valueTo="400" android:valueType="intType" /> <objectAnimator android:duration="5000" android:propertyName="y" android:valueTo="300" android:valueType="intType" /> </set> <objectAnimator android:duration="5000" android:propertyName="alpha" android:valueTo="0f" /> </set>
java代码中使用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_property); ImageView image = (ImageView) findViewById(R.id.imageView); AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.simple_animator); set.setTarget(image); set.start(); }
效果图:
View Animation (视图动画) :
1. Tween Animation:
文件位置: res/anim/filename.xml
文件指向: Animation类。
引用方式: 1. 在java中, R.anim.filename。 2. 在xml中, @[package:]anim/filename
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource" android:shareInterpolator=["true" | "false"] > <alpha android:fromAlpha="float" android:toAlpha="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" /> <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" /> <set> ... </set> </set>
<set>
根节点, 子节点包含<alpha>, <scale>, <translate>, <rotate>, <set>。代表了AnimationSet类。
android:interpolator
interpolator 资源。
android:shareInterpolator
boolean类型。
<alpha>
淡入和淡出资源, 代表AlphaAnimation类。
android:fromAlpha
float类型, 取值从0.0到1.0, 0.0表示完全透明, 1.0表示完全不透明。
android:toAlpha
float类型, 取值从0.0到1.0, 0.0表示完全透明, 1.0表示完全不透明。
<scale>
表示缩放, 代表ScaleAnimation。
android:fromXScale
float类型,表示x轴上的改变。 1.0表示没变化。
android:toXScale
float类型,表示x轴上的改变。 1.0表示没变化。
android:fromYScale
float类型,表示y轴上的改变。 1.0表示没变化。
android:toYScale
float类型,表示x轴上的改变。 1.0表示没变化。
android:pivotX
中心轴的x点
android:pivotY
中心轴的y点。
<translate>
水平方向或者垂直方向上的移动。
android:fromXDelta
float类型或者百分比。比如 5, 5%, 5p%
android:toXDelta
float类型或者百分比。比如 5, 5%, 5p%
android:fromYDelta
float类型或者百分比。比如 5, 5%, 5p%
android:toYDelta
float类型或者百分比。比如 5, 5%, 5p%
<rotate>
旋转, 代表RotateAnimation
android:fromDegrees
float类型, 起始角度。
android:toDegrees
float类型, 结束角度。
android:pivotX
float类型或者百分比, 中心轴的x
android:pivotY
float类型或者百分比, 中心轴的y
实例:
主布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <ImageView android:id="@+id/imageView" android:layout_width="200dp" android:layout_height="200dp" android:src="@mipmap/ic_launcher" /> </LinearLayout>
动画资源文件: 这个文件是放在 res/anim文件夹下面
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:repeatMode="restart" android:shareInterpolator="false"> <scale android:duration="5000" android:fillAfter="false" android:fromXScale="1.0" android:fromYScale="1.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.4" android:toYScale="0.6" /> <set android:interpolator="@android:anim/accelerate_interpolator" android:startOffset="5000"> <scale android:duration="2000" android:fromXScale="1.4" android:fromYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:toXScale="0.0" android:toYScale="0.0" /> <rotate android:duration="2000" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="-45" android:toYScale="0.0" /> </set> </set>
java代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tween_animation); ImageView imageView = (ImageView) findViewById(R.id.imageView); Animation animation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); if (imageView != null) { imageView.setAnimation(animation); } else { throw new AssertionError(); } }
效果图:
Frame Animation(帧动画):
文件位置:res/drawable/filename.xml
资源指向:AnimationDrawable类。
引用方式:1. 在java中, R.drawable.filename。 2. 在xml中, @[package:]drawable.filename 这里在xml中引用后面不是 "/" 而是 "." 。
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot=["true" | "false"] > <item android:drawable="@[package:]drawable/drawable_resource_name" android:duration="integer" /> </animation-list>
<animation-list>
根节点。必须的。
android:oneshot
boolean类型, 是否只播放一次。
<item>
必须是<animation-list>的子节点
android:drawable
drawable资源。
android:duration
持续的毫秒数。
实例:
主布局xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
帧动画资源文件:
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@mipmap/images1" android:duration="1000" /> <item android:drawable="@mipmap/images2" android:duration="1000" /> <item android:drawable="@mipmap/images3" android:duration="1000" /> <item android:drawable="@mipmap/images4" android:duration="1000" /> <item android:drawable="@mipmap/images5" android:duration="1000" /> </animation-list>
java代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_frame); ImageView image = (ImageView) findViewById(R.id.imageView); assert image != null; image.setBackgroundResource(R.drawable.grils); AnimationDrawable animation = (AnimationDrawable) image.getBackground(); animation.start(); }
效果图:
好了, 今天的动画基本就这些了。