本文以一个简单的小例子,简述在Android开发中,动画的简单应用,仅供学习分享使用。

概述

android提供了各种强大的apis,用于将动画应用到ui元素中,来丰富应用程序的功能和应用。

动画分类

在Android框架中,动画主要分为三类【这三种动画系统都是可行的选择,但一般来说,属性动画系统是首选的使用方法,因为它更灵活,提供了更多的功能】,具体如下:

  • 帧动画:将图像资源按顺序一帧一帧的播放出来,形成动画()。
  • 补间动画:又叫视图动画,是比较旧的系统,只能用于视图组件,相对比较容易设置和提供能力满足程序的需要。
  • 属性动画:在android 3.0(api等级11)中引入的属性动画系统,允许您对任何对象的属性进行动画处理,包括未呈现到屏幕上的属性。该系统是可扩展的,并允许自定义动画类型的属性。

帧动画

将动画资源文件作为图片控件(ImageView)的背景图(background)。

帧动画涉及知识点如下:

  • AnimationDrawable: 用于创建逐帧动画的对象,由一系列可拖动对象,可用作视图对象的背景。
  • isRunning() 是否正在运行
  • stop() 停止动画
  • start() 开始运行

帧动画核心代码

在drawable目录下,新增一个动画资源配置文件【animation-list节点下包含item子节点,item有两个属性,android:drawable=图像资源id,android:duration=周期】,如下:

 <?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/n0" android:duration="300"></item>
<item android:drawable="@drawable/n1" android:duration="300"></item>
<item android:drawable="@drawable/n2" android:duration="300"></item>
<item android:drawable="@drawable/n3" android:duration="300"></item>
<item android:drawable="@drawable/n4" android:duration="300"></item>
<item android:drawable="@drawable/n5" android:duration="300"></item>
<item android:drawable="@drawable/n6" android:duration="300"></item>
<item android:drawable="@drawable/n7" android:duration="300"></item>
<item android:drawable="@drawable/n8" android:duration="300"></item>
<item android:drawable="@drawable/n9" android:duration="300"></item>
</animation-list>

java设置代码如下:

 private AnimationDrawable drawable;

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawable);
ImageView imageView= (ImageView) this.findViewById(R.id.ivLetter);
drawable= (AnimationDrawable) imageView.getBackground();
drawable.start();
} @Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
if(drawable.isRunning()) {
drawable.stop();
}else{
drawable.start();
}
}
return super.onTouchEvent(event);
}

补间动画

补间动画,又称渐变动画是指定义起始状态,结束状态,中间状态等,然后其他部分由程序自动生成,从而形成动画。

补间动画涉及知识点如下:

  • TranslateAnimation 平移动画 控制对象位置的动画。
  • RotateAnimation 旋转动画 控制对象旋转的动画。这个旋转需要放置在xy平面上。您可以指定中心要使用的点,其中(0,0)是左上角。如果未指定,则(0,0)为默认旋转点。
  • ScaleAnimation 缩放动画 控制对象的比例尺的动画。您可以指定点用于缩放中心。
  • AlphaAnimation 透明度动画 控制对象的alpha级的动画,通过更改透明度属性,对于对象的淡入淡出,这是一个很有用的方法。
  • AnimationSet 动画集合 上述动画可以组合使用。
  • setFillAfter(true); 设置动画结束后的填充
  • setDuration(2000); 动画周期
  • setRepeatCount(2); 重复次数

  • setRepeatMode(Animation.REVERSE); 重复模式

