欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android-Animation

程序员文章站 2024-03-24 20:50:58
...

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代表此帧持续的时间,整数,单位为毫秒。

Android-Animation

 

用ImageView控件作为动画载体来显示动画

Android-Animation

 

动画的播放和停止:

Android-Animation

Android-Animation

Android-Animation

 

 

纯JavaCode实现:

Android-Animation

 

属性动画

使用属性动画注意事项:

1). object必须要提供setXxx方法,如果动画的时候没有传递初始值,那么还要提供getXxx方法,因为系统要去拿xxx属性的初始值(如果这条不满足,程序直接Crash)

2). object的setXxx对属性xxx所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)

【问题】

若view中某些属性不能提供具体的get/set方法,该如何解决?

【解决】

用一个类来包装原始对象,间接为其提供get和set方法。如图:

Android-Animation

利用ObjectAnimator对象完成对物件的属性动画:

第一个参数是动画作用的对象(以View为例,方便表达),第二个参数是View的一个“属性”名,第三个参数是一个长度可变的参数,它设置的是属性的值的变化

Android-Animation

这句代码的所实现的动画效果是将img控件的height属性变化从100-20-100,动画持续2秒

注:利用ObjectAnimator对象同样可以完成补间动画效果:

Android-Animation

 

视图动画与属性动画的对比:

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时 就没有过度动画了。

 

推荐阅读