我们在使用一些控件时候,难免会设置一些进入和退出的动画效果,比如popupwindow、listview的item动画、按钮、图片等等,要使这些控件有动画效果,当然需要用到Animation了。

下面我们就来讲讲Animation有哪些动画效果吧。

Android的Animation由四种类型组成:alpha、scale、translate、rotate,对应的效果如下:

XML配置文件startAnimation(animation);

alpha
渐变透明度动画效果
scale
渐变尺寸伸缩动画效果
translate
画面转换位置移动动画效果
rotate
画面转移旋转动画效果

xml配置文件是放在anim目录下的:

新建动画xml文件,动画效果都是通过这几个属性控制的:



我先来看看怎么使用Animation吧,最后我会逐个讲讲每个标签的属性及用法,使用Animation有三个方法:

1、第一个方法,就是先加载anim目录下的xml文件,通过Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha)得到这个xml文件的动画效果(这个是通用的得到动画效果的,还有每个动画对应的单独的类),然后通过各个控件的button.setAnimation(animation)或者button.startAnimation(animation)方法可以设置动画,startAnimation()是显示控件立即执行动画的,我们一般用它,设置的动画是显示控件的时候有动画效果的。

当然也可以在这个xml文件中,不用set属性设置多个集合的动画效果,可以单独的设置为某一种,得到一种动画效果,即还是用上面那个通用的方法加载xml文件的动画,其它的也是如此。当然也可以不用xml文件得到动画,可以用相应的属性类来操作,即,AlphaAnimation
alpha = new AlphaAnimation(fromAlpha, toAlpha)来设置透明度的变化从而得到该动画效果,其它的也是一样的,都有对应的类,但是如果我们想用代码操作不用xml文件来得到多个复合动画效果,那该怎么做呢?答案是通过:AnimationSet对象(我把它称为动画集合)来操作的:

		AnimationSet set = new AnimationSet(true);//这个参数ture的意思是该动画集合里的所有动画类型的差值器都用该动画集合设置的(即set.setInterpolator(Interpolator i)设置的),即不用自己的单独设置(alpha.setInterpolator(i)或在xml文件中设置)的插值器,设置为false就是用每个动画类型自己设置的插值器,插值器其实就是一个内置的有指定动画效果的东西,后面我会讲。
		AlphaAnimation alpha = new AlphaAnimation(1.0f, 0.0f);//透明度从不透明到完全透明
		alpha.setDuration(1000);//设置动画持续的时间
		set.addAnimation(alpha);//添加一个透明度变化的动画效果,其它的效果也是这样添加

这样,我们就可以通过纯代码来设置多个复合的效果了。一般控件有setAnimation方法来设置的动画是显示后不要消失的。

2、第二个方法,这个方法多用于popupWindow的进入效果和退出效果,因为这个是通过style样式来设置的,popupWindow中没有setAnimation方法,只能通过popWindow.setAnimationStyle(R.style.showPopupAnimation);来设置,所以它可以设置进入和退出效果,这个是显示后需要消失的。废话不多说,这个设置动画直接是使用xml文件,不需要代码的,这里以透明效果为例,当然做复合效果也行。上代码吧:

2.1anim文件夹下的代码:alpha_in.xml

<?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>
</set>

alpha_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <alpha
        android:duration="1000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

</set>

上面的两段代码分别是进入和退出的动画效果。

2.2【注意】最重要的是在values文件夹下的styles.xml中进行配置:





配置的代码为:添加下面一段代码即可:

 <style name="showPopupAnimation" parent="android:Animation">  <!--name为调用这个style动画的名字,自己设置的-->
        <item name="android:windowExitAnimation">@anim/alpha_exit</item><!-- 退出动画-->
        <item name="android:windowEnterAnimation">@anim/alpha_in</item><!--- 进入动画->
 </style>

2.3最后再调用这个style即可

public void pop(){
		View view = getLayoutInflater().inflate(R.layout.view, null);
		PopupWindow popWindow = new PopupWindow(view, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
		popWindow.setOutsideTouchable(true);
		popWindow.setBackgroundDrawable(new BitmapDrawable());
		popWindow.setAnimationStyle(R.style.showPopupAnimation);
		popWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
	}

3、还有一个就是用来控制Activity直接跳转时用的overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out);这种很简单,直接把xml文件拿来用即可,注意,这个overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out);必须放在startActivity()之后。

好了,Animation动画效果就讲到这里了。

接下来讲内置的Interpolator插值器的动画参数效果和怎么结合Animation来使用。插值器顾名思义就是把某一个动画效果插入到另一个地方中使用。

首先,先给出插值器的各个参数的动画效果吧

Interpolator的系统值有下面几个:

意义如下:

  • AccelerateDecelerateInterpolator   在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
  • AccelerateInterpolator                     在动画开始的地方速率改变比较慢,然后开始加速
  • AnticipateInterpolator                      开始的时候向后然后向前甩
  • AnticipateOvershootInterpolator     开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator                          动画结束的时候弹起
  • CycleInterpolator                             动画循环播放特定的次数,速率改变沿着正弦曲线
  • DecelerateInterpolator                    在动画开始的地方快然后慢
  • LinearInterpolator                            以常量速率改变
  • OvershootInterpolator                      向前甩一定值后再回到原来位置

