安卓动画学习(一)

安卓动画学习(View动画)

动画的分类

  • 先贴官方的解释
An animation resource can define one of two types of animations:

    Property Animation
        Creates an animation by modifying an object's property values over a set period of time with an Animator.
    View Animation
        There are two types of animations that you can do with the view animation framework:

            Tween animation: Creates an animation by performing a series of transformations on a single image with an Animation
            Frame animation: or creates an animation by showing a sequence of images in order with an AnimationDrawable.
  • Property Animation():通过在一段时间内修改一个对象的属性值来实现动画的效果
  • View Animation(视图动画):这个分两类,一类叫做补间动画,是在一段时间内对单个图像执行一系列变换来达到动画的效果,一类是帧动画,一段时间之内按顺序连续显示一系列的图像来达到动画的效果

先来看补间动画介绍

  • 在XML中定义的动画,可在一段时间内修改目标对象的属性,如背景颜色或Alpha值。
  • 文件位置,res/animator/filename.xml(当然名字自己随意,这里只不过是官方建议)
  • 动画属性
属性 效果
alpha 渐变透明度动画效果
scale 渐变尺寸伸缩动画效果
translate 画面转换位置移动动画效果
rotate 画面转移旋转动画效果

scale--调节尺寸

  • 关于调节的属性有以下几种
android:fromXScale    //起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;
android:toXScale        //结尾的X方向上相对自身的缩放比例,浮点值;
android:fromYScale    //起始的Y方向上相对自身的缩放比例,浮点值,
android:toYScale        //结尾的Y方向上相对自身的缩放比例,浮点值;
android:pivotX            //缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 5050%50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。
android:pivotY           //缩放起点Y轴坐标,取值及意义跟android:pivotX一样。
  • 这六种属性很容易理解,一对xy只能,表示缩放起点,一对表示缩放开始时相对自身比例,一对表示缩放结束相对自身比例
  • 可以看到,我们只能设置开始时的大小和位置以及动画完毕的大小,却不能设置动画完毕的位置,系统是默认他完成之后的位置与与动画之前是相同的

alpha —— 透明度

  • 自身携带属性
    android:fromAlpha   //动画开始的透明度,从0.0 --1.0 0.0表示全透明,1.0表示完全不透明
    android:toAlpha       //动画结束时的透明度,也是从0.0 --1.0 0.0表示全透明,1.0表示完全不透明

rotate —— 旋转

  • 自身携带属性
    android:fromDegrees     //开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
    android:toDegrees         //结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
    android:pivotX               //缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 5050%50%p,具体意义已在scale标签中讲述,这里就不再重讲
    android:pivotY              // 缩放起点Y轴坐标,可以是数值、百分数、百分数p 三种样式,比如 5050%50%p

translate —— 平移

    android:fromXDelta     //起始点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 5050%50%p,具体意义已在scale标签中讲述,这里就不再重讲
    android:fromYDelta    //起始点Y轴从标,可以是数值、百分数、百分数p 三种样式;
    android:toXDelta         //结束点X轴坐标
    android:toYDelta        //结束点Y轴坐标

  • 上面是scale本身的属性,因为Animation类是所有动画(scale、alpha、translate、rotate)的基类,所以Animation类所具有的属性对其子类也适用
    android:duration       //动画持续时间,以毫秒为单位 
    android:fillAfter          //如果设置为true,控件动画结束时,将保持动画最后时的状态
    android:fillBefore       //如果设置为true或者fillEnabled未设置为true,则在动画开始之前应用动画转换。 
    android:fillEnabled    //如果设置为true,则会考虑fillBefore的值。 
    android:repeatCount //重复次数
    android:repeatMode	//重复类型,有reverserestart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
    android:interpolator  //设定插值器,其实就是指定的动作效果,比如弹跳效果等
    android:startOffset  //一旦开始时间到达,动画运行之前的延迟时间(以毫秒为单位)。 

补间动画用法

  • 上面四种可以直接在xml中单独使用,比如
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="0.0"
    android:toXScale="0.8"
    android:fromYScale="0.0"
    android:toYScale="0.8"
    android:pivotX="50"
    android:pivotY="50"
    android:duration="1000"
    android:fillAfter="true"
    >
