Android-Animation
Animation 动画类型
视图动画View Animation(补间动画Tween、帧动画Frame)
属性动画Property Animation
补间动画
补间动画类型
Android的补间动画由四种类型组成:
XML中
alph |
渐变透明度动画效果 |
scale |
渐变尺寸伸缩动画效果 |
translate |
画面转换位置移动动画效果 |
rotate |
画面转移旋转动画效果 |
JavaCode中
AlphaAnimation |
渐变透明度动画效果 |
ScaleAnimation |
渐变尺寸伸缩动画效果 |
TranslateAnimation |
画面转换位置移动动画效果 |
RotateAnimation |
画面转移旋转动画效果 |
补间动画模式
Animation主要有两种动画模式:
一种是tweened animation(渐变动画)
XML中 |
JavaCode |
alpha |
AlphaAnimation |
scale |
ScaleAnimation |
一种是frame by frame(画面转换动画)
XML中 |
JavaCode |
translate |
TranslateAnimation |
rotate |
RotateAnimation |
如何在XML文件中定义补间动画
步骤如下:
①新建 Android 项目
②在res目录中新建anim文件夹
③在anim目录中新建一个my_anim.xml(注意文件名小写)
④在my_anim.xml加入动画代码
使用XML中的补间动画效果
public static Animation loadAnimation (Context context, int id)
//第一个参数Context为程序的上下文
//第二个参数id为动画XML文件的引用
//示例:
myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_anim);
//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件
5.在Javacode中使用动画效果
//根据各自的构造方法来初始化一个实例对象
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);
//设置时间持续时间为 1000毫秒
myAnimation_Scale.setDuration(1000);
//设置物件的动画属性
imgPic.startAnimation(myAnimation);
帧动画
实现过程:
在res/drawable目录下一个文件framelist.xml,内容如下:
根节点是animation-list(动画列表),里面有一个或者多个item节点组成,oneshot属性表示是否只播放一次,true表示只会播放一次,false表示一直循环播放,内部用item节点声明一个动画帧,android:drawable指定此帧动画所对应的图片资源,android:druation代表此帧持续的时间,整数,单位为毫秒。
用ImageView控件作为动画载体来显示动画
动画的播放和停止:
纯JavaCode实现:
属性动画
使用属性动画注意事项:
1). object必须要提供setXxx方法,如果动画的时候没有传递初始值,那么还要提供getXxx方法,因为系统要去拿xxx属性的初始值(如果这条不满足,程序直接Crash)
2). object的setXxx对属性xxx所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)
【问题】
若view中某些属性不能提供具体的get/set方法,该如何解决?
【解决】
用一个类来包装原始对象,间接为其提供get和set方法。如图:
利用ObjectAnimator对象完成对物件的属性动画:
第一个参数是动画作用的对象(以View为例,方便表达),第二个参数是View的一个“属性”名,第三个参数是一个长度可变的参数,它设置的是属性的值的变化
这句代码的所实现的动画效果是将img控件的height属性变化从100-20-100,动画持续2秒
注:利用ObjectAnimator对象同样可以完成补间动画效果:
视图动画与属性动画的对比:
1.View Animation能做的,Property Animator也能做,View Animation做不到的,Property Animator也能做!比如修改背景颜色,比如View Animation要求使用的对象是一个View对象,而Property Animator却不需要,因为他主要修改的是对象属性。
2.View Animation交互性不好,比如你对TextView使用了动画从(0,0)点移动到(400,400),虽然视图上textView移动到了(400,400),但是textview的点击响应事件却在(0 ,0)点。而Property Animator却没有这个问题(因为他修改的textview的属性)。
3.Property Animator性能方面比View Animation要高一点。
Activity和Fragment的转场动画
Activity设置转场动画需要在startActivity和finish之后,意为给开启新视图或关闭旧视图添加转场动画。
overridePendingTransition方法:第一个参数是第一个activity进入时的动画,第二个参数则是第二个activity退出时的动画
//新acitivity从以后边向左边滑入页面
startActitivity(MainAcitity.this, NewActivity.class);
overridePendingTransition(R.anim.push_left_in_no_alph,
R.anim.push_left_out_no_alpha);
//需要销毁的Activity向右边屏幕边缘滑出页面
finish();
overridePendingTransition(R.anim.push_right_in_no_alpha,
R.anim.push_right_out_no_alpha);
//让返回键也执行动画
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
overridePendingTransition(R.anim.push_right_in_no_alpha,
R.anim.push_right_out_no_alpha);
}
Fragment的设置需要在transaction.add 或transaction.remove之前。
Fragment有两种方式,一种android提供了默认方法,一种自定义动画
//淡入淡出的默认动画
transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
//设置自定义过场动画
transaction.setCustomAnimations(
R.anim.push_left_in,
R.anim.push_left_out,
R.anim.push_left_in,
R.anim.push_left_out);
动画文件放置位置: res/anim/
注:当我们不想要Activity到另一个Activity的过度动画时候可以设置overridePendingTransition(0,0)这样切换Activity时 就没有过度动画了。
上一篇: Android判断手势方向
下一篇: keyframes动画
推荐阅读