尊重每个人的付出,转载请点这里:http://blog.csdn.net/hanj456/article/details/52625351
Android中动画基本分为三种形式:
- 帧动画(Frame Animation)
- 补间动画(Tween Animation)
- 属性动画(Property Animation)
下面进入“三问三答”环节:
问:帧动画,补间动画和属性动画 怎么理解?
答:最简单的方式是从字面上去理解:我们知道动画剪辑是根据“帧”来算的,每一帧就是一张图片,老式的胶片电影就是“帧动画”,通过连续的滚动胶片使人产生错觉,以为是动画,其实就是很多图片连续运动达到的这种效果,Android中的帧动画也是这个原理,要想使用帧动画得准备好相应的图片资源;再来看补间动画,字面上的意思就是填补空缺的动画,其实它就是这么做的,指定一张图片起始状态和最后状态的样子,计算并显示中间需要的样子,这就是补间动画,但要注意的是补间动画仅仅是视觉上的改变,并没有实质的改变属性,举个栗子就是控制一个button从屏幕左边移动到右边,此时点击按钮时没有事件反馈的,因为它其实还在左边,只是视觉上在右边而已,点击左边按钮原来的位置处就能接收到点击事件,这么讲你应该就明白了吧;最后一种动画便是Android 3.0推出的属性动画,字面上就知道和属性相关,这种动画是通过改变图片的属性来达到动画的效果,也就是补间动画的那个栗子上如果使用的是属性动画结果就是button移动到右边就会获得点击事件;
问:帧动画,补间动画和属性动画的区别是什么?
答:明白了这三种动画的含义理解它们的区别就不难了:首先划分一下,帧动画是一类,剩下两者是一类,为什么这么划分呢?我是根据图片的数量来划分的,帧动画需要一套连续的图片才能完成动画效果,后两者一张图片足以,这里主要讨论的是后两者之间的区别。补间动画它只能达到四种效果或这四种效果的随机组合,这四种效果分别是:旋转 , 缩放 , 平移 ,透明度改变 ,超出这四种效果的动画是无法达到的,而属性动画则不受此限制,什么效果基本都可以达到,比如3D旋转,扭曲变化等,最本质的区别还是属性改变的这点上;
问:帧动画,补间动画和属性动画这三种动画怎么使用?
答:下面我用几个Demo分别演示如何实现Android这三种动画,先看效果图:
帧动画
实现步骤:
Step1
准备图片资源
Step2
新建 animation-list xml文件,将图片按顺序排列
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/girl_1"
android:duration="200"/>
<item
android:drawable="@drawable/girl_2"
android:duration="200"/>
<item
android:drawable="@drawable/girl_3"
android:duration="200"/>
<item
android:drawable="@drawable/girl_4"
android:duration="200"/>
<item
android:drawable="@drawable/girl_5"
android:duration="200"/>
<item
android:drawable="@drawable/girl_6"
android:duration="200"/>
<item
android:drawable="@drawable/girl_7"
android:duration="200"/>
<item
android:drawable="@drawable/girl_8"
android:duration="200"/>
<item
android:drawable="@drawable/girl_9"
android:duration="200"/>
<item
android:drawable="@drawable/girl_10"
android:duration="200"/>
<item
android:drawable="@drawable/girl_11"
android:duration="200"/>
</animation-list>
Step3
activity布局很简单,两个button和一个imageview,重点是imageview设置background为新建的animation-list文件,我就不贴出来了,在activity里面操作也很简单:调用AnimationDrawable的start()和stop()方法就能实现对帧动画的开始和停止,这里没有暂停的情况;
public class FrameActivity extends Activity {
private AnimationDrawable mAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame);
ImageView iv = (ImageView) findViewById(R.id.iv);
mAd = (AnimationDrawable) iv.getBackground();
}
public void start(View v){
mAd.start();
}
public void stop(View v){
mAd.stop();
}
}
下面是补间动画的效果图:
平移动画
旋转动画
缩放动画
透明度改变动画
组合动画
补间动画实现步骤:
Step1
在 res 文件夹下创建 anim 文件夹,新建五个动画xml文件,将动画定义在xml中的好处是比较直观,还可以复用;
<?xml version="1.0" encoding="utf-8"?>
<!-- 透明度改变动画 -->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1"
android:toAlpha="0.2"/>
<!-- 旋转动画 -->
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"/>
<!-- 缩放动画 -->
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.5"
android:toYScale="1.5"/>
<!-- 平移动画 -->
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="200"
android:toYDelta="300"/>
<!-- 组合动画 -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1"
android:toAlpha="0.2"/>
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180"/>
<scale
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="3"
android:toYScale="2"/>
<translate
android:fromXDelta="0"
android:fromYDelta="100"
android:toXDelta="200"
android:toYDelta="500"/>
</set>
Step2
activity布局文件中由5个button和一个imageview,比较简单这里就不写了,直接上activity中的代码
public class TweenActivity extends Activity {
private ImageView mIv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween);
mIv = (ImageView) findViewById(R.id.iv_tween);
}
public void translate(View v){
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
animation.setDuration(2000);//设置动画时长
animation.setFillAfter(true);//保存动画后的效果
mIv.startAnimation(animation);//开始动画
}
public void scale(View v){
Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale);
animation.setDuration(2000);
animation.setFillAfter(true);//保存动画后的效果
mIv.startAnimation(animation);
}
public void rotate(View v){
Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate);
animation.setDuration(2000);
animation.setFillAfter(true);//保存动画后的效果
mIv.startAnimation(animation);
}
public void alpha(View v){
Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
animation.setDuration(2000);
animation.setFillAfter(true);//保存动画后的效果
mIv.startAnimation(animation);
}
public void group(View v){
Animation animation = AnimationUtils.loadAnimation(this, R.anim.set);
animation.setDuration(2000);
animation.setFillAfter(true);//保存动画后的效果
mIv.startAnimation(animation);
}
}
最后来讲讲属性动画,首先了解几个常用的参数:
valueFrom:设置状态或位置的起始值;
valueTo:设置状态或位置的最终值;
ordering
1. sequentially :设置动画集合中的动画按顺序执行;
2. together :设置动画集合中的动画同时执行;
propertyName
1. translationX和translationY: 设置View的相对位置移动;
2. rotation、rotationX和rotationY:设置View的旋转;
3. scaleX和scaleY:设置View在X,Y轴上的缩放;
4. pivotX和pivotY:设置View的中心点位置;
5. x和y:设置View的绝对位置;
6. alpha:设置View的透明度;
valueType
1. intType:设置value值为int类型;
2. floatType:设置value值为float类型;
3. pathType:设置value值为String类型,用于制作矢量图的path;
关于几个系统提供的插值器的动画效果:
好了,先上一张利用属性动画实现的组合动画效果图,然后再进行步骤分解一一介绍:
实现步骤:
Step1
和部件动画一样,准备动画xml,在res文件夹下创建animator文件夹,新建动画集合文件group.xml;
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<!-- 旋转动画,Y轴为轴心翻转180度,重复次数50次,重复模式为反向,这里value样式要设置为float类型 -->
<set>
<objectAnimator
android:propertyName="rotationX"
android:repeatCount="50"
android:repeatMode="reverse"/>
<objectAnimator
android:propertyName="rotationY"
android:repeatCount="50"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="180"
android:valueType="floatType"/>
</set>
<!-- 缩放动画 2倍-->
<set>
<objectAnimator
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="2.0">
</objectAnimator>
<objectAnimator
android:propertyName="scaleY"
android:valueFrom="1.0"
android:valueTo="2.0">
</objectAnimator>
</set>
<!-- 平移动画 -->
<set>
<objectAnimator
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="300"
android:valueType="floatType"/>
<objectAnimator
android:propertyName="translationY"
android:valueFrom="0"
android:valueTo="500"
android:valueType="floatType"/>
</set>
<!-- 透明度改变动画 -->
<set>
<objectAnimator
android:propertyName="alpha"
android:valueFrom="0.3"
android:valueTo="1.0"
android:valueType="floatType"/>
</set>
</set>
Step2
在activity中开启动画
public class PropertyActivity extends Activity {
private ImageView mIv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_property);
mIv = (ImageView) findViewById(R.id.iv_property);
}
public void propertyGroup(View v){
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.group);
set.setTarget(mIv);//设置动画对象
set.setDuration(2000);//设置持续时间
set.setInterpolator(new OvershootInterpolator());//设置插值器
set.start();//开始动画
}
}