我们在使用一些控件时候,难免会设置一些进入和退出的动画效果,比如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来写。

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

最新文章

  1. 带你玩转JavaWeb开发之四 -如何用JS做登录注册页面校验
  2. 【转载】oracle dbms_metadata.get_ddl的使用方法总结
  3. Nodejs进阶:如何将图片转成datauri嵌入到网页中去
  4. Xcode插件VVDocumenter Alcatraz KSImageNamed等安装
  5. Filco minila 的蛋疼。
  6. ZOJ2532_Internship
  7. Netty笔记
  8. 大批量DML操作应该注意什么?
  9. Hibernate应用SQL查询返回实体类型
  10. ScrollView 尽量避免嵌套RelativeLayout,非常惨痛的教训
  11. drop table xx purge
  12. Luogu Dynamic Ranking (带修改的主席树)
  13. python second lesson
  14. Menu实现逻辑
  15. mysql中的schema 等价于database,相当于一个数据库
  16. BCH/BCHABC/BCHSV分叉后重放机制小结
  17. [转]Unity3D新手引导开发手记
  18. Kubernetes 集群:规划与搭建
  19. pom.xml文件错误
  20. Golang学习途径总结

热门文章

  1. [Luogu 2062]分队问题
  2. UVA 5009 Error Curves
  3. [BZOJ]4405: [wc2016]挑战NPC(带花树)
  4. bzoj 4006: [JLOI2015]管道连接
  5. Python virtualenv 使用总结篇
  6. Python Socket第二篇(socketserver)
  7. decode-ways(动态规划)
  8. Chrome的First Paint
  9. Linux 定时执行任务:Crontab服务及应用集锦
  10. 一个成功的 Git 分支模型(适用于商业应用开发)