【Android 基础】详解Animation 动画介绍和实现
在前面 popupwindow 实现显示仿腾讯新闻底部弹出菜单有用到animation动画效果来实现菜单的显示和隐藏,本文就来介绍下吧。
1.animation 动画类型
android的animation由四种类型组成:
xml中
alph | 渐变透明度动画效果 |
scale | 渐变尺寸伸缩动画效果 |
translate | 画面转换位置移动动画效果 |
rotate | 画面转移旋转动画效果 |
javacode中
alphaanimation | 渐变透明度动画效果 |
scaleanimation | 渐变尺寸伸缩动画效果 |
translateanimation | 画面转换位置移动动画效果 |
rotateanimation | 画面转移旋转动画效果 |
2.android动画模式
animation主要有两种动画模式:
一种是tweened animation(渐变动画)
xml中 | javacode |
alpha | alphaanimation |
scale | scaleanimation |
一种是frame by frame(画面转换动画)
xml中 | javacode |
translate | translateanimation |
rotate | rotateanimation |
3.如何在xml文件中定义动画
步骤如下:
①新建 android 项目
②在res目录中新建anim文件夹
③在anim目录中新建一个my_anim.xml(注意文件名小写)
④在 my_anim.xml 加入动画代码
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha /> <scale /> <translate /> <rotate /> </set>
4.android动画解析--xml
4.1 alpha 渐变透明度动画效果
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="1000" android:fromalpha="0.0" android:toalpha="1.0" /> <!-- 透明度控制动画效果 alpha 浮点型值: fromalpha 属性为动画起始时透明度 toalpha 属性为动画结束时透明度 说明: 0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之间的float数据类型的数字 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
4.2 scale 渐变尺寸伸缩动画效果
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="1000" android:fillafter="false" android:fromxscale="0.0" android:fromyscale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotx="50%" android:pivoty="50%" android:toxscale="1.4" android:toyscale="1.4" /> </set><!-- 尺寸伸缩动画效果 scale 属性:interpolator 指定一个动画的插入器 在我试验过程中,使用android.res.anim中的资源时候发现 有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 浮点型值: fromxscale 属性为动画起始时 x坐标上的伸缩尺寸 toxscale 属性为动画结束时 x坐标上的伸缩尺寸 fromyscale 属性为动画起始时y坐标上的伸缩尺寸 toyscale 属性为动画结束时y坐标上的伸缩尺寸 说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 pivotx 属性为动画相对于物件的x坐标的开始位置 pivoty 属性为动画相对于物件的y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的x或y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 布尔型值: fillafter 属性 当设置为true ,该动画转化在动画结束后被应用 -->
4.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="30" android:fromydelta="30" android:toxdelta="-80" android:toydelta="300" /> <!-- translate 位置转移动画效果 整型值: fromxdelta 属性为动画起始时 x坐标上的位置 toxdelta 属性为动画结束时 x坐标上的位置 fromydelta 属性为动画起始时 y坐标上的位置 toydelta 属性为动画结束时 y坐标上的位置 注意: 没有指定fromxtype toxtype fromytype toytype 时候, 默认是以自己为相对参照物 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
4.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:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotx="50%" android:pivoty="50%" android:todegrees="+350" /> <!-- rotate 旋转动画效果 属性:interpolator 指定一个动画的插入器 在我试验过程中,使用android.res.anim中的资源时候发现 有三种动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 浮点数型值: fromdegrees 属性为动画起始时物件的角度 todegrees 属性为动画结束时物件旋转的角度 可以大于360度 说明: 当角度为负数——表示逆时针旋转 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) pivotx 属性为动画相对于物件的x坐标的开始位置 pivoty 属性为动画相对于物件的y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的x或y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> </set>
5.如何使用xml中的动画效果
public static animation loadanimation (context context, int id) //第一个参数context为程序的上下文 //第二个参数id为动画xml文件的引用 //例子: myanimation= animationutils.loadanimation(this,r.anim.my_anim); //使用animationutils类的静态方法loadanimation()来加载xml中的动画xml文件
6.如何使用xml中的动画效果
//在代码中定义 动画实例对象 private animation myanimation_alpha; private animation myanimation_scale; private animation myanimation_translate; private animation myanimation_rotate; //根据各自的构造方法来初始化一个实例对象 myanimation_alpha=new alphaanimation(0.1f, 1.0f); myanimation_scale =new scaleanimation(0.0f, 1.4f, 0.0f, 1.4f, animation.relative_to_self, 0.5f, animation.relative_to_self, 0.5f); myanimation_translate=new translateanimation(30.0f, -80.0f, 30.0f, 300.0f); myanimation_rotate=new rotateanimation(0.0f, +350.0f, animation.relative_to_self,0.5f,animation.relative_to_self, 0.5f);
7.android动画解析--javacode
7.1 alphaanimation
① alphaanimation类对象定义
private alphaanimation myanimation_alpha
② alphaanimation类对象构造
//第一个参数fromalpha为 动画开始时候透明度 //第二个参数toalpha为 动画结束时候透明度 alphaanimation(float fromalpha, float toalpha) //说明:0.0表示完全透明,1.0表示完全不透明 myanimation_alpha=new alphaanimation(0.1f, 1.0f);
③ 设置动画持续时间
//设置时间持续时间为 5000毫秒 myanimation_alpha.setduration(5000);
7.2 scaleanimation
① scaleanimation类对象定义
private alphaanimation myanimation_alpha;
② scaleanimation类对象构造
scaleanimation(float fromx, float tox, float fromy, float toy, int pivotxtype, float pivotxvalue, int pivotytype, float pivotyvalue) //第一个参数fromx为动画起始时 x坐标上的伸缩尺寸 //第二个参数tox为动画结束时 x坐标上的伸缩尺寸 //第三个参数fromy为动画起始时y坐标上的伸缩尺寸 //第四个参数toy为动画结束时y坐标上的伸缩尺寸 /*说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 */ //第五个参数pivotxtype为动画在x轴相对于物件位置类型 //第六个参数pivotxvalue为动画相对于物件的x坐标的开始位置 //第七个参数pivotxtype为动画在y轴相对于物件位置类型 //第八个参数pivotyvalue为动画相对于物件的y坐标的开始位置 myanimation_scale =new scaleanimation(0.0f, 1.4f, 0.0f, 1.4f, animation.relative_to_self, 0.5f, animation.relative_to_self, 0.5f);
③ 设置动画持续时间
//设置时间持续时间为 700毫秒 myanimation_scale.setduration(700);
7.3 translateanimation
① translateanimation类对象定义
private alphaanimation myanimation_alpha;
② translateanimation类对象构造
//第一个参数fromxdelta为动画起始时 x坐标上的移动位置 //第二个参数toxdelta为动画结束时 x坐标上的移动位置 //第三个参数fromydelta为动画起始时y坐标上的移动位置 //第四个参数toydelta为动画结束时y坐标上的移动位置 translateanimation(float fromxdelta, float toxdelta,float fromydelta, float toydelta)
③ 设置动画持续时间
//设置时间持续时间为 2000毫秒 myanimation_translate.setduration(2000);
7.4 rotateanimation
① rotateanimation类对象定义
private alphaanimation myanimation_alpha;
② rotateanimation类对象构造
rotateanimation(float fromdegrees, float todegrees,int pivotxtype, float pivotxvalue, int pivotytype, float pivotyvalue) //第一个参数fromdegrees为动画起始时的旋转角度 //第二个参数todegrees为动画旋转到的角度 //第三个参数pivotxtype为动画在x轴相对于物件位置类型 //第四个参数pivotxvalue为动画相对于物件的x坐标的开始位置 //第五个参数pivotxtype为动画在y轴相对于物件位置类型 //第六个参数pivotyvalue为动画相对于物件的y坐标的开始位置 myanimation_rotate=new rotateanimation(0.0f, +350.0f,animation.relative_to_self,0.5f,animation.relative_to_self, 0.5f);
③ rotateanimation类对象构造
//设置时间持续时间为 3000毫秒 myanimation_rotate.setduration(3000);
8.如何使用java代码中的动画效果
使用从view父类继承过来的方法startanimation()来为view或是子类view等等添加一个动画效果
public void startanimation (animation animation)
9.还是来个栗子吧
9.1 使用xml文件方式
①效果图如下:
②在xml文件中定义动画,前面已提及
③主界面布局,这没啥好说的,很简单 o(∩_∩)o
④主界面逻辑代码,主要就是这个了,控制动画显示
package com.yanis.base; import android.app.activity; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.view.animation.animation; import android.view.animation.animationutils; import android.widget.button; import android.widget.imageview; public class animationactivity extends activity implements onclicklistener { private imageview imgpic; private button btnalpha, btnscale, btntranslate, btnrotate; private animation myanimation; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_animation); intiview(); initdata(); } /** * 初始化组件 */ private void intiview() { imgpic = (imageview) findviewbyid(r.id.imgpic); btnalpha = (button) findviewbyid(r.id.btnalpha); btnscale = (button) findviewbyid(r.id.btnscale); btntranslate = (button) findviewbyid(r.id.btntranslate); btnrotate = (button) findviewbyid(r.id.btnrotate); } /** * 初始化数据 */ private void initdata() { btnalpha.setonclicklistener(this); btnscale.setonclicklistener(this); btntranslate.setonclicklistener(this); btnrotate.setonclicklistener(this); } @override public void onclick(view v) { switch (v.getid()) { case r.id.btnalpha: /** * 使用xml中的动画效果 第一个参数context为程序的上下文 第二个参数id为动画xml文件的引用 */ myanimation = animationutils.loadanimation(this, r.anim.alpha_anim); imgpic.startanimation(myanimation); break; case r.id.btnscale: myanimation = animationutils.loadanimation(this, r.anim.scale_anim); imgpic.startanimation(myanimation); break; case r.id.btntranslate: myanimation = animationutils.loadanimation(this, r.anim.translate_anim); imgpic.startanimation(myanimation); break; case r.id.btnrotate: myanimation = animationutils .loadanimation(this, r.anim.rotate_anim); imgpic.startanimation(myanimation); break; } } }
10. 用animation-list实现逐帧动画
栗子效果图如下:
步骤如下:
①在res/drawable目录添加图片素材
②在drawable文件夹中添加动画animation-list帧布局文件
<?xml version="1.0" encoding="utf-8"?> <!-- 根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画 根标签下,通过item标签对动画中的每一个图片进行声明 android:duration 表示展示所用的该图片的时间长度 --> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/cmmusic_progress_1" android:duration="150"> </item> <item android:drawable="@drawable/cmmusic_progress_2" android:duration="150"> </item> <item android:drawable="@drawable/cmmusic_progress_3" android:duration="150"> </item> <item android:drawable="@drawable/cmmusic_progress_4" android:duration="150"> </item> <item android:drawable="@drawable/cmmusic_progress_5" android:duration="150"> </item> <item android:drawable="@drawable/cmmusic_progress_6" android:duration="150"> </item> <item android:drawable="@drawable/cmmusic_progress_7" android:duration="150"> </item> <item android:drawable="@drawable/cmmusic_progress_8" android:duration="150"> </item> </animation-list>
③主界面页面布局设置,太简单,不赘述了
④主界面代码如下:
package com.yanis.base; import android.app.activity; import android.graphics.drawable.animationdrawable; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.imageview; public class animationactivity extends activity implements onclicklistener { private imageview imgpic; private button btnstart, btnstop; private animationdrawable animationdrawable; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_animation); intiview(); initdata(); } /** * 初始化组件 */ private void intiview() { imgpic = (imageview) findviewbyid(r.id.imgpic); btnstart = (button) findviewbyid(r.id.btnstart); btnstop = (button) findviewbyid(r.id.btnstop); } /** * 初始化数据 */ private void initdata() { btnstart.setonclicklistener(this); btnstop.setonclicklistener(this); //sets a drawable as the content of this imageview. imgpic.setimageresource(r.drawable.loading_anim); //给动画资源赋值 animationdrawable = (animationdrawable) imgpic.getdrawable(); } @override public void onclick(view v) { switch (v.getid()) { case r.id.btnstart: animationdrawable.start();//开始 break; case r.id.btnstop: animationdrawable.stop(); //停止 break; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: java实现拉钩网上的FizzBuzzWhizz问题示例
下一篇: 安卓帧渲染数据获取方式小结
推荐阅读
-
【Android 基础】详解Animation 动画介绍和实现
-
Android 基础-动画设计和实现
-
【Android 基础】Animation 动画介绍和实现_html/css_WEB-ITnose
-
【Android 基础】Animation 动画介绍和实现_html/css_WEB-ITnose
-
Android Animation 动画介绍与详解
-
Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
-
android动画介绍Animation 实现loading动画效果_html/css_WEB-ITnose
-
如何用纯CSS方式实现CSS动画的暂停与播放效果?animation-play-state属性介绍(详解)
-
如何用纯CSS方式实现CSS动画的暂停与播放效果?animation-play-state属性介绍(详解)
-
android动画介绍Animation 实现loading动画效果_html/css_WEB-ITnose