Note3_公共技术点之Android 动画基础
来源:http://t.cn/Ry92sKV 公共技术点之Android 动画基础
- 传统View动画(Tween/Frame)
1.1 Tween 动画
文件位置:res/anim/filename.xml
编译资源的数据类型:an Animation
资源引用:
Java:R.anim.filename
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>
布局文件必须有一个独立的根元素,可以是<alpha>,<scale>,<translate>,<rotate>,<set>(持有一组其它的动画元素,甚至可以是内嵌
的set元素)中的一个
1.1.1 <set>
一个持有其它动画元素的容器<alpha>, <scale>, <translate>,<rotate>或者其它<set> 元素属性
android:interpolator
应用于动画的插值器。该值必须是一个指定了插值器资源的引用(不是一个插值器的类名),在平台中有缺省的插值器资源可以使用,或
者你可以创建自己的插值器资源,可以看下面关于插值器的讨论。
android:shareInterpolator
Boolean 值,true:代表在所有的子元素中共享同一个插值器
1.1.2 <alpha>
A fade-in or fade-out animation. Represents an AlphaAnimation. 一个渐入渐出的动画,对应的java 类为AlphaAnimation。
属性
android:fromAlpha
android:toAlpha
代表动画开始和结束时透明度,0.0 表示完全透明,1.0 表示完全不透明,Float 值
1.1.3 <scale>
可以实现动态调控件尺寸的效果,通过设置pivotX 和pivotY 你可以指定image 缩放的中心点,比如:如果这些值是0,则表示左上
角,所有的缩放变化将沿着右下角的轨迹运动。对应的类为:ScaleAnimation
属性
android:fromXScale
android:toXScale
android:fromYScale
android:toYScale
Float 值,为动画起始到结束时,X、Y 坐标上的伸缩尺寸
0.0 表示收缩到没有
1.0 表示正常无伸缩
android:pivotX
android:pivotY
代表缩放的中轴点X/Y 坐标,浮点值
如果我们想表示中轴点为图像的中心,我们可以把两个属性值定义成0.5 或者50%。
1.1.4 <translate>
代表一个水平、垂直的位移。对应的类为TranslateAnimation. 属性
android:fromXDelta 属性代表起始X 方向的位置
android:toXDelta
android:fromYDelta
android:toYDelta 属性代表起始Y 方向的位置
代表动画起始或者结束X / Y 方向上的位置,Float 或者百分比值
浮点数num%、num%p 分别相对于自身或者父控件
如果以浮点数字表示,是一个绝对值,代表相对自身原始位置的像素值;
如果以num%表示,代表相对于自己的百分比,比如toXDelta 定义为100%就表示在X 方向上移动自己的1 倍距离
如果以num%p 表示,代表相对于父类组件的百分比。
1.1.5 <rotate>
是旋转动画,与之对应的Java 类是RotateAnimation
属性
android:fromDegrees
android:toDegrees
代表起始和结束的角度,浮点值,单位:度
android:pivotX 属性代表旋转中心的X 坐标值
android:pivotY 属性代表旋转中心的Y 坐标值
Float 值或者百分比
这两个属性也有三种表示方式,但是X 轴都是相对方向都是Left,Y 轴都是相对于Top
浮点数、num%、num%p;
数字方式代表相对于自身左边缘的像素值,
num%方式代表相对于自身左边缘或顶边缘的百分比,
num%p 方式代表相对于父容器的左边缘或顶边缘的百分比
属性
android:fromDegrees
android:toDegrees
开始和结束时的弧度位置,单位是度,Float 值
调用代码
ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
另外,在动画中,如果我们添加了android:fillAfter="true"后,这个动画执行完之后保持最后的状态;android:duration="integer"代
表动画持续的时间,单位为毫秒。
1.1.6 插值器
用于修改一个动画过程中的速率,可以定义各种各样的非线性变化函数,比如加速、减速等
在Android 中所有的插值器都是Interpolator 的子类,通过android:interpolator 属性你可以引用不同的插值器。下面是几种插值器:
你可以通过下面的方式使用它们:
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
自定义插值器如果你对系统提供的插值器不满意,我们可以创建一个插值器资源修改插值器的属性,比如修改AnticipateInterpolator
的加速速率,调整CycleInterpolator 的循环次数等。为了完成这种需求,我们需要创建XML 资源文件,然后将其放于/res/anim 下,
然后再动画元素中引用即可。我们先来看一下几种常见的插值器可调整的属性:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
我们先来看一下几种常见的插值器可调整的属性:
<accelerateDecelerateInterpolator> 无
<accelerateInterpolator> android:factor 浮点值,加速速率,默认为1
<anticipateInterploator> android:tension 浮点值,起始点后退的张力、拉力数,默认为2
<anticipateOvershootInterpolator> android:tension 同上android:extraTension 浮点值,拉力的倍数,默认为1.5(2 * 1.5)
<bounceInterpolator> 无
<cycleInterplolator> android:cycles int,循环的个数,默认为1
<decelerateInterpolator> android:factor 浮点值,减速的速率,默认为1
<linearInterpolator> 无
<overshootInterpolator> 浮点值,超出终点后的张力、拉力,默认为2
比如:res/anim/my_overshoot_interpolator.xml:
<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"/>
This animation XML will apply the interpolator:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700" />
如果简单的修改插值器的属性值还不能够满足我们的需求,那么就自己来通过实现Interpolator 接口来定义自己的插值器了因为上面所
有的Interpolator 都实现了Interpolator 接口,这个接口定义了一个方法:float getInterpolation(float input); 此方法由系统调
用,input 代表动画的时间,在0 和1 之间,也就是开始和结束之间。
线性(匀速)插值器定义如下:
public float getInterpolation(float input) {
return input;
}
加速减速插值器定义如下:
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}