Android动画基础

动画的分类:

  • View Animation:视图动画在古老的Android系统中就已经提供了,只能被用来设置View的动画
  • Drawable Animation:Frame动画,帧动画,专门用来一个一个的显示Drawable的resource,就像放幻灯片一样
  • Peopety Animation:属性动画只对Android 3.0以上的版本系统才有效,这种动画可以设置给任何的Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让我们自定义任何类型和属性的动画
View Animation(视图动画):

视图动画,也叫Tween(补间)动画,可以在一个视图容器内执行一系列简单变换(位置,大小,旋转,透明度)。
补间动画通过XML或者Android代码定义,建议使用XML文件定义,因为它更具有可读性,可用性

这里写图片描述

  • AlphaAnimation:渐变透明度动画效果 在XML中关键字为<alpha>
  • RotateAnimation:画面转移旋转动画效果 在XML中关键字为<rotate>
  • ScaleAnimation : 渐变尺寸伸缩动画效果 在XML中关键字为<scale>
  • TranslateAnimation:画面转换位置移动画效果 在XML中关键字为<translate>
  • AnimationSet:一个持有其他动画元素alpha,scale,translate,rotate或者其他set元素的容器

文件位置: 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元素) 中的一个

<set>

一个持有其他动画元素的容器
属性:

android:interpolator

应用于动画的插值器。该值必须是一个指定了插值器资源的引用(不是一个插值器的类名),在平台中有缺省的插值器可以使用,或者我们可以创建自己的插值器资源

android:shareInterpolator

true:代表在所有的子元素中共享一个插值器

<alpha>

一个淡入淡出的动画
属性:
android:fromAlpha
android:toAlpha
代表动画开始和结束时的透明度,0.0表示完全透明,1.0表示完全不透明

<scale>*

可以实现动态调控件尺寸的效果,通过设置pivotX和pivotY,我们可以指定image缩放的中心点,比如,如果这些值是0,则表示左上角,所有的缩放变化将沿着右下角的轨迹运动
属性:
android:fromXScale
android:toXScale
android:fromYScale
android:toYScale
Float值,为动画起始到结束时,x,y坐标上的伸缩尺寸
0.0表示收缩到没有
1.0表示正常无伸缩

android:pivotX
android:pivotY
表示缩放的中轴点X/Y坐标值,浮点值
如果我们想表示中轴点为图像的中心,我们可以把两个属性值定义为0.5或者50%

<translate>

代表一个水平,垂直的位移
属性:
android:fromXDelta 代表起始X方向的位置
android:toXDelta
android:fromYDelta
android:toYDelta

代表动画起始或者结束X/Y方向上的位置,Float或者百分值
如果以浮点数字表示,是一个绝对值,表达相对自身原始位置的像素值

如果以num%表示,代表相对于自己的百分比,比如toXDelta定义为100%就表示X方向上移动自己的1倍距离

如果以num%p表示,代表相对于父类组件的百分比

<rotate>

旋转动画
属性:
android:fromDegrees
android:toDegrees
表示起始和结束的角度

android:pivotX 表示旋转中心的X的坐标值
android:pivotY表示旋转中心的Y的坐标值
这两个属性也有三种表示方式,但是X轴都是相对方向都是Left,Y轴都是相对于Top
浮点数、num%、num%p;
数字方式代表相对于自身左边缘的像素值,
num%方式代表相对于自身左边缘或顶边缘的百分比,
num%p方式代表相对于父容器的左边缘或顶边缘的百分比

调用代码

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”代表动画持续的时间,单位为毫秒。

插值器:
用于修改一个动画过程中的速度,可以定义各种各样的非线性变化函数,比如加速,减速等。
在Android中所有的插值器都是Interpolator的子类,通过android:interpolator属性,我们可以引用不同的插值器。

这里写图片描述

我们可以通过下面的方式使用它们:

<set android:interpolator="@android:anim/accelerate_interpolator">  
...  
</set>

