Android补间动画,庆父不死

作者: 动漫中心  发布:2019-09-29

虹蓝,小福贵可以说是开启了国产动画的新时代。那个时候我还在上小学,国产有这种神作霸屏,进口动画有犬夜叉柯南,动画行业算得上是百花齐放了。如果当时以这种势头下去,国产动画成为中国的文化一大招牌只是时间的问题。我们有五千年的历史,诗词,美食,武侠,音乐…这些题材算是取之不尽 用之不竭。可惜,短短三五年,市场上充斥起了喜羊羊,光头强…能说什么,哀其不幸怒其不争罢了。

1、UIView block基础动画
  • 让一条弹幕从右往左飘过去
    (清单1.1)
//
//  ViewController.m
//  CoreAnimation
//
//  Created by 意一yiyi on 2017/11/13.
//  Copyright © 2017年 意一yiyi. All rights reserved.
//

#import "ViewController.h"

#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height

@interface ViewController ()

@property (strong, nonatomic) UILabel *label;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.label = [[UILabel alloc] init];
    self.label.backgroundColor = [UIColor magentaColor];
    self.label.frame = CGRectMake(kScreenWidth, 100, kScreenWidth, 30);
    self.label.text = @"嘿Siri,你在哪儿?";
    [self.view addSubview:self.label];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    [UIView animateWithDuration:5 animations:^{

        self.label.transform = CGAffineTransformMakeTranslation(-kScreenWidth, 0);
    }];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
  • 漂完之后,我们改变下弹幕内容
    (清单1.2)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    [UIView animateWithDuration:5 animations:^{

        self.label.transform = CGAffineTransformMakeTranslation(-kScreenWidth, 0);
    } completion:^(BOOL finished) {

        self.label.text = @"你在哪儿,我就在哪儿!";
    }];
}
  • 我们可以让弹幕匀速地飘过,而不是默认的easyInEasyOut
    (清单1.3)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    [UIView animateWithDuration:3 delay:0 options:(UIViewAnimationOptionCurveLinear) animations:^{

        self.label.transform = CGAffineTransformMakeTranslation(-kScreenWidth, 0);
    } completion:^(BOOL finished) {

        self.label.text = @"你在哪儿,我就在哪儿!";
    }];
}
  • 让弹幕弹一弹
    (清单1.4)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    [UIView animateWithDuration:3 delay:0 usingSpringWithDamping:0.2 initialSpringVelocity:5 options:(UIViewAnimationOptionCurveLinear) animations:^{

        self.label.transform = CGAffineTransformMakeTranslation(-kScreenWidth, 0);
    } completion:^(BOOL finished) {

        self.label.text = @"你在哪儿,我就在哪儿!";
    }];
}

图片 1

1.gif

动画合集

5 set 动画的合集
此时根元素是set元素,set元素中可以写入多个动画
set可以设置属性,set中的属性所有动画共享,动画内部的属性只有该动画自己可以使用
5.1 创建动画

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000">
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration="2000"
        android:repeatMode="restart"
        android:repeatCount="3"
        android:fillAfter="true"/>
    <translate
        android:fromXDelta="0"
        android:toXDelta="0"
        android:fromYDelta="0"
        android:toYDelta="50%"/>
    <scale
        android:fromXScale="1"
        android:toXScale="2"
        android:fromYScale="1"
        android:toYScale="2"
        android:pivotX="50%"
        android:pivotY="50%"/>
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"/>
</set>

5.2 执行动画

 AnimationSet set= (AnimationSet) AnimationUtils.loadAnimation(this,R.anim.animation);
imageView.startAnimation(set);

目录

重要写在前面

android动画中所有涉及到坐标的地方,坐标原点都是view的左上角。

补间动画只能在视觉上改变view的状态,但是view实际上还是以原来的大小在原来的位置上。例如把一个view从左上角移动到了右下角,那个这个view其实还在左上角,只是在视觉上移动到了右下角,如果view上有点击事件,那么只有点左上角那个位置才能触发点击事件,点右下角不会有任何反应。

(1)UIView block基础动画(UIView block属性动画的一种)
同样先说所有动画的公共属性

不用多说,和上面完全一致,需要说一点,有时这些属性没有代码提示,直接手打出来就行。

android:duration="2000"
android:repeatMode="restart"
android:repeatCount="3"
android:fillAfter="true"

1 透明动画
1.1 在xml文件中写动画

