补间动画 http://www.sunnyos.com/

来源:互联网 发布:动漫桌面主题下载软件 编辑:程序博客网 时间:2024/06/06 13:07

目录(?)[+]

补间动画(Tween Animation)

补间动画与逐帧动画在本质上是不同的,逐帧动画通过连续播放图片来模拟动画的效果,而补间动画则是通过在两个关键帧之间补充渐变的动画效果来实现的。补间动画的优点是可以节省空间。目前Android应用框架支持的补间动画效果有以下5种。具体实现在android.view.animation类库中。

AlphaAnimation:透明度(alpha)渐变效果,对应<alpha/>标签。

TranslateAnimation:位移渐变,需要指定移动点的开始和结束坐标,对应<translate/>标签。

ScaleAnimation:缩放渐变,可以指定缩放的参考点,对应<scale/>标签。

RotateAnimation:旋转渐变,可以指定旋转的参考点,对应<rotate/>标签。

AnimationSet:组合渐变,支持组合多种渐变效果,对应<set/>标签。

补间动画的效果同样可以使用XML语言来定义,这些动画模板文件通常会被放在Android项目的res/anim/目录下。

下面是具体实现源码:

MainActivity.java封装实现的方法:

[java] view plain copy
  1. package com.example.lesson19_tween;  
  2.   
  3. import com.example.lesson19_tween.R;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.view.Menu;  
  8. import android.view.View;  
  9. import android.view.animation.Animation;  
  10. import android.view.animation.AnimationUtils;  
  11. import android.view.animation.ScaleAnimation;  
  12. import android.view.animation.TranslateAnimation;  
  13. import android.widget.ImageView;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     private ImageView imageView;  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.   
  24.         imageView = (ImageView) findViewById(R.id.imageView1);  
  25.     }  
  26.   
  27.     @Override  
  28.     public boolean onCreateOptionsMenu(Menu menu) {  
  29.         // Inflate the menu; this adds items to the action bar if it is present.  
  30.         getMenuInflater().inflate(R.menu.main, menu);  
  31.         return true;  
  32.     }  
  33.   
  34.     // 透明动画  
  35.     public void alphaImpl(View v) {  
  36.   
  37.         Animation animation = AnimationUtils.loadAnimation(this,  
  38.                 R.anim.alpha_demo);  
  39.         imageView.startAnimation(animation);  
  40.     }  
  41.   
  42.     // 旋转动画  
  43.     public void rotateImpl(View v) {  
  44.         Animation animation = AnimationUtils.loadAnimation(this,  
  45.                 R.anim.rotate_demo);  
  46.         imageView.startAnimation(animation);  
  47.     }  
  48.   
  49.     // 缩放动画  
  50.     public void scaleImpl(View v) {  
  51.         Animation animation = AnimationUtils.loadAnimation(this,  
  52.                 R.anim.scale_demo);  
  53.         imageView.startAnimation(animation);  
  54.     }  
  55.   
  56.     // 移动效果  
  57.     public void translateImpl(View v) {  
  58.         // XML文件  
  59.         Animation animation = AnimationUtils.loadAnimation(this,  
  60.                 R.anim.translate_demo);  
  61.   
  62.         animation.setRepeatCount(Animation.INFINITE);//循环显示  
  63.         imageView.startAnimation(animation);  
  64.   
  65.         /* 
  66.          * 第一种 imageView.setAnimation(animation); animation.start(); 
  67.          */  
  68.         // 第二种  
  69.   
  70.         // Java代码  
  71.         /* 
  72.          * TranslateAnimation translateAnimation = new TranslateAnimation(0, 
  73.          * 200, 0, 0); translateAnimation.setDuration(2000); 
  74.          * imageView.startAnimation(translateAnimation); 
  75.          */  
  76.     }  
  77.   
  78.     // 综合实现set_demo.xml中的动画  
  79.     public void setAll(View v) {  
  80.         Animation animation = AnimationUtils.loadAnimation(this,  
  81.                 R.anim.set_demo);  
  82.         imageView.startAnimation(animation);  
  83.     }  
  84.       
  85. }  

alpha_demo.xml

[html] view plain copy
  1. <alpha xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
  3.     android:fromAlpha="1.0"  
  4.     android:toAlpha="0.1"  
  5.     android:duration="2000"/>  
  6.  <!--   
  7.  fromAlpha :起始透明度  
  8.  toAlpha:结束透明度  
  9.  1.0表示完全不透明  
  10.  0.0表示完全透明  
  11.   -->  

rotate_demo.xml

