Android--Animation动画的基本使用与介绍
来源:互联网 发布:美工岗位职责 编辑:程序博客网 时间:2024/06/09 21:47
一、Animation动画的基本介绍
Animation,是一个可以实现Android UI界面动画的效果,同时,Animation也提供了一系列的动画效果,其中分别有:透明度动画、收缩动画、位移动画、旋转动画。这些动画效果绝大多数可以运用在控件中。
二、Animation动画的类型
Android中Animation动画的类型分为四部份类型组成:
1、Alpha——渐变透明度动画效果
2、Scale——渐变收缩动画效果
3、Translate——画面位移动画效果
4、Rotate——画面旋转动画效果
三、Animation动画的模式
Android中Animation动画的模式分为两种:
1、tweened animation(渐变动画),其中分别是Alpha和Scale
2、frame by frame(画面转换动画),其中分别是Translate和Rotate
四、Animation动画的两种格式
1、xml文件中定义动画
2、JavaCode中定义动画
说到Animition动画的两种格式,无非就是写法了,在日常开发中,一般写法有xml定义动画和Javacode定义动画,但是大多数人可能比较喜欢xml定义,因为xml定义动画整理起来比较方便和规范,而用Javacode编写虽然也能实现和xml定义动画一模一样的效果,但是用JavaCode去定义动画只能增加代码的复杂性。在本文中,我们暂时先介绍xml定义动画的基本使用,有关javacode定义动画的使用,下次有时间再给大家讲解一下。
五、如何在xml文件中定义动画
步骤如下
1、新建Android项目
2、在res目录中新建anim文件夹
3、在anim文件夹中新建一个my_animation.xml文件
4、在my_animation.xml文件中编写动画代码
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha /> <scale /> <translate /> <rotate /></set>
六、Aimation动画的解析--XML
1、alpha--渐变透明度动画
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="2000" android:fromAlpha="0.0" android:toAlpha="1.0"></alpha> <!-- alpha透明度渐变动画效果 浮点数值: fromAlpha:属性为动画开始时的透明度 toAlpha:属性为动画结束时的透明度 说明: 0.0表示完全透明 1.0表示完全不透明 以上可以取值为0.0-1.0之间float类型的数字 长整数值: duration:属性为动画的持续时间 --></set>在这里,我设置的是fromAlpha0.0到toAlpha1.0,由此可见透明动画从开始的完全透明转为结束时的完全不透明。
2、scale--渐变收缩动画
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="2000" android:fromXScale="0.0" android:fromYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" /> <!-- scale尺寸收缩动画效果 浮点数值: fromXScale:属性为动画起始时 X坐标上的伸缩尺寸 toXScale:属性为动画结束时 X坐标上的伸缩尺寸 fromYScale:属性为动画起始时 Y坐标上的伸缩尺寸 toXScale:属性为动画结束时 Y坐标上的伸缩尺寸 说明: 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 长整数值: duration:属性为动画的持续时间,时间是以毫秒为单位,即1000毫秒等于1秒 --></set>我这里设置了fromXScale起点坐标x为0.0和fromYScale起点坐标y为0.0,也就是说首先动画是从收缩到没有的,看不见的一个状态。然后我再通过设置了toXScale1.0结束时x坐标和toYScale1.0结束时y坐标,也就是说最终结束时候x坐标和y坐标分别放大了从原来的没有到有而已。那如果我想方法到原来图片的2倍怎么办呢?其实很容易,只要修改toXScale和toYScale各自为2.0就可以了。
3、translate--画面位移动画
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="2000" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="500" android:toYDelta="-350"> </translate> <!-- translate画面位移动画效果 浮点数值: fromXDelta:属性为动画开始时,x坐标上的位置 toXDelta:属性为动画结束时,x坐标上的位置 fromYDelta:属性为动画开始时,y坐标上的位置 toYDelta:属性为动画结束时,y坐标上的位置 长整数值: duration:属性为动画的持续时间,时间是以毫秒为单位,即1000毫秒等于1秒 --></set>由此可见,toXDelta等于500表示向右平移500px,而toYDelta等于-350,表示向上平移350px。整体平移动画效果看起来就是从原始位置慢慢平移到右上角位置。
4、rotate--画面旋转动画
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:duration="3000" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="+360"> </rotate> <!-- rotate画面旋转动画效果 浮点数值: fromDegrees:属性为动画起始时物件的角度 toDegrees:属性为动画结束时物件的角度,在这里我设置了+360,表示根据物件旋转了一圈 说明: 当角度为正数表示顺时针旋转 当角度为负数表示逆时针旋转 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 长整数值: duration:属性为动画的持续时间,时间是以毫秒为单位,即1000毫秒等于1秒 --></set>由于我这里设置了formDegress为0表示物件开始旋转角度为0,toDegress为+360表示物件结束时旋转角度为360度,结合起来也就是说从一个0角度的物件旋转到360一圈后的物件。
七、如何在Java代码中加载我们解析好的xml动画文件
1、创建动画加载构造器
//第一个参数Context为程序的上下文 //第二个参数id为动画XML文件的引用//例子:myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_anim);//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件
具体代码如下:
import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Animation myAnimation; private Button bt_alpha; private Button bt_scale; private Button bt_translate; private Button bt_rotate; private ImageView animation_iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { bt_alpha= (Button) this.findViewById(R.id.bt_alpha); bt_scale= (Button) this.findViewById(R.id.bt_scale); bt_translate= (Button) this.findViewById(R.id.bt_translate); bt_rotate= (Button) this.findViewById(R.id.bt_rotate); animation_iv= (ImageView) this.findViewById(R.id.animation_iv); bt_alpha.setOnClickListener(this); bt_scale.setOnClickListener(this); bt_translate.setOnClickListener(this); bt_rotate.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.bt_alpha: //加载透明度动画并且通过图片控件去启动动画 myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha_animation); animation_iv.startAnimation(myAnimation); break; case R.id.bt_scale: //加载收缩动画并且通过图片控件去启动动画 myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale); animation_iv.startAnimation(myAnimation); break; case R.id.bt_translate: //加载位移动画并且通过图片控件去启动动画 myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.translate); //setFillAfter(true)表示执行位移动画结束后,控件将停留在执行结束的状态 myAnimation.setFillAfter(true); animation_iv.startAnimation(myAnimation); break; case R.id.bt_rotate: //加载旋转动画并且通过图片控件去启动动画 myAnimation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate); animation_iv.startAnimation(myAnimation); break; } }}
在这里我分别创建了四个按钮点击事件去加载4个不同的动画效果。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#FFFFFF" tools:context="com.soft0754.animation.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/bt_alpha" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="透明动画" /> <Button android:id="@+id/bt_scale" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="收缩动画" /> <Button android:id="@+id/bt_translate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="位移动画" /> <Button android:id="@+id/bt_rotate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="旋转动画" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <ImageView android:id="@+id/animation_iv" android:src="@drawable/pc" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout></LinearLayout>
布局文件中没什么的就是只有4个按钮和我们一张要展示的动画图片对象,好了下面我们一起看看运行后的效果图。
八、Animation其他常用的方法
1、setFillAfter(boolean fillAfter)
如果fillAfter的值为true,则表示动画执行后,控件停留在执行结束时候的状态。
2、setFillBefore(boolean fillBefore)
如果fillAfter的值为true,则表示动画执行后,控件将回到动画执行之前的状态。
3、 setStartOffset(long startOffset)
设置动画执行之前的等待时间。
4、setRepeatCount(int repeatCount)
设置动画的重复播放次数。
5、setRepeatMode(int repeatMode)
设置动画的重复播放的模式,在这里分别有两种模式,一种是RESTART表示重新开始重复执行,另一种是REVERSE表示反向执行。
不过这里需要注意的是:重复播放次数必须和重复播放模式加在一起才能起到作用。
当然了,这些常用方法你也可以定义在xml文件中,例如我在xml定义一个旋转动画为360度,重复2次并且播放模式为重新开始的物件:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:duration="3000" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:repeatMode="restart" android:repeatCount="2" android:toDegrees="+360"> </rotate></set>
效果如下:
九、Animation--list逐帧动画的基本介绍
一说起Animationlist增动画的实现,现在越来越多手机App在启动页面中都有一个加载动画效果,类似于美团,饿了么等等,动画效果非常好看,而这个加载动画效果可以采用Animation-list逐帧动画去实现,那么如何实现呢,现在让我们来一起学习吧!
首先我们先看看效果图:
大家有没有发现,所谓逐帧动画就是一张张图片合并在一起,让他实现动态旋转的这样一个过程,我这里分别准备了12张图片资源,如下图:
其实这12张我是从网上下载1张过来的而已,也就是上图中的第一张是原图的,然后我通过ps去旋转它,由于旋转了1圈,我这里12张图片资源,所以每张图片我通过ps转换的角度就是30度。当然了,以后如果需要逐帧动画最好的让公司美工妹子给你准备吧,细心的你其实应该发现了图片旋转的时候看起来不是效果很好,哈哈,其实是的,那可能是因为图片在ps处理旋转后保存的中心点定位不准的原因。所以我们看起来效果并不是很好。下面让我们一起来看看逐帧动画是如何实现的。
十、Animation--list逐帧动画的基本实现
1、准备好图片资源,这里我采用的是12张图片
2、在res-drawable目录下新建my_list.xml文件,
这里需要注意的是Animation--list逐帧动画资源是放在drawable目录下的,而不是anim目录下的。
3、在my_list.xml文件里面编写逐帧动画代码,代码如下:
<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <!--其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画 drawable表示每一个逐帧动画的图片资源,我这里采用一共有12帧 duration表示每一帧执行的时间 --> <item android:drawable="@drawable/list_1" android:duration="50"> </item> <item android:drawable="@drawable/list_2" android:duration="50"> </item> <item android:drawable="@drawable/list_3" android:duration="50"> </item> <item android:drawable="@drawable/list_4" android:duration="50"> </item> <item android:drawable="@drawable/list_5" android:duration="50"> </item> <item android:drawable="@drawable/list_6" android:duration="50"> </item> <item android:drawable="@drawable/list_7" android:duration="50"> </item> <item android:drawable="@drawable/list_8" android:duration="50"> </item> <item android:drawable="@drawable/list_9" android:duration="50"> </item> <item android:drawable="@drawable/list_10" android:duration="50"> </item> <item android:drawable="@drawable/list_11" android:duration="50"> </item> <item android:drawable="@drawable/list_12" android:duration="50"> </item></animation-list>这里逐帧动画xml代码已经定义好了,下面让我们一起来看看怎么去启动或者停止我们这个定义好的my_list.xml逐帧动画。
4、启动或停止逐帧动画
import android.graphics.drawable.AnimationDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.animation.Animation;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button bt_list; private AnimationDrawable animationDrawable; private ImageView animation_iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { bt_list= (Button) this.findViewById(R.id.bt_list); animation_iv= (ImageView) this.findViewById(R.id.animation_iv); bt_list.setOnClickListener(this); //设置图片控件一开始应用的是我们的逐帧动画资源 animation_iv.setImageResource(R.drawable.my_list); //给逐帧动画资源赋值 animationDrawable = (AnimationDrawable) animation_iv.getDrawable(); //先设置动画一开始进来是停止的,这里默认是启动的 animationDrawable.stop(); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.bt_list: //判断是否逐帧动画是否正在运行,如果正在运行的话我们点击按钮时候让它停止,否则启动逐帧动画 if (animationDrawable.isRunning()) { animationDrawable.stop(); }else { animationDrawable.start(); //启动逐帧动画 } break; } }}
有关于Android中的动画其实还有很多,由于时间关系未能给大家一一讲解,其他动画当中例如还有集合动画,抛物线动画等等,以后有机会的话再给大家讲解,此致!此文章到此结束!希望对大家在日常开发当中有所帮助!
- Android--Animation动画的基本使用与介绍
- Core Animation(核心动画)的基本介绍与使用
- Android Animation 动画的使用方法与介绍
- android的属性动画Property Animation介绍及其使用
- android Animation动画介绍
- Android Animation(动画)介绍
- Android基本的动画& animation工具类
- Android的Tween Animation动画介绍
- Android Animation 动画的使用方法和介绍
- Android Animation 动画的使用方法和介绍
- Android Animation 动画的使用方法和介绍
- Android Animation 动画的使用方法和介绍
- Android中补间动画2----Animation的基本使用代码实现复合使用
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- golang-Map
- Shell中快速切换多个目录
- Junit如何进行多线程测试
- 滚动加载更多的代码
- chain.doFilter(request,response)含义
- Android--Animation动画的基本使用与介绍
- JMS基本概念
- vagrant up时遇到ARPCHECK=no /sbin/ifup eth1 2> /dev/null问题
- 移动端那些事儿(三)移动端开发流行单位rem
- 【09】vue.js — 解决添加重复数据报错问题
- 基于extjs4 + svg工作流编辑器设计
- 路由传值介绍
- 2017.9.7 JC loves Mkk 失败总结
- Deep Learning 了解有感