<!--需要说明的有两个参数
 fromAlpha,toAlpha,分别代表开始的透明度和结束的透明度,大小从0到1
在xml中浮点型不用加f
-->
<alpha
android:fromAlpha="1"
android:toAlpha="0"
android:duration="2000"
android:repeatMode="restart"
android:repeatCount="3"
android:fillAfter="true"/>

1.2 执行动画

//用AnimationUtils工具类把动画加载进行,传入两个参数,一个上下文,一个动画资源的id
AlphaAnimation animation=AnimationUtils.loadAnimation(this,R.anim.animation);
//执行动画
imageView.startAnimation(animationSet);

2 缩放动画
Android补间动画,庆父不死。2.1 创建动画

 <!--
    fromXScale:开始时长度的大小,参数代表这个长度和view自身长度的比例,即这个长度是view自身长度的几倍
    toXScale:结束是长度的大小
    fromYScale:开始时宽度的大小
    toYScale:结束是宽度的大小
    pivotX:旋转中心点横坐标,可以传入三种类型的参数,
    50%,代表横坐标view自身的长度的50%
    50%p,代表横坐标是父元素控件的50%
    50,代表横坐标就是50。
    坐标原点是view的左上角坐标
    pivotY:旋转中心点纵坐标
    同pivotX
    -->
    <scale
        android:fromXScale="1"
        android:toXScale="2"
        android:fromYScale="1"
        android:toYScale="2"
        android:pivotX="50%"
        android:pivotY="50%"/>

2.2 执行动画
加载动画,执行动画
3 旋转动画
3.1 创建动画

 <!--
    fromDegrees:开始角度
    toDegrees:结束角度
    pivotX,pivotY:设置旋转中心点,和scale中的一样
    -->
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"/>

3.2 执行动画
加载动画,并执行动画
4 位移动画
4.1 创建动画

 <!--
    fromXDelta:动画开始时view左上角x坐标的位置
    toXDelta:动画结束时view左上角x坐标的位置
    fromYDelta:动画开始时view左上角坐标的位置
    toYDelta:动画结束时view左上角y坐标的位置
    这四个参数都可以传入
    50%,代表横坐标view自身的长度的50%
    50%p,代表横坐标是父元素控件的50%
    50,代表横坐标就是50。
    坐标原点是原始view的左上角坐标
    -->
    <translate
        android:fromXDelta="0"
        android:toXDelta="0"
        android:fromYDelta="0"
        android:toYDelta="50%"/>

4.2 执行动画
加载动画,执行动画

①什么是UIView block关键帧动画?
二 用xml的方式定义补间动画

用代码定义的动画都可以用xml的方式实现
首先在res目录下建立一个anim目录
再在anim目录下建立一个动画文件,在此动画文件中开始写xml

②如何使用UIView block关键帧动画?

我们只需要在UIView block关键帧动画的animationsblock里直接增加关键帧就可以了,再在增加关键帧方法的animationsblock里把可动画属性改变为目标值就可以了。

一 用代码的方式写补间动画
  • 在实际开发中我们用的最多的还是view,而不是layer,所以更多情况下如果我们要做动画的话,用的还是UIView block动画,而不是layer的隐式动画和显示动画;
  • 这里总结一下,可以方便我们在后面两篇学习layer的隐式动画和显式动画时作对比,以期加深对动画的理解。

android中补间动画分为透明动画,旋转动画,缩放动画和位移移动,动画可以作用在所有的view上,动画可以单独使用,也可以多个动画一起使用。

(3)UIView block过渡动画
单独使用动画

1 AlphaAnimation
AlphaAnimation是透明动画,可以改变view的透明度
1.1 创建动画

//创建动画,并设置起止透明度,传入的数据是浮点型,需要加f
//参数范围从0到1,0表示完全透明,1表示完全不透明
//第一个参数为开始的时候的透明度,第二个参数为结束的时候的透明度
AlphaAnimation alphaAnimation=new AlphaAnimation(1.0f,0);
alphaAnimation.setDuration(2000);
alphaAnimation.setRepeatCount(3);
alphaAnimation.setRepeatMode(Animation.REVERSE);

1.2 执行动画
首先找到需要执行动画的view,然后调用startAnimation方法,并传入需要执行的动画

imageView.startAnimation(alphaAnimation);