[html] view plain copy
  1. <rotate xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
  3.     android:fromDegrees="0"  
  4.     android:toDegrees="360"  
  5.     android:duration="1000"  
  6.     android:repeatCount="1"  
  7.     android:repeatMode="reverse"/>  
  8. <!--   
  9. fromDegrees:表示旋转的起始角度  
  10. toDegrees:表示旋转的结束角度  
  11. repeatCount:旋转的次数  默认值是0 代表旋转1次  如果值是repeatCount=4 旋转5次,值为-1或者infinite时,表示补间动画永不停止  
  12. repeatMode 设置重复的模式。默认是restart。当repeatCount的值大于0或者为infinite时才有效。  
  13. repeatCount=-1 或者infinite 循环了  
  14. 还可以设成reverse,表示偶数次显示动画时会做与动画文件定义的方向相反的方向动行。  
  15.  -->  

scale_demo.xml

[html] view plain copy
  1. <scale xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:interpolator="@android:anim/accelerate_interpolator"  
  3.     android:fromXScale="0.2"  
  4.     android:toXScale="1.5"  
  5.     android:fromYScale="0.2"  
  6.     android:toYScale="1.5"  
  7.     android:pivotX="50%"  
  8.     android:pivotY="50%"  
  9.     android:duration="2000"/>  
  10.   
  11. <!--   
  12. fromXScale:表示沿着x轴缩放的起始比例  
  13. toXScale:表示沿着x轴缩放的结束比例  
  14.   
  15. fromYScale:表示沿着y轴缩放的起始比例  
  16. toYScale:表示沿着y轴缩放的结束比例  
  17.   
  18. 图片中心点:  
  19.   android:pivotX="50%"   
  20.     android:pivotY="50%"  
  21.   
  22.  -->  

translate_demo.xml

[html] view plain copy
  1. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
  3.     android:fromXDelta="0"  
  4.     android:toXDelta="320"  
  5.     android:fromYDelta="0"  
  6.     android:toYDelta="0"  
  7.     android:duration="2000"/>   
  8.       
  9. <!--   
  10.   android:interpolator 动画的渲染器  
  11.   1、accelerate_interpolator(动画加速器) 使动画在开始的时候 最慢,然后逐渐加速  
  12.   2、decelerate_interpolator(动画减速器)使动画在开始的时候 最快,然后逐渐减速  
  13.   3、accelerate_decelerate_interpolator(动画加速减速器)  
  14.            中间位置分层:  使动画在开始的时候 最慢,然后逐渐加速           
  15.           使动画在开始的时候 最快,然后逐渐减速  结束的位置最慢  
  16.  fromXDelta  动画起始位置的横坐标  
  17.  toXDelta    动画起结束位置的横坐标  
  18.  fromYDelta  动画起始位置的纵坐标  
  19.  toYDelta   动画结束位置的纵坐标  
  20.  duration 动画的持续时间  
  21.  -->  

set_demo.xml

[html] view plain copy
  1. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:interpolator="@android:anim/decelerate_interpolator"  
  3.     android:shareInterpolator="true" >  
  4.   
  5.     <scale  
  6.         android:duration="2000"  
  7.         android:fromXScale="0.2"  
  8.         android:fromYScale="0.2"  
  9.         android:pivotX="50%"  
  10.         android:pivotY="50%"  
  11.         android:toXScale="1.5"  
  12.         android:toYScale="1.5" />  
  13.   
  14.     <rotate  
  15.         android:duration="1000"  
  16.         android:fromDegrees="0"  
  17.         android:repeatCount="1"  
  18.         android:repeatMode="reverse"  
  19.         android:toDegrees="360" />  
  20.   
  21.     <translate  
  22.         android:duration="2000"  
  23.         android:fromXDelta="0"  
  24.         android:fromYDelta="0"  
  25.         android:toXDelta="320"  
  26.         android:toYDelta="0" />  
  27.   
  28.     <alpha  
  29.         android:duration="2000"  
  30.         android:fromAlpha="1.0"  
  31.         android:toAlpha="0.1" />  
  32.   
  33.       
  34.   
  35. </set>  

布局文件:

