android中一共提供了两种动画,其一便是tween动画,tween动画通过对view的内容进行一系列的图像变换(包括平移,缩放,旋转,改变透明度)来实现动画效果,动画效果的定义可以使用xml,也可以使用编码来实现。 下面我们逐一查看tween能够实现的动画效果。

先看看工程的整体结构吧:

我们要实现的效果图如图

点击按钮则执行相应的动画操作。

布局文件activity_main.xml

  1. <LinearLayout 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:orientation="vertical"
  6. tools:context="com.example.tweentest.MainActivity" >
  7. <LinearLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:orientation="vertical" >
  11. <LinearLayout
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:orientation="horizontal" >
  15. <Button
  16. android:id="@+id/alpha"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:onClick="doanim"
  20. android:text="透明" />
  21. <Button
  22. android:id="@+id/scale"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:onClick="doanim"
  26. android:text="缩放" />
  27. <Button
  28. android:id="@+id/rotate"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:onClick="doanim"
  32. android:text="旋转" />
  33. <Button
  34. android:id="@+id/translate"
  35. android:layout_width="wrap_content"
  36. android:layout_height="wrap_content"
  37. android:onClick="doanim"
  38. android:text="移动" />
  39. <Button
  40. android:id="@+id/combo"
  41. android:layout_width="wrap_content"
  42. android:layout_height="wrap_content"
  43. android:onClick="doanim"
  44. android:text="组合" />
  45. </LinearLayout>
  46. <Button
  47. android:id="@+id/go_other_activity"
  48. android:layout_width="wrap_content"
  49. android:layout_height="wrap_content"
  50. android:onClick="doanim"
  51. android:text="GO!" />
  52. </LinearLayout>
  53. <LinearLayout
  54. android:layout_width="match_parent"
  55. android:layout_height="match_parent"
  56. android:orientation="horizontal" >
  57. <ImageView
  58. android:id="@+id/image1"
  59. android:layout_width="200dp"
  60. android:layout_height="200dp"
  61. android:src="@drawable/jiafeimao" />
  62. </LinearLayout>
  63. </LinearLayout>

好了,先来看第一个动画效果。

要实现让图片变成透明的动画效果,先在anim文件夹中新建一个名为alpha的xml文件,关于透明的动画效果都写在这个文件中:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <!-- 花1000毫秒,从不透明(1)变为透明(0) -->
  5. <!--
  6. repeatCount表示重复次数
  7. repeatMode表示开始的模式,restart表示每次重新开始,reverse表示接着来,即不透明->透明->不透明
  8. -->
  9. <alpha
  10. android:duration="2000"
  11. android:fromAlpha="1"
  12. android:repeatCount="5"
  13. android:repeatMode="reverse"
  14. android:toAlpha="0" />
  15. </set>

duration属性表示动画执行的时间,以毫秒为单位,repeatCount表示动画重复的次数,repeatMode属性有两个值,一个是restart,表示动画每次执行完之后都重新开始执行(不透明->透明,不透明->透明….),reverse表示动画每次执行完之后不重新开始而是接着反向执行(不透明->透明->不透明->透明….),换句话说,如果是reverse,则表示动画从不透明变为透明后再慢慢变回不透明,如果是restart则表示动画从不透明变为透明后,然后快速恢复原状。以上这三个属性在所有的tween动画中都有,也是最常用的属性。fromAlpha表示初始透明度,1表示不透明,0表示完全透明;toAlpha表示动画结束时的透明度。

这是动画的xml文件,再看看Java代码是怎样的。

  1. public class MainActivity extends Activity {
  2. private ImageView iv = null;
  3. private Animation animation = null;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. this.iv = (ImageView) this.findViewById(R.id.image1);
  9. }
  10. public void doanim(View v){
  11. switch (v.getId()) {
  12. case R.id.alpha:
  13. //读取动画文件
  14. animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
  15. //动画结束之后使用什么页面填充
  16. //使用动画结束后的样子填充,即保持结束时的画面
  17. animation.setFillAfter(true);
  18. //应用动画特效
  19. iv.startAnimation(animation);
  20. break;
  21. case R.id.scale:
  22. animation = AnimationUtils.loadAnimation(this, R.anim.scale);
  23. iv.startAnimation(animation);
  24. break;
  25. case R.id.rotate:
  26. animation = AnimationUtils.loadAnimation(this, R.anim.rotate);
  27. iv.startAnimation(animation);
  28. break;
  29. case R.id.translate:
  30. animation = AnimationUtils.loadAnimation(this, R.anim.translate);
  31. iv.startAnimation(animation);
  32. break;
  33. case R.id.combo:
  34. animation = AnimationUtils.loadAnimation(this, R.anim.combo);
  35. iv.startAnimation(animation);
  36. break;
  37. case R.id.go_other_activity:
  38. Intent intent = new Intent(MainActivity.this,SecondActivity.class);
  39. startActivity(intent);
  40. //设置让MainActivity从左边出,SecondActivity从右边进
  41. overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
  42. break;
  43. }
  44. }
  45. }