2 ScaleAnimation
缩放动画,控制view的缩放
2.1 创建动画

 /*传入8个参数
前4个参数分别为:
开始长度的缩放比例,终止长度的缩放比例,其实宽度的缩放比例,终止宽度的缩放比例
这四个参数都是浮点型的,代表和原view相比放大或者缩小的比例,1.0代表不变,2.0代表放大到原来的2被,0.5则代表缩小到原来的0.5倍
后四个参数设置缩放的中心点。分别为:
x轴的模式,x轴中心点的位置,y轴的模式,y轴中心点的位置
模式有三种
Animation.RELATIVE_TO_SELF:相对于自己
Animation.RELATIVE_TO_PARENT:相对于父元素
Animation.ABSOLUTE:绝对距离
如果是前两种模式,后面传入的参数代表时父元素或者自己的几倍
例如下面这种写法,代表相对于自己,大小是自己长宽的0.5倍,那么中心点x轴坐标就在空间长度一半的位置
y轴坐标也在控件一半的位置,(android动画中坐标原点都在执行该动画的view的左上角),那个中心点就是该元素的中心。
相对于父元素的也是如此,这两种x,y的坐标是相对的view乘以相应的比例得到的
如果是第三种模式,那个传入的参数谁也不相对,传入的参数是多少,坐标就是多少,坐标原点永远是view的左上角
*/
ScaleAnimation scaleAnimation=new ScaleAnimation(1.0f,2.0f,1.0f,2.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);

可以再设置一些其他需要的参数
2.2 执行动画
执行动画都是一样的操作
3 RotateAnimation
旋转动画,控制view的旋转操作
3.1 创建动画

/*
传入6个参数,前2个参数是开始时旋转的角度,和结束时旋转的角度
正数代表顺时针,负数代表逆时针
后四个参数为设置旋转的中心点,和ScaleAnimation设置中心点一致
*/
RotateAnimation rotateAnimation=new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);

可以设置一些其他的参数
3.2 执行动画
执行动画都是一样的
4 TranslateAnimation
位移动画,控制view的移动
4.1 创建动画

/*
传入8个参数
一共四组,分别为
起始时view的左上角x轴坐标
结束时view的左上角x坐标
起始时view的左上角y坐标
结束时view的左上角y坐标
view左上角坐标默认为(0,0)
每一组是一个模式加一个值组成的,模式和值进行计算得出实际的坐标值
有关模式的可以看ScaleAnimation中的讲解
 */
TranslateAnimation translateAnimation=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0.5f);

可以设置一些其他的参数
4.2 执行动画

1、UIView block动画的定义、本质及能做什么动画
动画合集

5 AnimationSet
动画的合集,使用它可以控制前面列出的四种动画中的一种或者多种一起执行
5.1 创建AnimationSet

//传入一个boolean类型的参数,这个参数控制的是动画执行时是匀速执行还是不匀速执行
//这个参数不好用,直接都传入true,让他匀速执行就可以
 AnimationSet animationSet=new AnimationSet(true);

5.2 将动画加入到AnimationSet中

animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(rotateAnimation);

5.3 可以设置一些参数,如果在set中设置参数,就会对set中所有的动画起作用,每个动画自己设置的参数只对自己起作用

animationSet.setDuration(2000);

5.4 执行动画

imageView.startAnimation(animationSet);
(3)UIView block过渡动画
所有动画的公共属性

这里列出所有动画都有的方法,包括四种动画以及AnimationSet,这些动画的合集

//设置动画的持续时间
alphaAnimation.setDuration(2000);
 //设置动画播放完毕后是否保持在动画播放完毕的状态
alphaAnimation.setFillAfter(true);
/*
设置动画的重复次数,这里的重复次数指的是动画第一次播放完毕后还会重复播放几次,这里设置为3,就是动画一共播放四次,开始执行一次动画,然后再重复执行三次。
 */
alphaAnimation.setRepeatCount(3);
/*
设置动画重复的模式
有Animation.RESTART:在动画多次播放时每一次都和第一次一样,重复执行
 Animation.REVERSE:每一次执行动画是,和上一次执行相反的操作
例如动画是把view放大到原来的两倍,动画一共执行4次
如果是Animation.RESTART,就会每次都从view本身的大小变到2倍的大小,这一过程一共执行4次
如果是Animation.REVERSE,则第一回从本身大小到2倍,第二回从2倍到本身大小,第三回从2倍到view本身第四回再从view本身到2倍
*/
 alphaAnimation.setRepeatMode(Animation.REVERSE);

用透明动画举例

①什么是UIView block过渡动画?