</scale>
  • 也可以用set标签将他们包围
<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:duration="3000"  
    android:fillAfter="true">  
      
  <alpha  />  
    
  <scale  />  
    
  <rotate />  
         
</set>
  • 注意:set 本身是没有属性的,它所使用的是从基类继承的属性,当他set根节点设置属性时,这个属性会作用到set结点里面所有结点
  • 代码中的使用
final Animation animator = AnimationUtils.loadAnimation(this,R.anim.animation);
final ImageView iv = findViewById(R.id.main_Iv);
iv.startAnimation(animator);

举例

  • 属性代码

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

    android:duration="1000"
    android:repeatMode="restart"
    android:repeatCount="5"
    >

    <scale
        android:fromXScale="0.0"
        android:toXScale="0.8"
        android:fromYScale="0.0"
        android:toYScale="0.8"
        android:pivotX="50"
        android:pivotY="50"/>
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"/>
    <rotate
        android:pivotY="100"
        android:pivotX="100"
        android:fromDegrees="0"
        android:toDegrees="360"/>
    <translate
        android:fromXDelta="100"
        android:fromYDelta="100"
        android:toXDelta="200"
        android:toYDelta="200"/>

</set>
  • java代码
 protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Animation animator = AnimationUtils.loadAnimation(this,R.anim.animation);
        final ImageView iv = findViewById(R.id.main_Iv);
        Button bt = findViewById(R.id.main_Bt);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                iv.startAnimation(animator);
            }
        });
    }
  • 效果图
  • 这里的重复次数我是在set中写的,所以重复效果没出来,最后看到开发文档
durationrepeatModefillBeforefillAfter:这些属性在AnimationSet对象上设置时,将被推送到所有子动画。
repeatCountfillEnabledAnimationSet会忽略这些属性。
startOffsetshareInterpolator:这些属性适用于AnimationSet本身。
  • 就是说你咋设置重复次数的时候只能在单个节点中设置

image

这里再解释一下插值器的作用

  • 他就是作用在动画效果之上,使动画局部变快或者变慢之类的,这里看一下他的一些取值和意义
    AccelerateDecelerateInterpolator   //在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
    AccelerateInterpolator                     //在动画开始的地方速率改变比较慢,然后开始加速
    AnticipateInterpolator                      //开始的时候向后然后向前甩
    AnticipateOvershootInterpolator     //开始的时候向后然后向前甩一定值后返回最后的值
    BounceInterpolator                         // 动画结束的时候弹起
    CycleInterpolator                             //动画循环播放特定的次数,速率改变沿着正弦曲线
    DecelerateInterpolator                    //在动画开始的地方快然后慢
    LinearInterpolator                           // 以常量速率改变
    OvershootInterpolator                      //向前甩一定值后再回到原来位置
  • 根据字面意思很容易理解,这里就不再阐述

在代码生成动画

上面的动画是写在xml文件中的,接下来我说说在代码中生成动画的方法

  • 很容易理解,android为刚才每个动画标签提供了一个类
xml结点 类名
scale ScaleAnimation
alpha AlphaAnimation
rotate RotateAnimation
translate TranslateAnimation
set AnimationSet

这些其实都很好理解,没啥说的,我们先来看一下动画的基类Animation

  • android为他的每一种xml属性都对应了一种set方法,例如
android:duration                  setDuration(long)  动画持续时间,以毫秒为单位
  • 其他我就不写了,都是一样的

ScaleAnimation

  • 贴一下他的几个构造方法
    ScaleAnimation(Context context, AttributeSet attrs)  ///XML文件加载动画,基本用不到
    ScaleAnimation(float fromX, float toX, float fromY, float toY)
    ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
    ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
  • 前三个参数跟xml文件中一样,float值全都表示精准值,可以直接理解,第四个的xy刚开始位置参数变成了Type,我们来看看官方文档
参数 含义
ABSOLUTE 指定的尺寸是像素的绝对数量
RELATIVE_TO_PARENT 指定一个浮点数,并且应该乘以被动画的对象的父级的高度或宽度
RELATIVE_TO_SELF 指定一个浮点数,并且应该乘以被动画的对象的高度或宽度
  • 嗯,这里我就只拿了官方文档跟这里有关的几个类型常量,意思也好理解,就不再阐述

