热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

解析Android中Animation动画的编写要点

这篇文章主要介绍了Android中Animation动画的编写要点,讲解了Animation的几个常用标签的用法,需要的朋友可以参考下

在API Demo的View->Animation下可以找到四个Animation的Demo,第一个3D Translate比较复杂,最后再讲,先讲第2个Interpolator。该Activity对应的是view包内的Animation3.java,和layout的animation_3.xml。

界面的布局不加解释了,就一个Spinner和一个TextView。不是本文内容。

主要解释下几个重点语句。

初始化Animation,从类的名字可以看出是一个变换View的位置的动画,参数起点横坐标,终点横坐标,起点纵坐标,终点纵坐标。

Animation a = new TranslateAnimation(0.0f, 
        targetParent.getWidth() - target.getWidth() - targetParent.getPaddingLeft() - 
        targetParent.getPaddingRight(), 0.0f, 0.0f); 

 

下面是动画的参数设置,我加上了注释

a.setDuration(1000);//设置动画所用的时间 
    a.setStartOffset(300);//设置动画启动的延时 
    //设置重复模式,RESTART为结束后重新开始,REVERSE为按原来的轨迹逆向返回 
    a.setRepeatMode(Animation.RESTART); 
    //设置重复次数,INFINITE为无限 
    a.setRepeatCount(Animation.INFINITE); 
    //根据用户在Spinner的选择设置target的进入的方式 
    switch (position) { 
      case 0: 
        //加速进入 
        a.setInterpolator(AnimationUtils.loadInterpolator(this.R.anim.accelerate_interpolator)); 
        break; 
      case 1: 
        //减速进入 
        a.setInterpolator(AnimationUtils.loadInterpolator(this, 
            android.R.anim.decelerate_interpolator)); 
        break; 
      case 2: 
        //加速进入.与第一个的区别为当repeatMode为reverse时,仍为加速返回原点 
        a.setInterpolator(AnimationUtils.loadInterpolator(this, 
            android.R.anim.accelerate_decelerate_interpolator)); 
        break; 
      case 3: 
        //先往后退一点再加速前进 
        a.setInterpolator(AnimationUtils.loadInterpolator(this, 
            android.R.anim.anticipate_interpolator)); 
        break; 
      case 4: 
        //减速前进,冲过终点前再后退 
        a.setInterpolator(AnimationUtils.loadInterpolator(this, 
            android.R.anim.overshoot_interpolator)); 
        break; 
      case 5: 
        //case 3,4的结合体 
        a.setInterpolator(AnimationUtils.loadInterpolator(this, 
            android.R.anim.anticipate_overshoot_interpolator)); 
        break; 
      case 6: 
        //停止前来回振几下 
        a.setInterpolator(AnimationUtils.loadInterpolator(this, 
            android.R.anim.bounce_interpolator)); 
        break; 
    } 
    //让target开始执行这个动画 
    target.startAnimation(a); 
  } 

这里使用的是Android已预设的一些动作,我们也可以自定义XML来实现更好看的动画效果的,这个下一篇再讲。

除了TranslationAnimation,还有AlphaAnimation、RotateAnimation、ScaleAnimation,使用这几个基体动作的组合,可以形成一系列复杂的动画效果。具体用法请查看SDK。

整个都比较简单,就一个函数的调用,还不懂的看一下API的注释和SDK文档,没什么难理解的。

现在开始看第三个Push,从View->animation->Push可以启动这个Activity

Push这个Demo主要是展示了View之间的切换效果。

Push对应的Java文件为view包内的Animation2.java,对应的XML布局文件为layout/animation_2.xml。

先看布局文件,这个页面内最主要用到的是一个ViewFlipper。使用ViewFlipper可以实现多个View之间的动态切换,并且可以自定义切换动画,本例中所展示的就是如何定义切换动画。

下面只挑重点语句来讲了。

让ViewFlipper开始自动切换。

mFlipper.startFlipping(); 

 

当点击时Spinner内的选项时,更改进入和退出的动画效果。

public void onItemSelected(AdapterView parent, View v, int position, long id) { 
    switch (position) { 
    case 0: 
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, 
          R.anim.push_up_in)); 
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
          R.anim.push_up_out)); 
      break; 
    case 1: 
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, 
          R.anim.push_left_in)); 
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
          R.anim.push_left_out)); 
      break; 
    case 2: 
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(this.R.anim.fade_in)); 
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
          android.R.anim.fade_out)); 
      break; 
    default: 
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, 
          R.anim.hyperspace_in)); 
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
          R.anim.hyperspace_out)); 
      break; 
    } 
  } 

这里的Animation都是自定义的动画效果,可以在res/anim内找到对应的XML文件,下面用push_up_in.xml来说明定义的大概用法。

因为这个动画是由几个动画复合组成的,所以外围就用一个set标签括起来,组成一个AnimationSet。

translate标签内主要定义位置的变化情况,fromYDelta="100%p",是指从ViewFlipper的正下方刚好一个View的高度的距离的地方开始出现,100%p是一个相对值,大于0为下方,小于0为上方。toYDelta="0",是指刚好达到布局文件的原始位置停止。android:duration="300",是指整个动作的时间用时为300毫秒,系统会根据这个时间自动调整速度。

alpha标签内定义的是透明度,0为全透明,1.0为不透明,过程为300毫秒,让View为逐渐出现的过程

 
   
   
 

push_up_out.xml,和push_left的两个标签都几乎一样的,应该很好理解。