前面我们学习了UIView block基础动画和UIView block关键帧动画,但我们知道它俩其实都是UIView block属性动画,即只能用来对view的可动画属性做动画。那么如果我们现在想要对view的非动画属性改变时(如label的文本,imageView的图片等)做动画,甚至是对view的某些行为(如view的添加和移除,两个view之间切换)做动画,那就只能使用过渡动画了。

同时我们也可以看到,上面UIView block基础动画和UIView block关键帧动画的某些方法里也提供了过渡效果那个配置,也就是说过渡动画也是可以作用于可动画属性的,但是还可以做可动画属性之外的很多效果。

过渡动画的过渡效果可参见UIView block基础动画的过渡效果,是一模一样的。

  • 给单个视图的不可动画属性或视图行为添加过渡动画
[UIView transitionWithView:// 要做动画的视图
                  duration:// 动画时长
                   options:// 过渡动画效果
                animations:^{

                    // 要改变的不可动画属性或图层行为
                } completion:^(BOOL finished) {

                    // 动画完成的回调
                }];
  • 给两个视图切换时添加过渡动画

注意:

  • 这个方法的过渡效果是体现在fromView和toView的父视图上的
  • 这个方法不需要提前把fromView和toView都添在父视图上,只需要先添加fromView就可以了
  • 这个方法在动画过程中,会自动把fromView会从父视图中移除,并把toView添加到父视图上
[UIView transitionFromView:// 旧视图
                    toView:// 新视图
                  duration:// 动画时长
                   options:// 动画过渡效果
                completion:^(BOOL finished) {

                    // 动画完成时的回调
                }];
②如何使用UIView block关键帧动画?

一、UIView可动画属性列表

②如何使用UIView block基础动画?

我们只需要在UIView block基础动画的animationsblock里直接把可动画属性改变为目标值就可以了。

1、UIView block动画的定义、本质及能做什么动画
  • 定义:UIView block动画就是用来在view层做动画的一种动画机制

  • 本质:UIView block动画的本质就是对layer的隐式动画或显式动画做了一层封装,提供简洁的Api,方便我们开发者使用。具体来说UIView block基础动画是对layer的隐式动画做了封装(因为它们同样可以设置过渡效果/图层行为,显示动画的基础动画不能设置图层行为,当然显式动画的过渡动画也可以作用于可动画属性,但是后面讲到隐式动画应该会知道UIView block基础动画是对layer的隐式动画做了封装),UIView block关键帧动画是对layer的显示动画的关键帧动画做了封装,UIView block过渡动画是对layer的显示动画的过渡动画做了封装。

  • 能做什么动画:

    • 下面我们会提到UIView block动画可分为UIView block属性动画和UIView block过渡动画,而UIView block属性动画又可分为UIView block基础动画和UIView block关键帧动画。

    • UIView block属性动画能做什么动画:那么从UIView的可动画属性列表我们可以看出,UIView block属性动画可以用来对view做背景色变化的动画、view显隐性变化的动画以及view的平移、缩放和旋转的仿射变换动画三种场景下的动画,其中执行一次UIView block基础动画只能改变一个属性值一次,执行一次UIView block关键帧动画可以设置多个关键帧所以能改变一个属性值多次

    • UIView block过渡动画能做什么动画:UIView block属性动画只能对UIView的可动画属性做动画,但是如果我们现在想要对view的非动画属性改变时(如label的文本,imageView的图片等)做动画,甚至是对view的某些行为(如view的添加和移除,两个view之间切换)做动画,那就只能使用过渡动画了。

  • 就此我们也就知道了为什么要引入UIView block动画:
    • 第一、当然就是UIView block动画是作用于view层,对layer的隐式动画或显式动画做了一层封装,提供简洁的Api,方便我们开发者使用;
    • 第二、UIView block属性动画可以帮助我们在改变view的可动画属性时能做动画效果。如果看到后面一篇隐式动画,我们会知道在改变layer的可动画属性时,即便我们什么都不做直接修改layer的属性值,这个改变的过程也会默认有一个动画,它就是隐式动画;但是当我们在改变view的可动画属性时,是没有隐式动画的,如果我们什么都不做,属性就会直接跳变到新值,所以为了达到改变view的属性时能有动画,我们就得使用UIView block动画来实现了。
    • 第三、UIView block过渡动画可以帮助我们在改变view的不可变属性或者对view做某些行为能做动画。

本文由必赢棋牌发布于动漫中心,转载请注明出处:Android补间动画,庆父不死

关键词: 必赢棋牌