补间动画核心代码如下:

   /**
* 平移
* @param v
*/
protected void transfer_click(View v){ //参数是平移的起始坐标和结束坐标(起始X轴位置,结束X轴位置,起始Y轴位置,结束Y轴位置)的改变量。
//TranslateAnimation trans=new TranslateAnimation(0.0f,300f,0.0f,300f);
//fromXType 动画平移改变量的类型
//Animation.RELATIVE_TO_SELF,0 表示控件现在的坐标+0*控件本身的宽度或高度
//Animation.RELATIVE_TO_SELF,0.5f 表示控件现在的坐标+0.5*控件本身的宽度或高度
//Animation.RELATIVE_TO_PARENT 相对于父控件,计算方式和Animation.RELATIVE_TO_SELF一样
//fromXValue 起始坐标值的改变量,如果类型是ABSOLUTE,则此值为绝对数字,否则则表示百分比(0-1)之间。
TranslateAnimation trans=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1);
trans.setDuration(2000);//设置周期
trans.setFillAfter(true);//当结束时保持结束位置
trans.setRepeatCount(2);//设置重复次数
trans.setRepeatMode(Animation.REVERSE);//重复模式
ivTaichi.startAnimation(trans);//启动
} /**
* 旋转
* @param v
*/
protected void rotate_click(View v){
//参数是旋转的起始偏移量(度数),结束度数,旋转中心点(相对x轴 位置和y轴位置)。
//RotateAnimation rotate=new RotateAnimation(0.0f,90.f,100.0f,100.0f);
RotateAnimation rotate =new RotateAnimation(0.0f,360.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotate.setFillAfter(true);
rotate.setDuration(2000);
rotate.setRepeatCount(2);
rotate.setRepeatMode(Animation.REVERSE);
ivTaichi.startAnimation(rotate);//启动
} /**
* 缩放
* @param v
*/
protected void scale_click(View v){
//fromX toX 动画起始和结束时的X轴水平缩放因子
//fromY toY 动画起始和结束时的Y轴水平缩放因子
ScaleAnimation scale=new ScaleAnimation(0.5f,1.5f,0.5f,1.5f);
scale.setFillAfter(true);
scale.setDuration(2000);
scale.setRepeatCount(2);
scale.setRepeatMode(Animation.REVERSE);
ivTaichi.startAnimation(scale);//启动
} /**
* 透明度动画
* @param v
*/
protected void alpha_click(View v){
//fromAlpha toAlpha 动画起始和结束时的透明度。范围(0,1)
AlphaAnimation alpha=new AlphaAnimation(0,1);
alpha.setFillAfter(true);
alpha.setDuration(2000);
alpha.setRepeatCount(2);
alpha.setRepeatMode(Animation.REVERSE);
ivTaichi.startAnimation(alpha);//启动
} /**
* 集合动画
* @param v
*/
protected void set_click(View v){
AnimationSet set=new AnimationSet(true);
//TranslateAnimation animation1=new TranslateAnimation(0.0f,300.0f,0.0f,300.0f);
RotateAnimation animation2 =new RotateAnimation(0.0f,360.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
ScaleAnimation animation3=new ScaleAnimation(0.0f,1.0f,0.0f,1.0f);
AlphaAnimation animation4=new AlphaAnimation(0,1);
//set.addAnimation(animation1);
set.addAnimation(animation2);
set.addAnimation(animation3);
set.addAnimation(animation4);
set.setFillAfter(true);
set.setDuration(2000);
set.setRepeatCount(2);
set.setRepeatMode(Animation.REVERSE);
ivTaichi.startAnimation(set);//启动
}

属性动画

属性动画主要通过改变对象的属性,来实现动画,可以进行扩展,且功能丰富。

属性动画涉及知识点如下:

  • ObjectAnimator 该ValueAnimator的子类提供了对目标对象上的动画属性的支持。该类的构造函数使用参数来定义将被动画化的目标对象以及将被动画化的属性的名称。
  • setDuration(2000); 动画周期
  • setRepeatCount(2); 重复次数
  • setRepeatMode(Animation.REVERSE); 重复方式
  • start(); 启动

属性动画核心代码如下:

 /**
* 平移
* @param v
*/
protected void transfer_click(View v){
//target 属性动画的目标控件
//propertyName 产生动画的属性,所有的属性必须拥有set,get方法
//values 属性动画的范围集合
ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"translationX",0,200,-200,0);
objectAnimator.setDuration(2000);
objectAnimator.setRepeatCount(2);
objectAnimator.setRepeatMode(Animation.REVERSE);
objectAnimator.start();
} /**
* 旋转
* @param v
*/
protected void rotate_click(View v){
ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"rotationX",0,180);
objectAnimator.setDuration(2000);
objectAnimator.setRepeatCount(2);
objectAnimator.setRepeatMode(Animation.REVERSE);
objectAnimator.start();
} /**
* 缩放
* @param v
*/
protected void scale_click(View v){
ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"scaleX",0,1,0);
objectAnimator.setDuration(2000);
objectAnimator.setRepeatCount(2);
objectAnimator.setRepeatMode(Animation.REVERSE);
objectAnimator.start();
} /**
* 透明度
* @param v
*/
protected void alpha_click(View v){
ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"alpha",0,1);
objectAnimator.setDuration(2000);
objectAnimator.setRepeatCount(2);
objectAnimator.setRepeatMode(Animation.REVERSE);
objectAnimator.start();
} /**
* 集合动画
* @param v
*/
protected void set_click(View v){
AnimatorSet set=new AnimatorSet();
List<Animator> list=new ArrayList<Animator>() ;
ObjectAnimator objectAnimator1 =ObjectAnimator.ofFloat(ivTaichi,"translationX",0,200);
ObjectAnimator objectAnimator2 =ObjectAnimator.ofFloat(ivTaichi,"rotationX",0,180);
ObjectAnimator objectAnimator3 =ObjectAnimator.ofFloat(ivTaichi,"scaleX",0,1);
ObjectAnimator objectAnimator4 =ObjectAnimator.ofFloat(ivTaichi,"alpha",0,1);
list.add(objectAnimator1);
list.add(objectAnimator2);
list.add(objectAnimator3);
list.add(objectAnimator4);
//播放一序列的动画对象
set.playSequentially(list);
//
set.start();
}

