1.逐帧动画(frame-by- frame animation)
把几张图片快速播放形成一个动画的效果
(1)在drawable文件下new一个Drawable Source File,selector类型的那种
然后把文件的selector改成animation-list,
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/frame1" android:duration="120"/>
<item android:drawable="@drawable/frame2" android:duration="120"/>
</animation-list>
duration,是指当前图片显示多少毫秒,每张图片显示的时间可以不一样。
(2)这个xml放在drawable中,相当于一个图片。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/frame1"
/>
设置为某个布局的背景
(3)然后
//获取动画的Drawable资源
AnimationDrawable anim = (AnimationDrawable) relativeLayout.getBackground();
//启动动画
anim.start();
//停止动画
anim.stop();
通过点击事件,设置动画的启动和停止
RelativeLayout relativeLayout = findviewById(R.id.rl);
Animat ionDrawable anim = (Animat ionDrawable) relativeLayout.getBackground();
relat ivel ayout . setonClickl istener(new view.OnClickL istener() {
@override
public void onClick(View v) {
if (flag) {
anim. start();
flag = false;
}
else {
anim. stop();
flag = true;
}
}
});
(4)通过代码创建逐帧动画
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.tv);
//获取AnimationDrawable对象
AnimationDrawable a = new AnimationDrawable();
imageView.setBackground(a);
//在AnimaionDrawable中添加一帧,并为其指定图片和播放时长
a.addFrame(getResources().getDrawable(R.drawable.girl_1), 200);
a.addFrame(getResources().getDrawable(R.drawable.girl_2), 200);
a.addFrame(getResources().getDrawable(R.drawable.girl_3), 200);
//循环播放
a.setOneShot(false);
//播放Frame动画
a.start();
}
2.补间动画(Tween Animation)
补间动画是通过对View中的内容进行一系列的图形变换来实现动画效果,其中图形变换包括平移、缩放、旋转、改变透明度等。
通常情况下以XML形式定义的动画都会放置在程序res/anim(自定义)的文件下
Android提供了4钟补间动画,分别是透明度渐变动画(AiphaAnimation)、旋转动画(Rotate Animation)、缩放动画(ScaleAnimation)、平移动画(TranslateAnimation)。
(1)透明度渐变动画(AiphaAnimation)
在res下创建一个anim的文件夹,然后new Animation Source File,先建一个alpha相关的,
透明度渐变动画是指通过改变View组件透明度来实现的渐变效果。它主要通过为动画指定开始时的透明度、结束时的透明度以及动画持续时间来创建动画,在XML文件中定义
alpha_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android :interpolator="@android:anim/linear_interpolator"
android :repeatMode="reverse"
android :repeatCount="nfinite"
android :duration="1000"
android :fromAlpha="1.0"
android :toAlpha="0.0"/>
</set>
View从完全不透明到透明、持续时间为1s的动画。
<1>interpolator:用于控制动画的变化速度,一般值为@android:anim/linear_interpolator(匀速改变)、@android:anim/laccelerate_interpolator(开始慢、后来加速)等
<2>repeatMode:用于指定动画重复的方式,可选值为reverse(反向)、restart(重新开始)
<3>repeatCoun:用于指定动画重复的次数,属性值可以为正整数,也可以为infinite(无限循环)
<4>duration:用于指定动画播放时长
<5>fromAlpha:用于指定动画开始时的透明度,0.0为完全透明,1.0为完全不透明
<6>toAlpha:用于指定动画结束时的透明度,0.0为完全透明,1.0为完全不透明
(2)旋转动画(Rotate Animation)
旋转动画就是通过动画指定开始时的旋转角度、结束时的旋转角度以及动画播放时长来创建动画的。
rotate_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegress="0"
android:toDegress="360"
android:pivotX="50%"
android:pivotY="50"
android:repeatMode="reverse"
android:repeatCount="infinite"
android:duration="1000"/>
</set>
<1>fromDegress:指定动画开始时的角度
<2>toDegress:指定动画结束时的角度
<3>pivotX:指定轴心的X坐标
<4>pivotY:指定轴心的y坐标,这里xy占的是百分比
(3)缩放动画(ScaleAnimation)
缩放动画就是通过为动画指定开始时的缩放系数、结束时的缩放系数以及动画持续时长来创建动画的
scale_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:pivotX="50%"
android:pivotY="50"
android:repeatMode="reverse"
android:repeatCount="infinite"
android:duration="3000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="0.5"
android:toYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"/>
</set>
<1>fromXScale:指定动画开始时x轴上的缩放系数,值为1.0表示不变
<2>fromYScale:指定动画开始时y轴上的缩放系数,值为1.0表示不变
<3>toXScale:指定动画结束时x轴上的缩放系数,值为0.5表示缩小为原来的0.5倍
<4>toYScale:指定动画结束时y轴上的缩放系数,值为0.5表示缩小为原来的0.5倍
<5>pivotX(Y)::表示缩放的xy中心点
(4)平移动画(TranslateAnimation)
平移动画就是通过为动画指定开始位置、结束位置以及动画持续时长来创建动画的
translate_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:repeatMode="reverse"
android:repeatCount="infinite"
android:duration="4000"
android:fromXDelta="0.0"
android:fromYDelta="0.0"
android:toXDelta="100"
android:toYDelta="0.0"/>
</set>
上述代码定义了一个让View从起始x(0)位置平移到x(100)位置,持续时间为4s的平移动画,需要注意的是,这里的坐标不是屏幕像素的坐标,而是相对于View的所在位置定义的坐标。开始位置为0.0即表示在View最开始的地方平移(即布局文件定义View所在的位置)
<1>fromXDelta:指定动画开始时View的x坐标
<2>fromYDelta:指定动画开始时View的y坐标
<3>toXDelta:指定动画结束时View的x坐标
<4>toYDelta:指定动画结束时View的y坐标
(5)然后在xml文件中定义布局,一个ImageView和4个按钮,分别显示不同的效果。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="5dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_add_box_24"
android:layout_centerInParent="true"
android:id="@+id/iv_bean"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<Button
android:id="@+id/btn_one"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="渐变"/>
<Button
android:id="@+id/btn_two"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="旋转"/>
<Button
android:id="@+id/btn_three"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="缩放"/>
<Button
android:id="@+id/btn_four"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="移动"/>
</LinearLayout>
</RelativeLayout>
(6)然后在.java中写四个加载动画的方法
private ImageView ivBean=(ImageView)findViewById(R.id.iv_bean);
public void onClick(View v){
switch(v.getId()){
case R.id.btn_one:
//调用AnimationUtils的loadAnimation()方法加载动画
//单击按钮使图片渐变
Animation alpha= AnimationUtils.loadAnimation(this,R.anim.alpha_animation);
ivBean.setAnimation(alpha);
break;
case R.id.btn_two:
//调用AnimationUtils的loadAnimation()方法加载动画
//单击按钮使图片旋转
Animation rotate= AnimationUtils.loadAnimation(this,R.anim.rotate_animation);
ivBean.setAnimation(rotate);
break;
case R.id.btn_three:
//调用AnimationUtils的loadAnimation()方法加载动画
//单击按钮使图片缩放
Animation scale= AnimationUtils.loadAnimation(this,R.anim.scale_animation);
ivBean.setAnimation(scale);
break;
case R.id.btn_four:
//调用AnimationUtils的loadAnimation()方法加载动画
//单击按钮使图片移动
Animation translate= AnimationUtils.loadAnimation(this,R.anim.translate_animation);
ivBean.setAnimation(translate);
break;
}
}
(7)补间动画也可以在代码中定义,需要用到AlphhaAnimation、ScaleAnimation、TranslateAnimation和RotateAnimation类
private ImageView ivBean;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivBean = (ImageView) findViewById(R.id.iv_bean);
//创建一个渐变透明度的动画,从透明到完全不透明
AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
//设置动画播放时长
alphaAnimation.setDuration(5000);
//动画重复方式
alphaAnimation.setRepeatMode(AlphaAnimation.REVERSE);
//动画重复次数
alphaAnimation.setRepeatCount(AlphaAnimation.INFINITE);
ivBean.startAnimation(alphaAnimation);
}
其他3钟补间动画也可以用这种方式定义。
3.属性动画(property animation)
(1)ValueAnimator
listener是更新监听
(2)ObjectAnimator
(3)监听器