先拿到ImageView,然后在点击按钮时读取动画文件,并给imageview设置动画效果。

缩放动画:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <!--
  5. 两个1表示开始时图像大小不变,两个2表示图像放大一倍,
  6. 如果小于1则表示图像缩小。两个0表示基于左上角进行放大
  7. pivotX如果是50%,表示基于图像中心放大
  8. pivotX如果是50%p,表示基于父级中心放大
  9. infinite如它的英文意思,无限循环
  10. -->
  11. <scale
  12. android:duration="1000"
  13. android:fromXScale="1"
  14. android:fromYScale="1"
  15. android:pivotX="0"
  16. android:pivotY="0"
  17. android:repeatCount="infinite"
  18. android:repeatMode="reverse"
  19. android:toXScale="2"
  20. android:toYScale="2" />
  21. </set>

fromXScale和fromYScale分别表示初始时图像的缩放比例,1表示不缩放,toXScale和toYScale表示动画结束时的缩放比例,2表示动画放大一倍,如果是0.5则表示缩小一倍。pivotX和pivotY表示执行缩放时的参考点,两个值都为0表示是基于图像左上角来执行缩放操作,如果都是50%表示基于图像中心来执行缩放操作,如果是100%表示基于图像右下角执行缩放操作,如果是50%p,表示基于屏幕的中心执行缩放操作,如果是100%p表示基于屏幕的右下角执行缩放操作。

java代码见上文。

旋转动画:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <!-- fromDegrees表示开始的角度
  5. toDegrees结束的角度,180表示旋转半圈
  6. 两个100%表示基于自己的右下角旋转
  7. 想让倒着转,把180改为-180即可
  8. -->
  9. <rotate
  10. android:duration="1000"
  11. android:fromDegrees="0"
  12. android:pivotX="100%"
  13. android:pivotY="100%"
  14. android:toDegrees="180" />
  15. </set>

这里有两个参数解释,fromDegrees表示初始角度,0表示正常,toDegrees表示旋转角度,180表示顺时针旋转180度,-180表示逆时针旋转180度pivotX参数的意义和缩放动画中的参数意义相同。

Java代码同上文。

移动动画:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <!-- from表示从哪里开始移动
  5. to表示移动到那里
  6. 100%表示移动到自己的右下角
  7. 100%p表示移动到屏幕右下角
  8. -->
  9. <translate
  10. android:repeatCount="infinite"
  11. android:repeatMode="reverse"
  12. android:duration="1000"
  13. android:fromXDelta="0"
  14. android:fromYDelta="0"
  15. android:toXDelta="100%"
  16. android:toYDelta="100%" />
  17. </set>

fromXDelta表示初始时图像在x轴的位置toXDelta表示结束时图像在X轴的位置。

四种动画效果都已经说完,如果要实现组合效果呢?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <rotate
  5. android:duration="1000"
  6. android:fromDegrees="0"
  7. android:pivotX="100%"
  8. android:pivotY="100%"
  9. android:toDegrees="180" />
  10. <alpha
  11. android:duration="2000"
  12. android:fromAlpha="1"
  13. android:repeatCount="5"
  14. android:repeatMode="reverse"
  15. android:toAlpha="0" />
  16. <scale
  17. android:duration="1000"
  18. android:fromXScale="1"
  19. android:fromYScale="1"
  20. android:pivotX="0"
  21. android:pivotY="0"
  22. android:repeatCount="infinite"
  23. android:repeatMode="reverse"
  24. android:toXScale="2"
  25. android:toYScale="2" />
  26. <translate
  27. android:duration="1000"
  28. android:fromXDelta="0"
  29. android:fromYDelta="0"
  30. android:repeatCount="infinite"
  31. android:repeatMode="reverse"
  32. android:toXDelta="100%"
  33. android:toYDelta="100%" />
  34. </set>

把之前所有的动画效果放在一个文件中就可以了。

android中的动画效果可以对任何组件使用,因为组件都是继承自View,而startAnimation(Animation animation)方法就是View中的方法。那么两个Activity之间切换能不能使用动画效果呢?当然可以。上文中的Java代码中,有这么一句:

  1. case R.id.go_other_activity:
  2. Intent intent = new Intent(MainActivity.this,SecondActivity.class);
  3. startActivity(intent);
  4. //设置让MainActivity从左边出,SecondActivity从右边进
  5. overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
  6. break;

