热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android动画简介与类型分析

本文介绍了Android动画的基本概念及其主要类型。Android动画主要包括三种形式:视图动画(也称为补间动画或Tween动画),主要通过改变视图的属性来实现动态效果;帧动画,通过顺序播放一系列预定义的图像来模拟动画效果;以及属性动画,通过对对象的属性进行平滑过渡来创建更加复杂的动画效果。每种类型的动画都有其独特的应用场景和实现方式,开发者可以根据具体需求选择合适的动画类型。

 


1.概述

1.1 定义

       

1.2 分类

     Android动画有如下三种:

1.视图动画(View动画),也叫补间动画和Tween动画

主要通过指定View位置、角度、尺寸、透明度、变化时间和方式等属性的变化,进行图形变化,从而达到动画效果。其主要效果有如下:

Translate(平移)

Scale(缩放动画)

Rotate(旋转)

Alpha(透明度)

注意:View的属性并没有改变

2.逐帧动画(Frame Animation)通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果。
3.属性动画(Property Animation)

通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,常用的Java类包括:

ValueAnimator

ObjectAnimator

AnimatorSet

注意:View的属性是真正的改变了

 



2.视图动画

2.1 概述

       视图动画(View Animation)是通过对View中的内容进行一系列图形变换来实现动画效果,其中图形变换包括平移、缩放、旋转、改变透明度等。

       视图动画可以通过XML文件来定义,也可以通过代码方式来实现。通常以XML文件形式的动画都会放置在自定义res/anim文件夹下。

2.2 包的定义

        包为:android.view.animation 

        抽象类:其中有一个抽象类为Animation,其实现子类就是如2.3所示

2.3 分类

        视图动画有5种补间动画,如下所示:

AlphaAnimation(透明度动画)
RotateAnimation(旋转动画)
ScaleAnimation(缩放动画)
TranslateAnimation(平移动画)
AnimationSet(集合动画)

2.3.1 AlphaAnimation

    1)概述

    AlphaAnimation(透明度渐变动画)是通过改变View组件透明度来实现渐变效果。主要通过为动画指定开始时的透明度、结束时的透明度和动画持续的时间来创建动画。

    2)常用属性

interpolator

用于控制动画的变化速度,一般值为:

@android:anim/linear_interpolator(匀速改变)

@android:anim/accelerate_interpolator(开始慢,后面加速)

repeatMode

用于制定动画重复的方式,可选值如下:

reverse(反向)

restart(重新开始)

repeatCount用于指定动画重复次数,属性值可以是正整数,也可以为infinite(无限循环)
duration用于指定动画播放时长
fromAlpha用于指定动画开始时的透明度,0.0为完全透明,1.0为不透明
toAlpha用于指定动画结束时的透明度,0.0为完全透明,1.0为不透明

    3)示例

         在XML文件中定义透明度渐变动画,如下所示:定义了一个让View从完全不透明到透明,持续时间为1s的动画

        aplha_animation.xml



2.3.2 RotateAnimation

     1)概述

     旋转动画就是通过为动画指定开始时的旋转角度、结束时的旋转角度和动画时长。

     2)常用属性

fromDegress指定动画开始时的角度
toDegreaa指定动画结束时的角度
pivotX指定轴心的x坐标
piotY指定轴心的y坐标

     3)示例



2.3.3 ScaleAnimation

     1)概述

     旋转动画就是通过为动画指定开始时的旋转角度、结束时的旋转角度和动画时长。

     2)常用属性

fromXScale指定动画开始时X轴上的缩放系数,值为1.0表示不变化
fromYScale指定动画开始时Y轴上的缩放系数,值为1.0表示不变化
toXScale指定动画结束时X轴上的缩放系数,值为1.0表示不变化
toYScale指定动画结束时Y轴上的缩放系数,值为1.0表示不变化

     3)示例



2.3.4 TranslateAnimation

     1)概述

     平移动画就是通过为动画指定开始位置、结束位置和动画时长。

     2)常用属性

