Android中的动画效果一直是人机交互中的一个非常重要的一个部分.接下来就让我研究研究Android中动画的特性分析等
动画的分类
- View动画 也是我们常说的补间动画
- Frame动画 也是我们常说的帧动画
- 属性动画
View动画的分析:
在View动画的探索过程中我们主要用到了Animation原生的框架,实现原理 是每次绘制视图时View所在的ViewGroup种的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧.如果没有动画完成就继续调用invalidate()函数,启动下次绘制来驱动动画.
View动画的作用对象是View,它支持4种动画效果
- 平移动画----TranslateAnimation
- 缩放动画----ScaleAnimation
- 旋转动画----RotateAnimation
- 透明度动画----AlphaAnimation
四种动画效果既可以通过XML来定义又可以通过代码来动态创建.
以下是View动画Java代码编写
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void btnAlpha(View view) {
//参数为透明度的呈现百分比
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(2000);
view.startAnimation(aa);
}
public void btnRotate(View view) {
//以View的100,100坐标旋转360度
RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
ra.setDuration(1000);
view.startAnimation(ra);
}
public void btnRotateSelf(View view) {
//以自身的中点旋转360度
RotateAnimation ra = new RotateAnimation(0, 360,
RotateAnimation.RELATIVE_TO_SELF, 0.5F,
RotateAnimation.RELATIVE_TO_SELF, 0.5F);
ra.setDuration(1000);
view.startAnimation(ra);
}
public void btnTranslate(View view) {
//以View自身坐标的(0,0)点开始移,移动到(200,300)坐标
TranslateAnimation ta = new TranslateAnimation(0, 200,0, 300);
ta.setDuration(1000);
view.startAnimation(ta);
}
public void btnScale(View view) {
//以View自身坐标的(0,0)点开始缩放,缩放到X的3倍大小Y的2倍大小
ScaleAnimation sa = new ScaleAnimation(0, 3, 0, 2);
sa.setDuration(1000);
view.startAnimation(sa);
}
public void btnScaleSelf(View view) {
//以View自身中间点开始缩放,缩放到正常大小
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1,
Animation.RELATIVE_TO_SELF, 0.5F,
Animation.RELATIVE_TO_SELF, 0.5F);
sa.setDuration(1000);
view.startAnimation(sa);
}
public void btnSet(View view) {
//创建一个动画集合
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
//创建一个透明度动画
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
//创建一个位移动画
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 200);
ta.setDuration(1000);
//将透明动画和位移动画填入到动画集合中
as.addAnimation(aa);
as.addAnimation(ta);
view.startAnimation(as);
}
}
对View动画Android提供了监听的回调可以添加相应的监听方法:
as.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
以下是View动画XML代码编写
<!--set标签表示动画集合 对应AnimaationSet类-->
<!--interpolator
表示动画集合所采用的差值器,差值器可以影响动画的速度
比如说非匀速动画就需要通过差值器来控制动画的播放过程
默认为@android:anim/accelerate_interpolator" 加速差值器-->
<!--shareInterpolator
表示集合中的动画是否和集合共享同一个值
如果不指定差值器那么子动画需要单独制定所需要的差值器或者使用默认值-->
<!--fillAfter表示动画结束以后View是否停留在结束的位置-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true"
android:fillAfter="true"
>
<!--平移动画,对应TranslateAnimation类-->
<translate
android:fromXDelta="0" #起始x尺寸比例
android:toXDelta="300" #最终x尺寸比例
android:fromYDelta="0" #起始y尺寸比例
android:toYDelta="300"/> #最终y尺寸比例
<!--缩放动画对应ScaleAnimation类-->
<!--从X的0.5倍开始缩放到1.3倍
从Y的1.2倍开始缩放到2.3倍-->
<!--pivotX 缩放轴点的坐标,会影响缩放的效果,当前是从右下往左上缩放-->
<scale
android:fromXScale="1"
android:toXScale="2"
android:fromYScale="1"
android:toYScale="2"
android:pivotX="500"
android:pivotY="500"
/>
<!--透明度动画对应AlphaAnimation类-->
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
/>
<!--旋转动画对应RotateAnimation类-->
<!--degree表示旋转的角度-->
<!--pivot表示旋转的轴点-->
<rotate
android:fromDegrees="0"
android:toDegrees="300"
android:pivotX="300"
android:pivotY="300"
/>
</set>
android:pivotY="50%" #同上
android:duration="700" #动画持续时间,毫秒为单位
android:fillAfter="true" #动画结束后,保持结束时的状态
android:fillBefore="true" #动画结束后,恢复为初始状态
android:fillEnabled="true" #效果同上
android:repeatCount="5" #重复次数,取值为-1时无限重复,默认动画执行一次
android:repeatMode ="reverse" #重复模式,有reverse和restart两个值,前者为倒序回放,后者为重新开始
最后在通过JAVA代码载入对应动画
public void btn(View view) {
Animation animation= AnimationUtils.loadAnimation(this,R.anim.zc);
//animation.setDuration(1000); Java代码优先级高于XML代码
view.startAnimation(animation);
帧动画
帧动画就是顺序播放一组预先定义好的图片,类似于电影的播放.
系统提供了另外一个类AnimationDrawable来使用帧动画.
建立XML标签animation-list的时候要在drawable文件夹下建立,不要在anim文件夹下建立,不然会报错
<?xml version="1.0" encoding="utf-8"?>
<!--oneshot表示是否停留在最后一帧
true表示停留在最后一帧
false表示循环播放-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/dog1" android:duration="5000"/>
<item android:drawable="@drawable/dog2" android:duration="5000"/>
<item android:drawable="@drawable/dog3" android:duration="5000"/>
</animation-list>
imageView= (ImageView) findViewById(R.id.image);
AnimationDrawable animationDrawable= (AnimationDrawable) imageView.getBackground();
animationDrawable.start();
View动画的特殊使用场景
LayoutAnimation
LayoutAnimation它作用于ViewGroup,当他的子元素出场的时候会具有这种动画效果,这种效果常常用在ListView上,步骤如下:
1.首先定义LayoutAnimation:
<?xml version="1.0" encoding="utf-8"?>
<!--delay:
子元素动画的时间延迟 目前是二倍的延迟-->
<!--animationOrder
子元素动画的顺序,有三种选项
normal:顺序显示
reverse逆向显示
random随机显示-->
<!--animation
为子元素置顶具体的入场动画-->
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="2"
android:animationOrder="normal"
android:animation="@anim/anim_item">
</layoutAnimation>
2.定义一个指定动画:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true" >
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<translate
android:fromXDelta="500"
android:toXDelta="0" />
</set>
3.为ViewGroup制定android:layoutAnimation属性android:layoutAnimation="@anim/layoutanimation"
.例如ListView:
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/layoutanimation"
android:id="@+id/list"></ListView>
除了XML代码,JAVA代码中也可以实现:
Animation animation= AnimationUtils.loadAnimation(this,R.anim.anim_item);
LayoutAnimationController controller=new LayoutAnimationController(animation);
controller.setDelay(2f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
mListView.setLayoutAnimation(controller);
具体含义同XML这里就不在解释了.

Acitivity的切换效果
Acitivity有默认的切换效果,并且我们可以自定义的.
启动时候的启动效果:
Intent intent=new Intent(MainActivity.this,LoginActivity.class);
startActivity(intent);
// enter_anim被打开时所需资源的ID
// enter_exit被暂停时所需资源的ID
overridePendingTransition(R.anim.enter_anim,R.anim.anim_item);
关闭时候得效果
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.anim_item,R.anim.exit_anim);
}
注意
使用overridePendingTransition方法必须位于startActivity之后或者finish后面,不然不起作用.
Fragment也可以添加动画
可以通过FragmentTransaction中的setCustomAnimations()方法来添加切换动画.