备注

学而不思则罔,思而不学则殆!!!

一起学Android之Animation的更多相关文章

  1. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

  2. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  3. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  4. DoNet屌丝学Android(一)——Android开发准备工作 & No HelloWord & (真机)调试

    先乱扯淡一下吧,本人一.net屌丝,手持Android 4.2.2手机,Win7 x64本本,闲来无聊学习一下Android的开发,至于要开发啥玩意目前没有什么想法,就是想学学,搞不好是三分热度也有可 ...

  5. 从头学Android系列

    从头学Android系列 http://blog.csdn.net/worker90/article/category/888358

  6. 学Android开发 这19个开发工具助你顺风顺水

    学Android开发 这19个开发工具助你顺风顺水 要想快速开发一个Android应用,通常会用到很多工具,巧妙利用这些工具,能让我们的开发工作事半功倍,节省大量时间,下面大连Android开发培训小 ...

  7. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  8. Android动画Animation之Tween用代码实现动画

    透明度动画.旋转动画.尺寸伸缩动画.移动动画 package com.javen.tween; import android.annotation.SuppressLint; import andro ...

  9. 一步一步学android控件(之十六)—— CheckBox

    根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...

随机推荐

  1. Winform中使用Timer实现滚动字幕效果(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个Fo ...

  2. AE单词备忘

    类的基本特性内 approved 已批准 implemented 已实施 mandatory 强制性的 proposed 偍仪的 validated 已验证

  3. JS---DOM---事件冒泡和阻止事件冒泡,总结事件

    事件冒泡: 多个元素嵌套, 有层次关系 ,这些元素都注册了相同的事件, 如果里面的元素的事件触发了, 外面的元素的该事件自动的触发了     事件有三个阶段: 1.事件捕获阶段  :从外向内 2.事件 ...

  4. Racket 命令行方式安装 collection

    最近在学习 SICP,里面用的 Lisp 系列的 Scheme.OS X 上要配置Scheme环境. Racket 完整的包要 110 M,mini 版只要10M.我只需要简单的命令行操作,显然选mi ...

  5. WebAPI接口测试数据库操作

    通常我们是不建议直接查看数据库内容来检查功能的,但是在没有外部接口或者图形界面验证的情况下,只能通过查询数据库来验证. 比如我们手工需要从界面上添加一万条数据,估计要花好几天时间,显然不能手工去操作. ...

  6. JavaScript数组循环

    JavaScript数组循环 一.前言 利用Javascript map(),reduce()和filter()数组方法可以遍历数组.而不是积累起来for循环和嵌套来处理列表和集合中的数据,利用这些方 ...

  7. Js实现回车登录,监听回车事件

    需求 项目有个回车登录功能,在此记录下 实现 我们应该监听当前登录页面的所有回车操作. $("body").keydown(function () { var yzmStatus ...

  8. 深度好文:PHP写时拷贝与垃圾回收机制(转)

    原文地址:http://www.php100.com/9/20/87255.html 写入拷贝(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略.其核心思想是,如果有多个调用 ...

  9. 在cnetos7上搭建mysql主从服务

    本文主要是介绍在centos上搭建mysql的主从服务器.如果没有搭建过的,可以查看我以前的博客,里面有详细的安装centos和在centos上安装mysql的说明. 一.安装从虚拟机: 1.右键—& ...

  10. How to: Apply Attributes to Entity Properties when Using Model First 如何:在ModelFirst时将属性应用于实体属性

    In a Model First data model, object properties are declared in the designer-generated files, and you ...