我们来看一个例子:
首先我在xml中这样定义:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
    android:shareInterpolator="true"
    android:duration="5000"
    android:fillAfter="false"
    android:repeatMode="reverse"
    >

    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"

        />
    <rotate
        android:fromDegrees="270"
        android:toDegrees="-270"
        android:pivotX="0.5"
        android:pivotY="0.5"

        />
    <translate
        android:fromXDelta="20"
        android:toXDelta="20"
        android:fromYDelta="-40"
        android:toYDelta="-40"
        />


</set>

我们来看看效果:
这里写图片描述

关于上面这些的实现类,可以参考我的另外一篇博客:
http://blog.csdn.net/qq_36391075/article/details/77841839
-Animation实现loading动画效果

如果我们对系统自带的插值器不满意,我们还可以自己定义插值器:
像这样:

<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"

    android:cycles = "10"
/>

我们再看效果:

这里写图片描述

我们来看看插值器可调整的属性:

  • android:factor 浮点值,加速速率,默认为1
  • android:tension 浮点值,起始点后退的张力,拉力数,默认为2
  • android:cycles int,循环的个数,默认为1

所有的interpolator都实现了interpolator接口,这个接口定义了一个方法:

  @Override
    public float getInterpolation(float v) {
        return v;//匀速
    }
Frame动画

文件目录:res/drawable/filename.xml
编译资源数据类型:AnimationDrawable
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable.filename

<?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>

必须作为根元素,包含一个或者多个根元素
属性:
android:oneshot true为只执行一次动画,false :无限执行

item中:
属性:
android:drawable 用于这一帧的图片
android:duration integer类型,该帧的时长,单位为毫米

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/ic_1" android:duration="300"/>
    <item android:drawable="@drawable/ic_2" android:duration="300"/>
    <item android:drawable="@drawable/ic_3" android:duration="300"/>

</animation-list>
   private void frame(){
        ImageView imageView = (ImageView)findViewById(R.id.iv_ball);
        AnimationDrawable drawable = (AnimationDrawable) imageView.getDrawable();
        drawable.start();

    }

效果:
这里写图片描述


属性动画

这里写图片描述

目录:res/animator/filename.xml
编译后的资源为:ValueAnimation,ObjectAnimation,AnimatiorSet
XML文件的根元素必须为上面三个之一或者也可以在set中组织不同的动画,包含其他元素,也就是说可以嵌套

<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:
android:ordering:代表它的子动画的启动方式是先后有序还是同时
sequentially:动画按照先后顺序
together:动画同时启动

objectAnimator:
属性:
android:propertyName:
String类型,必须要设定的值,代表要执行动画的属性,通过名字的引用,比如我们可以指定了一个View的‘alpha’或者“backgroundColor”,这个objectAnimator元素没有暴露target属性,因此不能够在XML中执行一个动画,必须通过调用loadAnimation()填充我们的XML动画资源,并且调用setTarget应用到拥有这个属性的目标对象上。

android:valueTo:Float,int或者color,也是必须值,表明了动画结束的点。

android:valueFrom:相对应valueTo,动画的起点,如果没有指定,系统会通过属性身上的get方法获取

android:duration:动画的时长,默认为300毫秒
android:startOffset:动画延迟的时间,从调用start方法后开始计算,ini型
android:repeatCount:一个动画重复的次数,int型,-1代表无限循环,1表示动画在第一次执行完后重复执行一次,默认为0
android:repeatMode:重复模式,int型,当一个动画执行完的时候应该如何处理
reverse:会使动画按照向相反的方向执行
repeat:会使动画每次从头开始执行
android:valueType:关键参数,如果如果该value是一个颜色,那么就不需要指定,因为动画框架会自动的处理颜色值。
有intType和floatType两种:分别说明动画值为int和float型。
在一个特定的时间里执行一个动画
floatType (default)


关于属性动画的知识还有很多,之后继续补充

练习的东西:https://github.com/vivianluomin/PracticeEveryDay/tree/master/TestAnimation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值