将每一张静止的图片依次的显示出来,利用人眼暂时停留的错觉,得出的动画。
在drawable文件中中创建xml文件
标签是<animation-list />
使用步骤:
1.在drawable文件夹下创建帧动画的资源文件,<animation-list />
2.在代码或者在布局当中设置imageview的背景或者src资源为自定义的帧动画资源文件。
3.获取AnimationDrawable的帧动画管理器,然后可以调用其start或者是stop方法开启关闭动画。
添加oneshot属性
true:表示指定的资源图片只切换一次
false:表示指定的item图片无限切换。
实例:
public class FrameActivity1 extends AppCompatActivity {
private ImageView iv;
//声明帧动画管理器
private AnimationDrawable drawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame1);
iv = (ImageView) findViewById(R.id.iv);
iv.setBackgroundResource(R.drawable.my_frame_animation);
drawable = (AnimationDrawable) iv.getBackground();
}
public void start(View view) {
if (!drawable.isRunning()) {
drawable.start(); //开启帧动画
}
}
public void stop(View view) {
if (drawable.isRunning()) {
drawable.stop(); //停止动画
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@mipmap/anim1" android:duration="50"></item>
<item android:drawable="@mipmap/anim2" android:duration="50"></item>
</animation-list>
或者在代码中加载:
public class FrameActivity3 extends AppCompatActivity {
private ImageView iv;
private AnimationDrawable drawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame3);
iv = (ImageView) findViewById(R.id.iv);
//在代码当中完成帧动画
drawable = new AnimationDrawable();
//向帧动画管理器中添加图片资源的过程
drawable.addFrame(getResources().getDrawable(R.mipmap.girl_1),200);
drawable.addFrame(getResources().getDrawable(R.mipmap.girl_2),200);
//将动画资源显示在imageview上
iv.setImageDrawable(drawable);
drawable.setOneShot(false);
}
public void onClick(View view) {
if (drawable.isRunning()){
drawable.stop();
}else {
drawable.start();
}
}
}
2.Tween 补间动画
补充中间的动画
开发者只需要指定动画开始和结束的关键帧,而进行中的中间帧是由系统来计算并且补齐的。
补间动画分为四种:
1.透明度动画 : alpha
2.大小缩放动画 : scale
3.位移变化动画 : translate
4.旋转动画 : rotate
5.综合动画 :把前几种动画综合起来。
补间动画的资源存放与res/anim目录之下
四种变化方式都有对应的标签
<alpha .../>
定义的属性:
android:fromAlpha="1"
android:toAlpha="0.05"
以上两个属性 取值范围 0-1 之间
0:表示完全透明
1:表示不透明
<scale .../>
定义的属性:
确定开始和结束的尺寸
android:fromXScale="1"
android:toXScale="0.1"
android:fromYScale="1"
android:toYScale="0.1"
确定放大缩小的中心点
android:pivotX="50%"
android:pivotY="50%"
<translate .../>
定义的属性:
确定开始和结束的位置
android:fromXDelta="0"
android:toXDelta="200"
android:fromYDelta="0"
android:toYDelta="200"
确定运动持续的时间
android:duration="5000"
插值器 :可以改变动画执行中间的效率,控制动画的速度
android:interpolator
accelerate_interpolator 加速
decelerate_interpolator 减速
accelerate_decelerate_interpolator 先加速后减速
linear_interpolator 匀速
表示重复的次数
android:repeatCount
表示重复的模式
android:repeatMode
是否保留动画结束时的状态
android:fillAfter
<rotate .../>
定义的属性:
旋转的起始角度和最终角度
android:fromDegrees="0"
android:toDegrees="360"
旋转的中心点
android:pivotX=""
android:pivotY=""
放入三种值:
1.绝对的数值:传入绝对值,表示执行该view的某一个点作为中心点 (50,50)
2.百分比 :表示以该view的宽高的百分比作为中心点 (50% ,50%)
3.百分比p :表示执行该动画的view的外层布局的位置 (50%p 50%p)
<set .../>
可以对以上四种动画任意组合。
//代码中加载资源动画:
Animation anim = AnimationUtils.loadAnimation(this,R.anim.anim_xxx);
//开启动画
xxx.startAnimation(anim);
对set的实例:
public class TweenActivity1 extends AppCompatActivity {
private ImageView mIv;
//声明补间动画对象
private Animation setAnim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween1);
mIv = (ImageView) findViewById(R.id.tweeniv);
setAnim = AnimationUtils.loadAnimation(this,R.anim.anim_set);
}
public void onClick(View view) {
mIv.startAnimation(setAnim);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:duration="2000">
<alpha
android:fromAlpha="1"
android:toAlpha="0"></alpha>
<scale
android:fromXScale="1"
android:toXScale="0"
android:fromYScale="1"
android:toYScale="0"
android:pivotX="50%"
android:pivotY="50%"></scale>
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="2000"
></translate>
<rotate
android:fromDegrees="0"
android:toDegrees="1800"
android:pivotX="50%"
android:pivotY="50%"></rotate>
</set>
3.Property 属性动画
android3.0之后引入的动画
属性动画的特点:
1.Animator框架之下的,常用的类包括AnimatorSet和ObjectAnimator
2.补间动画只能够定义控件的四个方面,而属性动画可以定义任何属性。
3.补间动画只能够让ui控件执行动画,而属性动画可以让任何对象执行动画。
属性动画可以定义以下属性:
1.动画持续时间
2.动画的插值方式
3.动画重复的次数
4.动画重复的行为
5.动画的集合
......
属性动画在xml文件当中定义的步骤。
1.在res/animator文件夹当中定义属性动画的资源文件,如果是单独的属性可以定义标签为<objectAnimator.../>
如果是多个属性就要放入到<set.../>标签当中。
在<objectAnimator.../>标签中可以定义的属性:
android:propertyName="textColor" //属性名
android:duration="5000" //动画持续时间
android:valueType="intType" //动画的输入类型
android:valueFrom="#ff0000" //动画的起始值
android:valueTo="#0000ff" //动画的最终值
在set标签当中可以判断是同时执行,还是顺序执行
android:ordering=""
sequentially :按顺序执行
together : 同时执行
2. 在activity当中把xml文件转化为属性动画,然后开启动画
//获得属性动画的对象
ObjectAnimator backgroundAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_bgcolor);
//给指定的ui控件设置动画
backgroundAnimator.setTarget(mTv);
//开启动画
backgroundAnimator.start();
实例
public class PropertyActivity1 extends AppCompatActivity {
private ImageView mIv;
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_property1);
mIv = (ImageView) findViewById(R.id.iv);
mTv = (TextView) findViewById(R.id.tv);
//获得属性动画的对象
ObjectAnimator backgroundAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_bgcolor);
//给指定的ui控件设置动画
backgroundAnimator.setTarget(mTv);
//开启动画
backgroundAnimator.start();
}
public void scale(View view) {
switch (view.getId()) {
case R.id.ScaleX:
ObjectAnimator scaleXAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_scalex);
scaleXAnimator.setTarget(mIv);
scaleXAnimator.start();
break;
case R.id.ScaleXY:
Animator scaleXYAnimator = AnimatorInflater.loadAnimator(this,R.animator.anim_scalexy);
scaleXYAnimator.setTarget(mIv);
scaleXYAnimator.start();
break;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="textColor"
android:duration="5000"
android:valueType="intType"
android:valueFrom="#ff0000"
android:valueTo="#0000ff">
</objectAnimator>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<set android:ordering="together">
<objectAnimator
android:propertyName="scaleX"
android:valueType="floatType"
android:interpolator="@android:anim/linear_interpolator"
android:valueTo="2.0"
android:duration="3000"
android:valueFrom="1.0"></objectAnimator>
<objectAnimator
android:propertyName="scaleY"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="2.0"
android:duration="3000"
android:interpolator="@android:anim/linear_interpolator"></objectAnimator>
</set>
<set android:ordering="together">
<objectAnimator
android:propertyName="translationY"
android:valueType="floatType"
android:valueFrom="0"
android:valueTo="-1000"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="3000"></objectAnimator>
<objectAnimator
android:propertyName="alpha"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0.1"
android:duration="3000"></objectAnimator>
<objectAnimator
android:propertyName="scaleX"
android:valueType="floatType"
android:interpolator="@android:anim/linear_interpolator"
android:valueTo="1.0"
android:duration="3000"
android:valueFrom="2.0"></objectAnimator>
<objectAnimator
android:propertyName="scaleY"
android:valueType="floatType"
android:valueFrom="2.0"
android:valueTo="1.0"
android:duration="3000"
android:interpolator="@android:anim/linear_interpolator"></objectAnimator>
</set>
</set>
实例:属性动画的响应谁事件
public class PropertyActivity3 extends AppCompatActivity {
private ImageView iv;
ObjectAnimator animator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_property3);
iv = (ImageView) findViewById(R.id.iv);
animator = ObjectAnimator.ofFloat(iv,"translationY",200F);
animator.setDuration(5000);
//属性动画的响应事件 :包含了动画的四个常用的事件:start end cancel repeat
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.i("tag","========onAnimationStart========");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.i("tag","========onAnimationEnd========");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.i("tag","========onAnimationCancel========");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.i("tag","========onAnimationRepeat========");
}
});
//大部分情况下,并不关心其他过程,只关注结束的过程
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Log.i("tag","===AnimatorListenerAdapter=====onAnimationEnd=========");
}
});
}
public void onClick(View view) {
animator.start();
}
}