[html] view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <Button  
  12.         android:id="@+id/button1"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_alignParentLeft="true"  
  16.         android:layout_alignParentTop="true"  
  17.         android:layout_marginLeft="23dp"  
  18.         android:layout_marginTop="15dp"  
  19.          android:onClick="translateImpl"  
  20.         android:text="@string/text_translate" />  
  21.   
  22.     <Button  
  23.         android:id="@+id/button2"  
  24.         android:layout_width="wrap_content"  
  25.         android:layout_height="wrap_content"  
  26.         android:layout_alignBottom="@+id/button1"  
  27.         android:layout_marginLeft="21dp"  
  28.          android:onClick="rotateImpl"  
  29.         android:layout_toRightOf="@+id/imageView1"  
  30.         android:text="@string/text_rotate" />  
  31.   
  32.     <Button  
  33.         android:id="@+id/button3"  
  34.         android:layout_width="wrap_content"  
  35.         android:layout_height="wrap_content"  
  36.         android:layout_alignRight="@+id/button1"  
  37.         android:layout_below="@+id/button1"  
  38.         android:layout_marginTop="32dp"  
  39.         android:onClick="scaleImpl"  
  40.         android:text="@string/text_scale" />  
  41.   
  42.     <Button  
  43.         android:id="@+id/button4"  
  44.         android:layout_width="wrap_content"  
  45.         android:layout_height="wrap_content"  
  46.         android:layout_alignBaseline="@+id/button3"  
  47.         android:layout_alignBottom="@+id/button3"  
  48.         android:layout_alignLeft="@+id/button2"  
  49.         android:onClick="alphaImpl"  
  50.         android:text="@string/text_alpha" />  
  51.   
  52.     <Button  
  53.         android:id="@+id/button5"  
  54.         android:layout_width="wrap_content"  
  55.         android:layout_height="wrap_content"  
  56.         android:layout_below="@+id/button3"  
  57.         android:layout_centerHorizontal="true"  
  58.         android:onClick="setAll"  
  59.         android:text="@string/text_set" />  
  60.   
  61.     <ImageView  
  62.         android:id="@+id/imageView1"  
  63.         android:layout_width="wrap_content"  
  64.         android:layout_height="wrap_content"  
  65.         android:layout_below="@+id/button5"  
  66.         android:layout_marginTop="48dp"  
  67.         android:layout_toRightOf="@+id/button3"  
  68.         android:src="@drawable/ic_launcher" />  
  69.   
  70. </RelativeLayout>  
效果如下:

在实际项目中,我们经常使用补间动画,原因是补间动画使用起来比较方便,功能也比逐帧动画强大不少,而且还可以很方便地进行动画叠加,实现更加复杂的效果。实际上,set_demo.xml中的<set/>标签对应的就是AnimationSet类,即“动画集合”的概念,支持加入多种动画效果,如渐变动画(alpha)、大小动画(scale),线性动画(translate)等。另外,在Android系统中,所有与动画相关的类都归类在android.view.animation包之下,大家可以参考SDK文档进行进一步学习。

至此,我们已经初步了解了如何在Android系统中使用各种动画效果,包括逐帧动画和补间动画。显而易见的是,在Android平台之上,开发者们可以很方便地使用各种动画效果来为应用产品增色。

 
 
3
0

我的同类文章

  • sqlserver 和Oracle中 order by(排序)的区别2014-03-24
  • easyui中的分页实现(支持MySQL,SQLServer,Oracle)2014-02-21
  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合2014-02-10
  • jquery easyui 授权树递归实现(部分Java代码)2014-01-10
  • jqueryeasyui递归实现用户组树2014-01-09
  • 分页查询发电量评估纵向历史对比数据(项目保留)2014-03-18
  • 功能组管理-添加移除功能(两种实现方式)2014-02-20
  • 项目中废弃的form表单普通提交2014-01-13
  • jquery easyui 授权树普通实现(部分Java代码)2014-01-10
  • Spring Mvc 模式中js报错出现"NetworkError: 400 Bad Request "2014-01-09