想要实现activity之间切换的动画,使用overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);方法即可,该方法要两个参数,分别表示新activity进入时的动画和旧activity出去时的动画。

进入时动画:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <translate
  5. android:duration="1000"
  6. android:fromXDelta="100%"
  7. android:fromYDelta="0"
  8. android:toXDelta="0"
  9. android:toYDelta="0" />
  10. </set>

出去时动画:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <translate
  5. android:duration="1000"
  6. android:fromXDelta="0"
  7. android:fromYDelta="0"
  8. android:toXDelta="-100%"
  9. android:toYDelta="0" />
  10. </set>

效果如图:

MainActivity逐渐移出,SecondActivity逐渐从右边进来。

android之tween动画详解的更多相关文章

  1. Android中的动画详解系列【4】——Activity之间切换动画

    前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自定义动画,这一篇我们来看看如何将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 如 ...

  2. Android 三种动画详解

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...

  3. android之frame动画详解

    上一篇我们说了android中的tween动画,这一篇我们说说frame动画,frame动画主要是实现了一种类似于gif动画的效果,就是多张图按预先设定好的时间依次连续显示. 新建一个android项 ...

  4. Android之Lottie动画详解

    文章大纲 一.Lottie介绍二.Lottie实战三.项目源码下载四.参考文章   一.Lottie介绍 1. 什么是Lottie   Lottie是Android和iOS的移动库,用于解析Adobe ...

  5. Android 开发之动画详解

    一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...

  6. Android中的动画详解系列【3】——自定义动画研究

    在上一篇中我们使用到了位移动画TranslateAnimation,下面我们先来看看TranslateAnimation是如何实现Animation中的抽象方法的: /* * Copyright (C ...

  7. Android中的动画详解系列【2】——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小例子,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包括下面几个子类: AlphaAnimation ...

  8. Android中的动画详解系列【1】——逐帧动画

    逐帧动画其实很简单,下面我们来看一个例子: <?xml version="1.0" encoding="utf-8"?> <animation ...

  9. [转]ANDROID L——Material Design详解(动画篇)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/de ...

随机推荐

  1. 太受不了了,,REST_FRAMEWORK太方便啦~~

    按英文原始的DOCUMENT走一圈,从最手工的输出到高度的集成. 最后真的就几行代码,实现最常用的JSON API..纯RESTFUL风格. 但,其核心是要记住序列化生反序列的过程,都是要以PYTHO ...

  2. 如何在C++中使用WebService

    gsoap主页 http://sourceforge.net/projects/gsoap2   使用gsoap生成所需的WebService 下载后的gsoap包为:(点击到我的资源中下载) 将他解 ...

  3. Ubuntu下安装Qt4.5(包括X86和ARM版本)

    条件:TQ2440开发板,虚拟机安装的Ubuntu10.04,安装好天嵌自带的GCC交叉编译器参考:http://blog.csdn.net/newnewman80/article/details/6 ...

  4. app:layout_scrollFlags不起作用

    http://stackoverflow.com/questions/31722798/enteralwayscollapsed-does-not-bring-back-the-toolbar-whe ...

  5. The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

    The server is temporarily unable to service your request due to maintenance downtime or capacity pro ...

  6. 《C语言程序设计现代方法》第2章 编程题

    7 编写一个程序,要求用户输入一个美金数量,然后显示出如何使用最少的20美元.10美元.5美元和1美元来付款. 提示:将付款金额除以20,确定20美元的数量,然后从付款金额中减去20美元的总金额.对其 ...

  7. JavaScript高级程序设计23.pdf

    document对象作为HTMLDocument的一个实例,它还有一些标准的Document对象所没有的属性,这些属性提供了网页上的一些信息 //取得文档标题 var title1=document. ...

  8. ubuntu14.04 swap not avalible交换分区不能使用

    系统最近特别卡,打开"System monitor"中的resource发现"swap not avalibe".原来系统每交换分区. 我的是笔记本电脑,存储空间有限.首先我下载磁盘分区工具Gpart ...

  9. DS1302-演示代码

    参考DS1302数据手册,尽管数据手册是英文,但是很有帮助,再结合网上众多的代码写出了下面这个例子,除了涓流充电(trickle charger)功能没使用外,内部的RAM和寄存器功能都使用到了,包括 ...

  10. myeclipse输入“.”后没有自动提示功能

    今天和室友安装了一样的myeclipse版本,结果室友的自动提示功能有,我的输入"."后却不能提示,这对我们敲代码简直来说是一个折磨,不能自动提示,本来还以为是系统问题,一个是wi ...