hyperspace_in.xml更简单,只有一个alpha,所以外层没有set标签。startOffset是设置延迟。

hyperspace_out.xml相对复杂一点,set里面还包括有set,但仍然是由几个小动作一起组成的,可以一点点拆成来理解。

最外层是一个set,里面嵌套一个scale和一个set。

第一个scale标签可以理解为,以当前View的正中间位置为轴点,在700毫秒时间内,以加速放大的方式,将View的横长变为1.4倍,高度变为0.6倍。至于fillAfter这个标签我一直搞不懂这个功能,照SDK里的解释,是在连续动画中让View保持在动画的最后一帧,但照我的实验似乎没有什么效果,这个求高手指教。(查网上一些资料是说必须在代码里设置,这个是不是属于Android的Bug?)一个animationSet可以做为另一个animationSet的子集,这个很容易理解。rotate标签内的照字面意思应该很容易理解了,不再赘述了。

 
   
   
     
     
     
     
   
 

很多动画其实都是通过alpha, scale, rotate, translate这几个基本动作组成的。这些都属于Tween Animation。另外还有一种Frame Animation,类似放电影的效果,一帧帧播放动画,以后再说。

所有在XML内的设置的属性都可以在JAVA里找到对应的API函数,在Android SDK文档里可以查得到。

其实我觉得我这样写得都有点啰嗦了,Android的API的名字定义都很规范,从名字都已经可以判断出这个函数的功能了。

3D Transition的主要定义在animation包内,里面只有两个Java文件。

3D翻转其实并不是很复杂,最主要的是一个函数rotation.setAnimationListener(new DisplayNextView(position));在Transition3d的第99行。这个函数的主要作用是通过一个Listener,设置动画开始前、结束后,和重复动作时要触发的事件。

3D翻转效果主要由两个rotato动作构成,第二个动作在第一个动作完成后,由Listener来启动。这两个Animation连起来,看的时候就像3D旋转的效果了。

同时,在Rotate3dAnimation.java中,重新定义了一个Animation,覆写了initialize和applyTransformation方法。initialize是初始化动作,applyTransformation就定义动画效果的,这个是最主要的部分,传进来的是当前时间为总时间的百分比和动作,这里利用了转换矩阵。发现我的线性代数都忘了T_T,以后要重新看一遍。主要这个Camara不太理解,注释里也没写有这个类有什么用,从代码里猜测这个是保存当前的界面。

这样说来是简单,但做起来难啊。。


推荐阅读
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 本教程旨在指导开发者如何在Android应用中通过ViewPager组件实现图片轮播功能,适用于初学者和有一定经验的开发者,帮助提升应用的视觉吸引力。 ... [详细]
  • 在Android应用开发中,当在MenuItem中通过app:actionLayout属性使用Switch控件时,可能会遇到空指针异常的问题。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 解决 Pytest 运行时出现 FileNotFoundError 的方法
    在使用 Pytest 进行测试时,可能会遇到 FileNotFoundError 错误,提示无法找到指定的文件或目录。本文将探讨该错误的原因及解决方案。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • SpringBoot新手入门指南
    本文旨在为初次接触SpringBoot的开发者提供一份详细的入门指导,包括如何快速搭建并运行一个简单的SpringBoot应用。通过本文,读者将了解Maven项目的构建、必要的配置文件设置以及基本的应用开发流程。 ... [详细]
  • 本视频详细介绍了如何利用J2EE、JBPM 3.x/4.3、Flex流程设计器、jQuery以及授权认证机制构建高效的企业普及版贝斯OA及工作流管理系统。 ... [详细]
  • BL550721、特点液晶驱动输出:Common输出4线,Segment输出36线内置显示寄存器364144bit2线串行接口(SCL,SDA)内置震荡电路内置液晶驱动电源电路13 ... [详细]
  • 本文介绍了如何在Windows操作系统中安装FFTW库,并详细说明了使用Visual Studio 2010进行4096点快速傅里叶变换(FFT)的步骤。包括下载预编译文件、生成库文件以及配置环境等关键环节。 ... [详细]
  • javascript——对象的概念——函数 1 (函数对象的属性和方法)
    一、创建函数函数是一种对象:Function类是对象,可以通过Function实例化一个函数,不过最多的还是利用function来创建函数。方式一:利用Function类来实例化函 ... [详细]
  • 在开发H5页面时,为了减少资源请求和简化工作流程,直接使用SVG和CSS3来创建简单的图形元素是一个高效的选择。本文将探讨如何不依赖于第三方图标库,仅通过HTML和CSS技术实现一个‘返回顶部’的图标。 ... [详细]
  • IEC60825激光产品安全标准详解
    随着激光技术在全球范围内的广泛应用,尤其是激光投影显示技术的兴起,了解和遵守相关的安全标准变得尤为重要。本文将详细介绍IEC60825激光产品安全标准及其重要性。 ... [详细]
  • Mysqlcheck作为MySQL提供的一个实用工具,主要用于数据库表的维护工作,包括检查、分析、修复及优化等操作。本文将详细介绍如何使用Mysqlcheck工具,并提供一些实践建议。 ... [详细]
  • LIN总线技术详解
    LIN(Local Interconnect Network)总线是一种基于UART/SCI(通用异步收发器/串行接口)的低成本串行通信协议,主要用于汽车车身网络中智能传感器和执行器之间的通信。 ... [详细]
author-avatar
hypothesis82235
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有