• Android动画的实现 上


           在Android系统中也能经常见到动画,那么如何实现动画效果呢?本文就来为大家介绍动画的实现方式。

           Android中动画的实现分两种方式,一种方式是补间动画Tween Animation,就是说你定义一个开始和结束,中间的部分由程序运算得到。另一种叫逐帧动画Frame Animation,就是说一帧一帧的连起来播放就变成了动画。有点Flash基础的同学理解起来会很容易。接下来我们一个一个学习。

           一、补间动画Tween Animation

           Android中实现补间动画的思路是这样的,

           1、首先用XML定义一个动画效果

           2、依据这个XML使用AnimationUtils工具类创建一个Animationd对象

           3、调用View组件的startAnimation方法实现动画。

           接下来我们用一个例子来看一下。

           1、创建一个项目Lesson24_Animation,主Activity名字叫MainActivity.java

           2、在res目录下创建一个anim目录,在目录下创建下面五个动画定义文件,需要注意的是这5个文件在是2.2下调试通过的,网上很多文档的xml是无法通过IDE的检查的,可能是新版本检查更严格了。

           alpha_animation.xml

    XML/HTML代码
    1. <?xml version="1.0" encoding="utf-8"?>  

           composite_animation.xml

    XML/HTML代码
    1.   

           rotate_animation.xml

    XML/HTML代码
    1. <?xml version="1.0" encoding="utf-8"?>  

           scale_animation.xml

    XML/HTML代码
    1. <?xml version="1.0" encoding="utf-8"?>  

           translate_animation.xml

    XML/HTML代码
    1. <?xml version="1.0" encoding="utf-8"?>  

           3、MainActivity.java的内容如下:

    Java代码
    1. package android.basic.lesson24;   
    2.   
    3. import android.app.Activity;   
    4. import android.os.Bundle;   
    5. import android.view.View;   
    6. import android.view.View.OnClickListener;   
    7. import android.view.animation.Animation;   
    8. import android.view.animation.AnimationUtils;   
    9. import android.widget.ImageButton;   
    10.   
    11. public class MainAnimation extends Activity {   
    12.     /** Called when the activity is first created. */  
    13.     @Override  
    14.     public void onCreate(Bundle savedInstanceState) {   
    15.         super.onCreate(savedInstanceState);   
    16.         setContentView(R.layout.main);   
    17.   
    18.         //定义UI组件   
    19.         final ImageButton ib1 = (ImageButton) findViewById(R.id.ImageButton01);   
    20.         final ImageButton ib2 = (ImageButton) findViewById(R.id.ImageButton02);   
    21.         final ImageButton ib3 = (ImageButton) findViewById(R.id.ImageButton03);   
    22.         final ImageButton ib4 = (ImageButton) findViewById(R.id.ImageButton04);   
    23.         final ImageButton ib5 = (ImageButton) findViewById(R.id.ImageButton05);   
    24.   
    25.         //定义监听器   
    26.         OnClickListener ocl = new OnClickListener() {   
    27.   
    28.             @Override  
    29.             public void onClick(View v) {   
    30.                 switch (v.getId()) {   
    31.                 case R.id.ImageButton01:   
    32.                     //创建Animation对象   
    33.                     Animation ani1 = AnimationUtils.loadAnimation(   
    34.                             getApplicationContext(), R.anim.alpha_animation);   
    35.                     //组件播放动画   
    36.                     ib1.startAnimation(ani1);   
    37.                     break;   
    38.                 case R.id.ImageButton02:   
    39.                     Animation ani2 = AnimationUtils.loadAnimation(   
    40.                             getApplicationContext(), R.anim.scale_animation);   
    41.                     ib2.startAnimation(ani2);   
    42.                     break;   
    43.                 case R.id.ImageButton03:   
    44.                     Animation ani3 = AnimationUtils.loadAnimation(   
    45.                             getApplicationContext(), R.anim.translate_animation);   
    46.                     ib3.startAnimation(ani3);   
    47.                     break;   
    48.                 case R.id.ImageButton04:   
    49.                     Animation ani4 = AnimationUtils.loadAnimation(   
    50.                             getApplicationContext(), R.anim.rotate_animation);   
    51.                     ib4.startAnimation(ani4);   
    52.                     break;   
    53.                 case R.id.ImageButton05:   
    54.                     Animation ani5 = AnimationUtils.loadAnimation(   
    55.                             getApplicationContext(), R.anim.composite_animation);   
    56.                     ib5.startAnimation(ani5);   
    57.                     break;   
    58.                 }   
    59.   
    60.             }   
    61.   
    62.         };   
    63.   
    64.         //绑定监听器   
    65.         ib1.setOnClickListener(ocl);   
    66.         ib2.setOnClickListener(ocl);   
    67.         ib3.setOnClickListener(ocl);   
    68.         ib4.setOnClickListener(ocl);   
    69.         ib5.setOnClickListener(ocl);   
    70.     }   
    71. }  

           4、运行程序,查看结果。

           原始图:

    补间动画之原始图

           点击第一个按钮的透明度变化效果:

    补间动画之透明度变化效果

           点击第二个按钮的缩放效果,这里看到的是两个缩放效果同时作用叠加的效果。也就是说默认情况下效果是同时发生的,而不是先后执行的,除非你使用 startoffset属性指定。同学们看这一讲最重要的还是自己练习来体会。

    补间动画之缩放效果

           点击第三个按钮的位移效果,这个例子里我们可以清楚看到android:startOffset=”2000″的作用,数独按钮前2秒向右移了300像素,后2秒又回到原处,注意第二个translate中的负值参数,它清晰的告诉我们位移数据是相对自身当时位置的。

    补间动画之位移效果

           点击第四个按钮的旋转效果,负的度数表示逆时针旋转。

    补间动画之旋转效果

           点击第五个按钮的复合动画效果,这个效果的代码我是直接粘贴的官方帮助文档里的代码,看着效果还不赖^_^

    补间动画之复合动画效果

           二、逐帧动画

           我们知道,Android是不支持Gif动画的,也不建议使用Gif动画,比较不幸的是到Android 2.2版本为止也不支持APNG这种png动画格式,所以我们制作只能用多张png图片逐帧播放的方式来实现动画效果。下面我们用一个例子来学习一下逐帧动画。

           1、新建一个项目Lesson24_FrameAnimation ,主Acitivy名字叫 MainFrameAnimation.java。

           2、将下图中的每个小图片分开,即25张小图片,拷贝到res/drawable目录下。

    逐帧动画图片逐帧动画图片

           3、在res/anim目录下,新建一个文件 firefox_animation.xml 内容如下:

    XML/HTML代码
    1. <?xml version="1.0" encoding="utf-8"?>  

           4、在res/layout/main.xml中写入如下内容:

    XML/HTML代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <BUTTON type=submit>  
    3. </BUTTON>  
    4. <BUTTON type=submit>  
    5. </BUTTON>  

           5、在MainFrameAnimation.javaz中的内容如下:

    Java代码
    1. package android.basic.lesson24;   
    2.   
    3. import android.app.Activity;   
    4. import android.graphics.drawable.AnimationDrawable;   
    5. import android.os.Bundle;   
    6. import android.view.View;   
    7. import android.view.View.OnClickListener;   
    8. import android.widget.Button;   
    9. import android.widget.ImageView;   
    10.   
    11. public class MainFrameAnimaton extends Activity {   
    12.     /** Called when the activity is first created. */  
    13.     @Override  
    14.     public void onCreate(Bundle savedInstanceState) {   
    15.         super.onCreate(savedInstanceState);   
    16.         setContentView(R.layout.main);   
    17.   
    18.         // 定义UI组件   
    19.         Button b1 = (Button) findViewById(R.id.Button01);   
    20.         Button b2 = (Button) findViewById(R.id.Button02);   
    21.         final ImageView iv = (ImageView) findViewById(R.id.ImageView01);   
    22.   
    23.         // 定义点击监听器   
    24.         OnClickListener ocl = new OnClickListener() {   
    25.   
    26.             @Override  
    27.             public void onClick(View v) {   
    28.   
    29.                 // 定义"动画可画"对象,我起的名字,你看着不顺眼就当不存在^_^   
    30.                 AnimationDrawable ad = (AnimationDrawable) iv.getBackground();   
    31.   
    32.                 switch (v.getId()) {   
    33.                 case R.id.Button01:   
    34.                     //调用动画可画对象的开始播放方法   
    35.                     ad.start();   
    36.                     break;   
    37.                 case R.id.Button02:   
    38.                     //调用动画可画对象的停止播放方法   
    39.                     ad.stop();   
    40.                     break;   
    41.                 }   
    42.             }   
    43.         };   
    44.   
    45.         //绑定监听器   
    46.         b1.setOnClickListener(ocl);   
    47.         b2.setOnClickListener(ocl);   
    48.     }   
    49. }  

           6、运行程序,查看效果:

    逐帧动画示例一

    逐帧动画示例二

           换个背景再来一张,可以看到png动画的透明就是不一般^_^

    逐帧动画示例三

           顺便提一下,我的这些可爱的小狐狸图标,是在APNG这个项目中找到的,感兴趣的朋友去搜搜APNG吧。

  • 相关阅读:
    安装 Java 开发工具包JDK(Windows版本)
    在sublime text 3中让.vue文件的内容变成彩色
    iOS之禁止所有输入法的表情
    iOS之UIButton扩大按钮的响应区域
    iOS之利用腾讯Bugly程序调试,测试代码bug、卡顿等情况
    iOS之在本地搭建IPv6环境测试你的app
    iOS之让UISearchBar搜索图标和placeholder靠左显示
    iOS之限制TextField的输入长度
    iOS之oc与html之间的交互(oc中调用js的方法)
    iOS之面试题:腾讯三次面试以及参考思路
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3911680.html
Copyright © 2020-2023  润新知