前言
在学习了Android的动画之后,简单总结了一下,看完这篇文章就可以自己动手写一个简单的动画了
正文
Android中的动画可分为三种:
1、逐帧动画 FrameAnimation
2、补间动画 TweenAnimation
3、属性动画 PropertyAnimation
本文就来简单的介绍一下这三种动画
一、逐帧动画:FrameAnimation
每一张静止的动画依次显示出来。利用人眼暂时停留的错觉,得出的动画。
首先在drawable文件中添加文件。资源文件一般存放在res/drawable/目录当中。
帧动画的使用步骤
1、在drawable文件夹下创建帧动画的资源文件frame_animlist.xml 代码如下:
<animation-listxmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/icon_open"
android:duration="200"/>
<item
android:drawable="@drawable/icon_hell"
android:duration="200"/>
</animation-list>
其中:
duration:表示持续的时间
设置android:oneshot="false":设置为true:就表示指定的图片只切换一次
设置为false:就表示指定的item图片无限切换。默认为无限切换
2、在布局文件中用ImageView控件作为动画载体来显示动画,可设置两个button按钮来开启和停止动画
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
<Button
android:id="@+id/bt_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="start"/>
<Button
android:id="@+id/bt_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="stop"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/bt_start"
android:layout_toEndOf="@+id/bt_start"
android:layout_marginLeft="26dp"
android:layout_marginStart="26dp"/>
3、在java代码中设置控件的背景为动画资源文件。
iv. setBackgroundResource();
4、声明动画管理器,AnimationDrawable,通过获得控件的背景,对其进行初始化。
AnimationDrawable anima;//声明一个动画管理器对象
mImageView.setBackgroundResource(R.drawable.frame_animlist);
anima= (AnimationDrawable)mImageView.getBackground();
5、调用动画管理器的start,stop。开启和停止动画。
完整代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView mImageView;
private Button mBtStart,mBtStop;
private AnimationDrawable anima;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView= (ImageView) findViewById(R.id.iv);
mBtStart= (Button) findViewById(R.id.bt_start);
mBtStop= (Button) findViewById(R.id.bt_stop);
mImageView.setBackgroundResource(R.drawable.frame_animlist);
anima= (AnimationDrawable)mImageView.getBackground();
mBtStart.setOnClickListener(this);
mBtStop.setOnClickListener(this);
}
@Override
public voidonClick(View view) {
switch(view.getId()){
caseR.id.bt_start:
anima.start();
break;
caseR.id.bt_stop:
anima.stop();
break;
default:
break;
}
}
}
二、补间动画:TweenAnimation
补间动画是指开发者只需要提供动画开始和结束的关键帧,二动画中间变化的帧,由系统计算,自己补充完整
资源文件一般存放在res/anim/目录当中。
提供了4中变化的方式。
位移的改变,旋转,透明度,大小缩放动画。
<translate . . ./>
<rotate . . ./>
<alpha . . ./>
<scale . . ./>
可以指定动画变化的时间,和动画变化的速度。
补间动画的使用步骤:
1、在drawable文件夹下创建anim文件夹,在anim文件夹下创建对应的变化方式的xml文件
a、translate_anim.xml:(位移的改变)
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0"
android:toXDelta="300"
android:fromYDelta="0"
android:toYDelta="0"
android:duration="2000"/>
其中:
android:interpolator 动画的渲染器
fromXDelta 动画起始位置的横坐标
toXDelta 动画起结束位置的横坐标
fromYDelta 动画起始位置的纵坐标
toYDelta 动画结束位置的纵坐标
duration 动画的持续时间-->
b、rotate_anim.xml:(旋转)
<rotatexmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="360"
android:duration="1000"
android:repeatCount="1"
android:repeatMode="restart"/>
其中:
fromDegrees:表示旋转的起始角度
toDegrees:表示旋转的结束角度
repeatCount:旋转的次数 默认值是0 代表旋转1次 如果值是repeatCount=4 旋转5次,值为-1或者infinite时,表示补间动画永不停止
repeatMode 设置重复的模式。默认是restart。当repeatCount的值大于0或者为infinite时才有效。
repeatCount=-1 或者infinite 循环了
还可以设成reverse,表示偶数次显示动画时会做与动画文件定义的方向相反的方向动行。-->
c、alpha_anim.xml(透明度):
<alphaxmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="2000"/>
其中:
fromAlpha :表示起始透明度
toAlpha:表示结束透明度
1.0表示完全不透明
0.0表示完全透明
d、scale_anim.xml:(大小缩放动画)
<scalexmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXScale="0.2"
android:toXScale="1.5"
android:fromYScale="0.2"
android:toYScale="1.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>
其中
fromXScale:表示沿着x轴缩放的起始比例
toXScale:表示沿着x轴缩放的结束比例
fromYScale:表示沿着y轴缩放的起始比例
toYScale:表示沿着y轴缩放的结束比例
pivotX、pivotY 表示图片大小缩放轴点
2、在布局文件中用ImageView控件作为动画载体来显示动画,同样可设置button按钮来显示不同的动画
3、声明Animation
Animation animation= AnimationUtils.loadAnimation(this,R.anim.translate_anim);;
animation.setRepeatCount(Animation.INFINITE);//循环显示
mImageView.startAnimation(animation);
补充:当然可以将这些动画设置在一起在anim文件夹下创建all_anim.xml使这些动画同时实现
完整代码如下:
public class MainActivity extends AppCompatActivity implementsView.OnClickListener {
private ImageView mImageView;
private Button mBtTranslate,mBtRotate,mBtScale,mBtAlpha,mBtAll;
private Animationanimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView= (ImageView) findViewById(R.id.iv);
mBtTranslate= (Button) findViewById(R.id.bt_translate);
mBtRotate= (Button) findViewById(R.id.bt_rotate);
mBtScale= (Button) findViewById(R.id.bt_scale);
mBtAlpha= (Button) findViewById(R.id.bt_alpha);
mBtAll= (Button) findViewById(R.id.bt_all);
mBtTranslate.setOnClickListener(this);
mBtRotate.setOnClickListener(this);
mBtScale.setOnClickListener(this);
mBtAlpha.setOnClickListener(this);
mBtAll.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
caseR.id.bt_translate:
animation= AnimationUtils.loadAnimation(this,R.anim.translate_anim);
break;
caseR.id.bt_rotate:
animation= AnimationUtils.loadAnimation(this,R.anim.rotate_anim);
break;
caseR.id.bt_scale:
animation= AnimationUtils.loadAnimation(this,R.anim.scale_anim);
break;
caseR.id.bt_alpha:
animation= AnimationUtils.loadAnimation(this,R.anim.alpha_anim);
break;
caseR.id.bt_all:
animation= AnimationUtils.loadAnimation(this,R.anim.all_anim);
}
animation.setRepeatCount(Animation.INFINITE);//循环显示
mImageView.startAnimation(animation);
}
}
三、属性动画 :PropertyAnimation
补间动画的增强版
属性动画的两大特点:
1、可以定义任何属性的变化
2、可以对任何对象执行动画
属性动画能够定义的属性:
1、动画的持续时间
2、动画的插入方式
3、动画的重复次数
4、动画的行为
5、动画集
6、每一帧刷新的频率
. . . . . . . .
属性动画的使用步骤:
1、在drawable文件夹下创建animator文件夹,在animator文件夹下创建对应的object_anim_x.xml文件 内容如下:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="scaleX" //想要变化的属性名称
android:duration="5000" //改变的时间
android:valueType="floatType" //改变的值的类型
android:valueFrom="1.0" //改变前的值
android:valueTo="3.0"> //改变后的值
</objectAnimator>
2、同样的需要一个ImageView控件作为动画载体来显示动画
3、声明ObjectAnimator
ObjectAnimator objectAnimation = (ObjectAnimator) AnimatorInflater.loadAnimator(this,
R.animator.object_anim_x);
objectAnimation . setTarget(mImageView);
objectAnimation . start();
完整代码如下:
public class MainActivity extends AppCompatActivity {
privateImageViewmImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView= (ImageView) findViewById(R.id.iv);
ObjectAnimator objectAnimation = (ObjectAnimator) AnimatorInflater.loadAnimator(this,
R.animator.object_anim_x);
objectAnimation . setTarget(mImageView);
objectAnimation . start();
}
}
属性动画很强大,这里只列举了其中一种,补间动画能够对View进行位移的改变,旋转,透明度和大小缩放,但是一旦超过这四种动画补间动画就无能为力了,此时我们可以使用属性动画来实现我们想要达到的效果。属性动画相当于补间动画的增强版,是3.0后推出的动画,使用简单、容易实现,当然也有一定的局限性,就是需要3.0以上的API支持,限制较大。