那么,怎么使用插值器呢?

1、在anim目录下的xml文件中,我们可以通过android:interpolator=""属性来设置插值器的值,即:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:fillAfter="true"
    android:fromDegrees="0"
    <span style="color:#ff0000;">android:interpolator="@android:anim/overshoot_interpolator"</span>
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="-650" >
</rotate>

2、在代码中设置,即通过

Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha_exit);
anim.setInterpolator(new AccelerateInterpolator());
//或者
AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f);
<span style="color:#ff0000;">alpha.setInterpolator(new AccelerateInterpolator());</span>

设置之后,再用相应控件启动已经具有插值器值的animation,即button.startAnimation(anim);这样就启动具有动画的控件了,该控件就具有了所设置的插值器中的动画了。

【注意】设置控件动画时候用代码写和用xml都可以,都可以有一样的效果,但是在用xml设置插值器值的时候,必须把插值器的值设置在xml文件的最外层的属性中,不然不会生效的,即:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
   <span style="color:#ff0000;"> android:interpolator="@android:anim/bounce_interpolator"</span>>

    <alpha
        android:duration="1000"
        android:fromAlpha="1.0"
        android:interpolator="@android:anim/overshoot_interpolator"
        android:toAlpha="0.0" />

</set>
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:fillAfter="true"
    android:fromDegrees="0"
    android:interpolator="@android:anim/overshoot_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="-650" >
</rotate>

所以这点一定要注意!!!

最后总结一下,动画效果和插值器效果,一般的控件能用代码写我推荐就是用代码写,少用xml写,因为代码写起来好方便,构造函数中就可以把属性的值设置完,除非只能通过setAnimationStyle()来设置动画的控件就用xml+styles来写。

请勿转载------------

Android之Animation动画的使用(一)的更多相关文章

  1. Android Property Animation动画

    3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...

  2. Android之Animation动画各属性的参数意思(二)

    现在就来讲讲Animation里这四个标签的属性. 一.这四个标签alpha.scale.translate.rotate共有的属性为: android:duration        动画持续时间, ...

  3. android中Animation动画的连续播放与播放完毕后停留在最后的状态

    我们做安卓应用的苦逼程序员们常常会需要用到Animation也就是动画.比如做地图功能的时候.我们在手机旋转时需要根据手机重力感应来调整地图的角度,让它上面的“北”一直指向地球的北面...好多人做动画 ...

  4. android 补间动画和Animation

    介绍: 补间动画是一种设定动画开始状态.结束状态,其中间的变化由系统计算补充.这也是他叫做补间动画的原因. 补间动画由Animation类来实现具体效果,包括平移(TranslateAnimation ...

  5. 【Android 基础】Animation 动画介绍和实现

    在前面PopupWindow 实现显示仿腾讯新闻底部弹出菜单有用到Animation动画效果来实现菜单的显示和隐藏,本文就来介绍下吧. 1.Animation 动画类型 Android的animati ...

  6. Android中xml设置Animation动画效果详解

    在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...

  7. android中设置Animation 动画效果

    在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...

  8. android Animation 动画效果介绍

    Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动 ...

  9. Android Animation 动画属性

    在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现: 一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...

随机推荐

  1. [HAOI 2006]旅行comf

    Description 题库链接 给你一个 \(n\) 个点, \(m\) 条边的无向图.并给出一个点对 \((s,t)\) ,求 \(s,t\) 间的一条路径,使得路径上最大边和最小边的比值最小. ...

  2. [SDOI 2015]约数个数和

    Description  设d(x)为x的约数个数,给定N.M,求 $\sum^N_{i=1}\sum^M_{j=1}d(ij)$ Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试 ...

  3. [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔

    Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...

  4. 51nod 1514 美妙的序列

    Description 长度为n的排列,且满足从中间任意位置划分为两个非空数列后,左边的最大值>右边的最小值.问这样的排列有多少个%998244353 题面 Solution 正难则反 \(f[ ...

  5. PKUWC 2018 滚粗记

    day0 上午居然考了一场考试,大爆炸,攒了一波RP,下午也没有心思去落实题目,而是一心去搞颓废,到了晚上看时间还早,于是就看了一波上午考试的Solution,懵逼.jpg day1 上午考数学,前一 ...

  6. hdu 5727 二分图+环排列

    Necklace Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  7. Python SMTP邮件发送

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块: email负责构造邮件 ...

  8. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件

    Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...

  9. Springboot项目maven多模块拆分

    多模块拆分的必要性 使用Java技术开发的工程项目,无论是数据处理系统还是Web网站,随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂这时候工程的进展就会遇到各种 ...

  10. Intellij IDEA自动编译问题

    对IDEA的界面很有爱,但是感到他的项目启动速度太慢了.所以查了资料做了优化. 1:开启自动测试 File->setting->compiler 勾选上上面的,     2修改run/de ...