fromXDelta指定动画开始时View的X轴坐标
fromYDelta指定动画开始时View的Y轴坐标
toXDelta 指定动画结束时View的X轴坐标
toYDelta指定动画结束时View的Y轴坐标

     3)示例



2.3.5 AnimationSet

      1)概述

         AnimationSet(集合动画)就是包含两种及两种以上的动画的集合。

      2)常用属性

      3)实例

        如下创建了一个包含旋转动画和平移动画的集合动画:


2.4 创建动画示例

XML文件方式

在XML文件中定义指定动画样式,然后在代码中:

//创建动画实例,通过AnimationUtils加载资源

Animation animation = AnimationUtils.loadAnimation(Context context, int id);

//为view设置并start动画

view.startAnimation(animation);

动态代码方式

通过创建指定动画类型XXXAnimation实例对象,设置属性,然后startAnimation,如下所示:

AlphaAniamtion alphaAnimtion = new AlphaAnimation(....);

alphaAnimation.setXXX(...);

view.startAnimation(alphaAnimation);

 

2.4.1 用XML方式创建动画

        xml配置文件如上2.3所示,布局如下:




       Activity如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btnOne;private Button btnTwo;private Button btnThree;private Button btnFour;private Button btnFive;private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnOne= findViewById(R.id.btn_one);btnTwo = findViewById(R.id.btn_two);btnThree = findViewById(R.id.btn_three);btnFour = findViewById(R.id.btn_four);btnFive = findViewById(R.id.btn_five);imageView = findViewById(R.id.iv);btnOne.setOnClickListener(this);btnTwo.setOnClickListener(this);btnThree.setOnClickListener(this);btnFour.setOnClickListener(this);btnFive.setOnClickListener(this);}public void onClick(View view) {switch (view.getId()){case R.id.btn_one:Animation alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha_animation);imageView.startAnimation(alphaAnimation);break;case R.id.btn_two:Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_animation);imageView.startAnimation(rotateAnimation);break;case R.id.btn_three:Animation scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_animation);imageView.startAnimation(scaleAnimation);break;case R.id.btn_four:Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_animation);imageView.startAnimation(translateAnimation);break;case R.id.btn_five:Animation setAnimation = AnimationUtils.loadAnimation(this, R.anim.set_animation);imageView.startAnimation(setAnimation);break;}}}

       效果图如下:

2.4.2 用代码方式创建动画

        在代码中定义动画,需要使用到Animation的实现子类,如AlphaAnimation, ScaleAnimation, TranslateAnimation, RotateAnimation,创建其对象,然后设置其属性,最后使得View控件startAnimation(Animation animation),传入实例对象进去即可。如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = findViewById(R.id.iv);//创建一个渐变透明度的动画,从透明到完全不透明AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);//设置动画时长alphaAnimation.setDuration(5000);//设置动画重复方式alphaAnimation.setRepeatMode(AlphaAnimation.REVERSE);//设置动画播放次数alphaAnimation.setRepeatCount(AlphaAnimation.INFINITE);//为View开启指定类型动画imageView.startAnimation(alphaAnimation);}
}

 



3.逐帧动画

3.1 原理

      逐帧动画(Frame Animation)是按照事先准备好的静态图像顺序播放的,跟看胶片电影一样,利用人眼的“视觉暂留”原理,给用户造成动画的错觉。

      使用逐帧动画需要使用AnimationDrawable类,它位于"android.graphics.drawable.AnimationDrawable"包下,是Drawable的间接子类。它主要用来创建一个逐帧动画,并且可以对帧进行拉伸,把它设置为View的背景即可使用AnimationDrawable.start()方法播放。

      AnimationDrawable常用方法如下:

void start()开始播放逐帧动画
void stio()停止播放逐帧动画
void addFrame(Drawable frame,int duration)为AnimationDrawable添加一帧,并设置持续时间。
int getDuration(int i)得到指定index的帧的持续时间
Drawable getFrame(int index)得到指定index的帧Drawable
int getNumberOfFrames()得到当前AnimationDrawable的所有帧数量
boolean isOneShot()得到当前帧动画是否只播放一次,true表示一次,false表示循环播放
boolean isRunning()得到当前帧动画是否正在播放
void setOneShot(boolean oneShot)设置当前帧动画是否只播放一次,true表示一次,false表示循环播放

3.2 创建方式

通过XML文件方式

在res/drawable目录下创建好帧动画的XML文件,并在节点的字节点中,

指定图片帧出现的顺序和每帧持续的时间,然后在布局文件中引入,最后在代码中使用

view.getBackground()获取AnimationDrawable实例对象,通过此实例对象可以start()和stop()动画。

通过动态代码方式

创建AnimationDrawable实例对象,然后view.setBackground(实例对象),为实例对象设置addFrame(

Drawable frame, int duration)和属性,最后start()即可。

3.3 案例

      运行效果如下:点击start按钮后,图片按照指定时间一张张切换播放显示:

3.3.1 通过XML文件方式

     1)定义xml文件:frame.xml


    2)创建布局



     3)处理代码

public class FrameActivity extends AppCompatActivity{private ImageView imageView;private Button btnStart;private AnimationDrawable animationDrawable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_frame);imageView = findViewById(R.id.iv);btnStart = findViewById(R.id.btn_start);//获取AnimationDrawable对象animatiOnDrawable= (AnimationDrawable) imageView.getBackground();btnStart.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//判断动画是否在播放if (animationDrawable.isRunning()){//动画在播放,则暂停animationDrawable.stop();}else{//动画没有在播放,则进行播放animationDrawable.start();}}});}
}

3.3.2 通过动态代码方式

public class FrameActivity extends AppCompatActivity{private ImageView imageView;// private Button btnStart;private AnimationDrawable animationDrawable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_frame);imageView = findViewById(R.id.image_view);//获取AnimationDrawable对象animatiOnDrawable= new AnimationDrawable();//为AnimationDrawable添加帧,并指定图片和时长animationDrawable.addFrame(getResources().getDrawable(R.drawable.timg), 1000);animationDrawable.addFrame(getResources().getDrawable(R.drawable.timg1), 1000);animationDrawable.addFrame(getResources().getDrawable(R.drawable.timg2), 1000);animationDrawable.addFrame(getResources().getDrawable(R.drawable.timg3), 1000);//循环播放animationDrawable.setOneShot(false);imageView.setBackground(animationDrawable);//播放Frame帧动画animationDrawable.start();}
}

 



4.属性动画

4.1 背景

     属性动画是在Android3.0(API 11)后出现的一种新的动画模式。视图动画和逐帧动画存在一定的去缺点如下:

1.作用对象局限于继承自View的组件,无法对非View的对象进行动画操作。
2.没有改变View的属性,只是改变其视觉效果
3.动画效果单一

  4.2 概述

1.属性动画作用对象为任意Java对象,不再仅限于View对象;2.可以自定义各种动画效果,不再仅限于4种基本变换:平移、旋转、缩放和透明度。

4.3 工作原理

      从上面工作原理可以看出,属性动画有两个非常重要的类:ValueAnimator和ObjectAnimator。属性动画的使用基本都是依靠者两个类。

4.4 ValueAnimator

4.4.1 定义

      ValueAnimator类属性动画机制中最核心的一个类,通过不断控制 值 的变化,再不断 手动 赋给对象的属性,从而实现动画效果

4.4.2 方法

      ValueAnimator类有3个重要的方法如下所示:

ValueAnimator.ofInt(int... values)将初始值以整形数值的形式过度到结束值,即估值器是整形估值器(IntEvaluator)
ValueAnimator.ofFloat(float... values)将初始值以浮点型数值的形式过渡到结束值
ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values)将初始值以对象的形式过渡到结束值

 


 

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
author-avatar
xiaozhao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有