AlphaAnimation

  • 贴一下他的几个构造方法
    AlphaAnimation(Context context, AttributeSet attrs)  //同样,从本地XML加载动画,基本不用
    AlphaAnimation(float fromAlpha, float toAlpha)
  • 简单,不说了

RotateAnimation

  • 贴一下他的几个构造方法
    RotateAnimation(Context context, AttributeSet attrs)  //从本地XML文档加载动画,同样,基本不用
    RotateAnimation(float fromDegrees, float toDegrees)
    RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
    RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
  • 这里的最后一个构造参数也出现了类型常量这个参数,跟第一个一样,不再说明

TranslateAnimation

  • 贴一下他的几个构造方法
    TranslateAnimation(Context context, AttributeSet attrs)  //同样,基本不用
    TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
    TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)

最后看一下他们的集合类AnimationSet

  • 贴一下他的几个构造方法
    AnimationSet(Context context, AttributeSet attrs)  //同样,基本不用
    AnimationSet(boolean shareInterpolator)  //shareInterpolator取值truefalse,取true时,指在AnimationSet中定义一个插值器(interpolater),它下面的所有动画共同。如果设为false,则表示它下面的动画自己定义各自的插值器。
  • 再来看一下他的一些常用方法,或者可以去看一下官方文档
方法 用法
addAnimation(Animation a) 为此动画集添加一个子动画。
reset() 重置此动画的初始化状态。
restrictDuration(long durationMillis) 确保此动画运行的持续时间不超过durationMillis。
scaleCurrentDuration(float scale) 多少时间通过缩放。
setDuration(long durationMillis) 设置每个子动画的持续时间
setStartOffset(long startOffset) 设置动画开始时的延迟
  • 感觉比较常用的就这些

再来说一下插值器的类

  • 他们的基类Animation也同样为他们提供了一个设置插值器的方法
setInterpolator(Interpolator i)
  • 而Interpolator这个只是一个接口,不过他有一些实现类
header 1 header 2
AccelerateDecelerateInterpolato 内插器,其变化率开始和结束缓慢,但通过中间加速。
AccelerateInterpolator 内插器,其中变化率开始缓慢,然后加速。
AnticipateInterpolator 内插器,其中变化开始向后并向前闪烁
AnticipateOvershootInterpolator 一个内插器,其中变化开始向后,然后向前闪烁并超过目标值,最后返回到最终值。
BounceInterpolator 插值器,其中的变化在最后反弹
DecelerateInterpolator 一个内插器,其中变化率开始快速然后减速。
OvershootInterpolator 一个内插器,其中变化向前闪烁并超过最后一个值然后返回。
CycleInterpolator 将动画重复指定的循环次数。变化率遵循正弦模式。
LinearInterpolator 内插器的变化率是恒定的
PathInterpolator 可以遍历从to 延伸的Path的插补器。
  • 其中,CycleInterpolator这个类的构造参数有两个
  • CycleInterpolator(float cycles)
  • CycleInterpolator(Context context, AttributeSet attrs)
  • 关于第一个构造方法参数官方的解释是将动画重复指定的循环次数。变化率遵循正弦模式。稍微试验了一下,不是特别懂,以后写到再看吧
  • 再说一下最后一个插值器实现类
  • 先看一下构造方法
PathInterpolator(Path path) //为任意创建一个插补器Path
PathInterpolator(float controlX, float controlY)//为二次贝塞尔曲线创建一个插补器。
PathInterpolator(float controlX1, float controlY1, float controlX2, float controlY2)//为三次贝塞尔曲线创建一个插补器。
PathInterpolator(Context context, AttributeSet attrs)
  • 说到底就是给他一个路径,具体的再去实验吧,这里就不细说了

总结

  • 这样的设置控件动画其实是不能改变控件自身原有的属性的,他改变的只是显示的属性,比如我们用这种方法实现一个可点击的按钮平移之后,按钮的点击事件还是只能通过点击原来的地方来响应点击事件,而平移后的按钮是不能响应点击事件的

猜你喜欢

转载自blog.csdn.net/asffghfgfghfg1556/article/details/80426295