提供资源demo:http://download.youkuaiyun.com/detail/bobo8945510/9628739
在Android开发中其实用到动画的时候并不是很常见,它可以分为两大类!
逐帧动画
逐帧(Frame)是最容易理解的动画,他要求开发者把动画过程的每张静态图片都收集起来,然后由Android来控制依次显示这些静态图片,然后利用人眼“视觉暂留”的原理,给用户造成“动画”的错觉。与放电影原理完全一样。
补间动画
开发者无需逐一定义动画过程,只要定义了动画开始和动画结束的关键帧,并制定动画持续时间
即可
咱们首先看下逐帧动画:
效果图如下:
这是一个很简单的逐帧动画,这是疯狂Android讲义书本上的小例子,下面咱们来分析怎么实现的
重点知识
1、资源的设置,其实就是动画的每一帧对应一张图片,放在资源文件中,在项目功能中引用。
2、// 获取AnimationDrawable动画对象final AnimationDrawable anim = (AnimationDrawable) imageView .getBackground();
- 资源定义
定义逐帧动画很容易,资源文件是一个.xml,可以放在res目录drawable包下,也可以自己创建一个anim包,其中android:oneshot=”false” 表示不循环:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!-- 添加多个帧 -->
<item android:drawable="@drawable/fat_po_f01" android:duration="60" />
<item android:drawable="@drawable/fat_po_f02" android:duration="60" />
<item android:drawable="@drawable/fat_po_f03" android:duration="60" />
......
</animation-list>
- 代码如何引用
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (Button) findViewById(R.id.play);
stop = (Button) findViewById(R.id.stop);
imageView = (ImageView) findViewById(R.id.anim);
// 获取AnimationDrawable动画对象
final AnimationDrawable anim = (AnimationDrawable) imageView .getBackground();
play.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// 开始播放动画
anim.start();
}
});
stop.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// 停止播放动画
anim.stop();
}
});
}
- 好吧,这个例子就是那么简单。
- dome地址:http://download.youkuaiyun.com/detail/bobo8945510/9627045
咱们再来看看补间动画:
1、Animation的简介
补间动画,包含四种类型
1、TranslateAnimation:位移变化的动画,创建该动画时只要指定动画开始时的位置(以X、Y坐标来表示)、结束时的位置(以X、Y坐标来表示),并指定动画持续时间即可。
2、RotateAnimation: 旋转动画,创建该动画时只要指定动画开始时的旋转角度,结束时的旋转角度。并制定动画持续时间即可。这里也需要指定中心点。
3、AlphaAnimation:透明度改变的动画。创建该动画时要指定动画开始时的透明度、结束时的透明度和持续时间即可,其中透明度可以0变化到1。
4、ScaleAnimation:大小缩放的动画。创建改动画时要指定动画开始时的缩放比(依据的是X、Y轴的缩放参数来表示)、结束时动画比(依据的是X、Y轴的缩放参数来表示),并指定动画持续时间。由于缩放时以不同点为中心时缩放效果不一样,所以指定缩放动画时还要通过pivotX、pivotY来指定“缩放中心”!
2、Animation的属性详解
- API文章地址:http://www.apihome.cn/api/android/Animation.html
- 图解如下:
3、Animation的实现讲解
(一)、定义资源样式,在项目中引用。dome中MainActivity类
定义一个资源文件,如下图:(我定义了两种,其中参数的意思下文会有详细讲解)
在代码中直接引用即可。
private ImageView flower;
private Button bn;
private Animation animation,animation_two;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
flower = (ImageView) findViewById(R.id.flower);
//加载第一份动画资源
animation = AnimationUtils.loadAnimation(this,R.anim.anim);
animation.setFillAfter(true);//设置动画结束后的状态
// 加载第二份动画资源
animation_two = AnimationUtils.loadAnimation(this,R.anim.reverse);
animation_two.setFillAfter(true);//设置动画结束后的状态
bn = (Button) findViewById(R.id.but_Trans);
bn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//开始动画
flower.startAnimation(animation);
//flower.startAnimation(animation_two);
}
});
}
(二)、在代码中定义自己需要的参数,dome中FourStateAnimationActivity类
- TranslateAnimation动画效果:
效果图,是我自己合成,所以效果很烂
![]()
.
下面是代码,可直接引用:
private void setTransAnimation() {
/*
* 用于控制View对象进行多个动作的组合,该类继承于Animation类,例如四中类型动画可以混合使用
* */
set = new AnimationSet(true);
//用来定义,是否停止到动画结束的位置
set.setFillAfter(true);
/*
* float fromXDelta 动画开始的点离当前View X坐标上的差值
* float toXDelta 动画结束的点离当前View X坐标上的差值
* float fromYDelta 动画开始的点离当前View Y坐标上的差值
* float toYDelta 动画开始的点离当前View Y坐标上的差值
* 起始点X轴坐标(数值、譬如50表示以当前View左上角坐标加50px为初始点、
* 50%表示以当前View的左上角加上当前View宽高的50%做为初始点、
* 50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
* */
TranslateAnimation translate = new TranslateAnimation(0, 0, 0,380);
translate.setDuration(5000);
translate.setFillAfter(true);
set.addAnimation(translate);
flower.startAnimation(set);//给图片设置动画效果
}
- RotateAnimation: 旋转动画效果:
效果图,是我自己合成,所以效果很烂
![]()
>
下面是代码,可直接引用:
private void setRotateAnimation() {
/*
* 用于控制View对象进行多个动作的组合,该类继承于Animation类,例如四中类型动画可以混合使用
* */
set = new AnimationSet(true);
/*
* 旋转开始角度,正代表顺时针度数,负代表逆时针度数
* float fromDegrees:旋转的开始角度。
* float toDegrees:旋转的结束角度。
* int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
* float pivotXValue:X坐标的伸缩值。
* int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
* float pivotYValue:Y坐标的伸缩值。
* */
RotateAnimation rotateAnimation = new RotateAnimation(0f,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(5000);//执行时间
rotateAnimation.setFillAfter(false);//执行时间
rotateAnimation.setRepeatCount(3);//执行的次数
set.addAnimation(rotateAnimation);
flower.startAnimation(set);//给图片设置动画效果
}
- AlphaAnimation:: 透明度动画效果:
效果图,是我自己合成,所以效果很烂
![]()
.
下面是代码,可直接引用:
private void setAlphaAnimation() {
/*
* 用于控制View对象进行多个动作的组合,该类继承于Animation类,例如四中类型动画可以混合使用
* */
set = new AnimationSet(true);
/*
* 动画开始的透明度(0.0到1.0,0.0
* 是全透明,1.0是不透明)
* */
AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);
alphaAnimation.setDuration(5000);
alphaAnimation.setFillAfter(true);
//添加上面的动画效果
set.addAnimation(alphaAnimation);
flower.startAnimation(set);//给图片设置动画效果
}
- ScaleAnimation:大小变化动画效果:
效果图,是我自己合成,所以效果很烂
![]()
.
下面是代码,可直接引用:
private void setScaleAnimation() {
/*
* 用于控制View对象进行多个动作的组合,该类继承于Animation类,例如四中类型动画可以混合使用
* */
set = new AnimationSet(true);
/*
* float fromX 动画起始时 X坐标上的伸缩尺寸
*float toX 动画结束时 X坐标上的伸缩尺寸
*float fromY 动画起始时Y坐标上的伸缩尺寸
*float toY 动画结束时Y坐标上的伸缩尺寸
*int pivotXType 动画在X轴相对于物件位置类型
*float pivotXValue 动画相对于物件的X坐标的开始位置
*int pivotYType 动画在Y轴相对于物件位置类型
*float pivotYValue 动画相对于物件的Y坐标的开始位置
* */
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0, 1, 0,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(5000);
scaleAnimation.setFillAfter(true);
set.addAnimation(scaleAnimation);
flower.startAnimation(set);//给图片设置动画效果
}
(三)、四中动画效果组合使用,dome中Animationstese类
混合使用
效果图:
>
代码如下
private void test() {
AnimationSet set = new AnimationSet(true);
set.setFillAfter(true);
// 添加旋转效果
RotateAnimation animation1 = new RotateAnimation(0f, 360f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
animation1.setRepeatCount(0);
animation1.setDuration(1000);
animation1.setFillAfter(true);
set.addAnimation(animation1);
// (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
// 添加位移效果
TranslateAnimation translate = new TranslateAnimation(0, 0, 0,380);
translate.setDuration(1000);
translate.setFillAfter(true);
set.addAnimation(translate);
flower.startAnimation(set);
}
引用
but_Trans = (Button)findViewById(R.id.but_Trans);
but_Trans.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//引用上方代码,效果:位移加旋转
test();
}
});
最后看一个类:Interpolator
Interpolator根据特定的算法计算出整个动画所需要动态插入帧的密度和位置,简单地说Interpolator负责控制动画的变化速度,这就使得基本的动画效果(Alpha、Scale、Translate、Rotate)能以匀速变化、加速、减速、抛物线速度等各种速度变化。
Interpolator 它定义了所有的Interpolator都需要实现的方法:float getInterpolation(float input) 开发者完全可以通过实现Interpolator来控制动画的变化速度。
Android为Interpotor提供了如下几个实现类,分别用于实现不同动画变化速度。
1、LinearInterpotor:动画以均匀的速度改变
2、AccelerateInterpotor:在动画开始的敌方改变速度较慢,然后开始加速(Accelerate: 使……加快;使……增速)
3、AccelerateDecelerateInterpolator:在动画开始、结束的敌方改变速度较慢,在中间的时间加速。
4、Cyclelnterpolator :动画循环播放特定的次数(读成塞口)
5、DecelerateInterpolator:在动画开始的敌方改变速度较快,然后减速。为了在动画资源文件中指定补间动画所使用的InterCeptor,定义补间动画的支持一个Android:interpolator属性,该属性的属性值可指定为Android默认支持的Interceptor。
例如:
@Android:anim/linear_interpolator写法是很规律的,他们就是把系统提供的Interpolator实现类的类名的驼峰写法改为中间下划线即可。