更多文章
猜你在找
Android开发精品课程【Java核心知识】
Android底层技术:Java层系统服务(Android Service)
Android必备的Java基础知识(二)
Android必备的Java基础知识
ArcGIS for JavaScript
查看评论
5楼 ylqhust2015-11-09 14:56发表 [回复]
简单清除,好
4楼 炒饭加蛋2014-12-23 10:39发表 [回复]
楼主你好,我最近要做小游戏,然后需要一个左右缓慢摇摆的动画,我用的是scale_demo.xml。发现动画摇摆的很快,怎么样才能摆动的慢一些。或者用别的什么方法好?
3楼 炒饭加蛋2014-12-23 10:39发表 [回复]
楼主你好,我最近要做小游戏,然后需要一个左右缓慢摇摆的动画,我用的是scale_demo.xml。发现动画摇摆的很快,怎么样才能摆动的慢一些。或者用别的什么方法好?
2楼 wsxzz_19982014-01-03 12:40发表 [回复]
这个的确是源代码了,呵呵
1楼 xty192013-07-15 22:00发表 [回复]
如果可以附上源码更好了
Re: sgx4250212342013-07-16 09:39发表 [回复]
回复xty19:这个已经就是源码了。。
发表评论
  • 用 户 名:
  • u014748504
  • 评论内容:
  • 插入代码
      
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题HadoopAWS移动游戏JavaAndroidiOSSwift智能硬件DockerOpenStackVPNSparkERPIE10EclipseCRMJavaScript数据库UbuntuNFCWAPjQueryBIHTML5SpringApache.NETAPIHTMLSDKIISFedoraXMLLBSUnitySplashtopUMLcomponentsWindows MobileRailsQEMUKDECassandraCloudStackFTCcoremailOPhone CouchBase云计算iOS6Rackspace Web AppSpringSideMaemoCompuware大数据aptechPerlTornadoRubyHibernateThinkPHPHBasePureSolrAngularCloud FoundryRedisScalaDjangoBootstrap
    个人资料

    sgx425021234
    1
    • 访问:409718次
    • 积分:6432
    • 等级:
    • 排名:第2108名
    • 原创:188篇
    • 转载:26篇
    • 译文:11篇
    • 评论:155条
    联系方式
      点击这里给我发消息
      点击这里给我发邮件
      加入我的IT聊吧
    博客专栏
    Java经典面试精选

    文章:5篇

    阅读:10913 spring入门

    文章:18篇

    阅读:37693
    文章分类
  • java(125)
  • java基础复习(10)
  • 译 java(1)
  • XML(10)
  • javaweb(64)
  • Android开发(32)
  • IT前沿软文(7)
  • JSP技术(26)
  • 杂文(10)
  • hibernate(15)
  • struts2(15)
  • javascript(12)
  • jQuery(16)
  • Oracle入门(11)
  • 面试(21)
  • win 8(0)
  • windows phone(1)
  • spring(25)
  • 杂七乱八(6)
  • 心情(3)
  • 大数据(7)
  • 商业智能(4)
  • Oracel BIEE(2)
  • informatica PowerCenter(1)
  • springMVC(9)
  • sql server(6)
    文章存档
  • 2014年03月(2)
  • 2014年02月(3)
  • 2014年01月(6)
  • 2013年11月(3)
  • 2013年10月(1)
  • 展开
    阅读排行
  • java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.37\bin\tcnative-1.dll: Can't load AMD 64(22526)
  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合(14378)
  • Android开发(26)--补间动画(Tween)的实现(11316)
  • Android开发(16)-TextView显示表情图像和文字(9963)
  • Android开发(21)--有关Spinner控件的使用说明(9397)
  • jsp课程(7)---jsp+servlet+javabean 实现的简单网上购物车(8044)
  • Android开发(15)-TextView显示丰富的文本(7371)
  • Android开发(20)--RadioGroup的使用(6909)
  • 什么是冯诺依曼结构计算机?(6781)
  • Android开发(30)--AutoCompleteTextView和MultiAutoCompleteTextView自动提示输入内容(6508)
    评论排行
  • 解决在IE浏览器中点击登录出现打开或保存json文件的提示(13)
  • jsp课程(7)---jsp+servlet+javabean 实现的简单网上购物车(10)
  • java经典面试题(2)(8)
  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合(8)
  • Android开发(17)-通过安卓API的Tabs3实现仿优酷tabhost效果(7)
  • sql server详细安装过程(6)
  • Android开发(26)--补间动画(Tween)的实现(6)
  • spring入门(2)---第一个spring案例(5)
  • VMware Workstation(虚拟机软件) V10.0 简体中文版可以安装了(4)
  • csdn小感(4)
    推荐文章
    • *Android View体系(七)从源码解析View的measure流程
    • *你真的了解iOS代理设计模式吗?
    • *浅谈Storm流式处理框架
    • *有关深度学习领域的几点想法
    • * 浅谈百度地图的简单开发之结合方向传感器实现定位功能(三)
    • *大数据常用十种开发语言
    最新评论
  • jsp课程(7)---jsp+servlet+javabean 实现的简单网上购物车

    yo_c:楼主能否把web.xml贴出来,多谢啦

  • java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.37\bin\tcnative-1.dll: Can't load AMD 64

    qq_25859403:666666666

  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    kore:nginx服务器ip:100 linux应用程序服务器ip:101 linux访问客户端ip:102...

  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    kore:应用程序服务器ip:192.168.0.101 linux访问客户端ip:192.168.0.102...

  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    kore:nginx服务器ip:192.168.0.100 linux

  • java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.37\bin\tcnative-1.dll: Can't load AMD 64

    STEVENKE789:怒赞!

  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    sgx425021234:@u010177725:你要是在公网环境就会取到公网环境的ip

  • 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    sgx425021234:@u010177725:你要是在公网环境就会取到公网环境的ip

  • 解决在IE浏览器中点击登录出现打开或保存json文件的提示

    sgx425021234:@yuan121099:不提示下载还不能登录吗?那你是程序写的有问题了。

  • 解决在IE浏览器中点击登录出现打开或保存json文件的提示

    yuan121099:没有解决问题啊 是提示不下载了 但是直接打开json文件 不登录网页啊