Android 动画详解
开始的时候先思考几个问题
1. android 动画是什么
2. android 动画的分类
3. android 动画怎么实现
4. android 动画实现的原理
第一个问题:android 动画是什么
这个问题很明显了 就不用回答了
第二个问题:android动画的分类
android 动画一共分为三类
1. View Animation 也叫补间动画,是android提供的最早的一种动画实现形式
2. Drawable Animation 这种动画(也叫Frame动画、帧动画)其实可以划分到视图动画的类别,专门用来一个一个的显示Drawable的resources,就像放幻灯片一样。
3. Property Animation: 属性动画只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让你自定义任何类型和属性的动画。
第三个问题android 动画怎么实现
View Animation (补间动画)
补间动画一共有两种实现形式 1、xml形式的实现 通常是在res/anim/xxx.xml 中实现 2、是利用java代码实现
1. xml形式:
淡入淡出模式 Alpha属性详解
`
<!--
fromAlpha :动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
toAlpha: 动画结束的透明度,同上
duration:动画持续时间
-->
<alpha android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration = "1000"/>
`
旋转形式 Rotate属性详解
`<!--
fromDegrees :开始时的角度
toDegrees:结束时的角度
pivotx:用于设置旋转时X值的坐标
1 当值为 50 表示使用绝对位置定位
2 当值为 50% 相对于自身的坐标
3 当值为 50%p 相对于父控件的坐标
-->
<rotate android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration = "1000"
/> `
缩放形式 Scale属性详解
`<!--
fromXScale 初始X轴缩放比例,1.0表示无变化
toXScale:结束X轴缩放比例
fromYScale:初始Y轴缩放比例
toYScale:结束Y轴缩放比例
pivotX:缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、5
0%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
pivotY:缩放起点Y轴坐标,同上规律
-->
<scale
android:duration="1000"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.5"
android:toYScale="0.5" />`
移动形式 Translate属性详解
`<!-- fromXDelta: 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加 50px为初始点
、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
toXDelta:结束点X轴坐标,同上规律
fromYDelta:起始点Y轴坐标,同上规律
toYDelta:结束点X轴坐标,同上规律
-->
<translate
android:fromXDelta="0"
android:toXDelta="500"
android:fromYDelta="0"
android:duration = "1000"
android:toYDelta="500" />`
组合动画:通过上面对于动画的属性介绍之后我们来看看在Android中这些动画组合使用用set属性包裹按照顺序依次执行,代码如下:
`<rotate android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration = "1000"
/>
<translate
android:fromXDelta="0"
android:toXDelta="500"
android:fromYDelta="0"
android:duration = "1000"
android:toYDelta="500" />`
2.代码形式:
淡入淡出模式 Alpha属性详解
`AnimationSet animationSet = new AnimationSet(true);
AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);
animationSet.setDuration(1000);
animationSet.addAnimation(alphaAnimation);
img.startAnimation(animationSet);`
旋转形式 Rotate属性详解:
`AnimationSet animationSet = new AnimationSet(true);
/**
* 参数1: 从哪个角度开始旋转
* 参数2: 转到什么角度
* 后面四个参数是关于圆心位置的设置
* 参数3:x轴的坐标类型 ABSOLUTE 绝对坐标 RELATIVE_TO_SELF相对于自身的坐标 RELATIVE_TO_PARENT相对于父控件的坐标
*
*/
RotateAnimation rotateAnimation = new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animationSet.setDuration(1000);
animationSet.addAnimation(rotateAnimation);
img.startAnimation(animationSet);`
缩放形式 Scale属性详解:
`AnimationSet animationSet = new AnimationSet(true);
/**
* 参数1 x轴的初始值
* 参数2 x轴收缩都的值
* 参数3 y轴的初始值
* 参数4 y轴收缩的值
*/
ScaleAnimation scaleAnimation = new ScaleAnimation(0,0.5f,0,0.5f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animationSet.addAnimation(scaleAnimation);
animationSet.setDuration(2000);
img.startAnimation(animationSet);`
移动形式 Translate属性详解 :
`AnimationSet animationSet = new AnimationSet(true);
/**
* 参数1 2 x轴开始的位置
* 参数3 4 y轴开始的位置
* 参数5 6 x轴结束的位置
* 参数7 8 y轴结束的位置
*/
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1);
animationSet.addAnimation(translateAnimation);
animationSet.setDuration(2000);
img.startAnimation(animationSet);`
**组合形式:**java代码太简单了 这里就不多做累述了
AnimationSet:
在上述代码中可以看出来动画的实现是用AnimationSet,AnimationSet继承自Animation,是上面四种的组合容器管理类,没有自己特有的属性,他的属性继承自Animation,所以特别注意,当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。
Animation 属性:
View与动画相关的属性
插值器使用方法
首先要了解为什么需要插值器,因为在补间动画中,我们一般只定义关键帧(首帧或尾帧),然后由系统自动生成中间帧,生成中间帧的这个过程可以成为“插值”。插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速等。下面是几种常见的插值器:
Interpolator对象资源ID功能作用。
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator先加速再减速
AccelerateInterpolator@android:anim/accelerate_interpolator加速
AnticipateInterpolator@android:anim/anticipate_interpolator先回退一小步然后加速前进
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator在上一个基础上超出终点一小步再回到终点
BounceInterpolator@android:anim/bounce_interpolator最后阶段弹球效果
CycleInterpolator@android:anim/cycle_interpolator周期运动
DecelerateInterpolator@android:anim/decelerate_interpolator减速
LinearInterpolator@android:anim/linear_interpolator匀速
OvershootInterpolator@android:anim/overshoot_interpolator快速到达终点并超出一小步最后回到终点
插值器使用法:
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
Drawable Animation(帧动画动画)使用详解
Drawable动画其实就是Frame动画(帧动画),它允许你实现像播放幻灯片一样的效果,这种动画的实质其实是Drawable,所以这种动画的XML定义方式文件一般放在res/drawable/目录下。具体关于帧动画方式有xm方式,java方式。其中最常用的是xml方式
xml方式:
必须是根节点,包含一个或者多个元素,属性有:
android:oneshot true代表只执行一次,false循环执行。
类似一帧的动画资源。
animation-list的子项,包含属性如下:
- android:drawable 一个frame的Drawable资源。
- android:duration 一个frame的Drawable资源的持续时间。
`<!-- 注意:rocket.xml文件位于res/drawable/目录下 -->
<?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>`
Java代码:
`AnimationDrawable animation = (AnimationDrawable) img.getBackground();
animation.start();`
animation.start()在onCreate()方法中动画是没法实现的。因为当我们在onCreate中调用AnimationDrawable的start方法时,窗口Window对象还没有完全初始化,AnimationDrawable不能完全追加到窗口Window对象中需要把这段代码放在onWindowFocusChanged方法中,当Activity展示给用户时,onWindowFocusChanged方法就会被调用,我们正是在这个时候实现我们的动画效果。当然,onWindowFocusChanged是在onCreate之后被调用的