Android 补间动画

1、本质:确定开始和结束视图样式,中间动画变化过程由系统补全。
2、作用对象:视图控件(View):TextView、ImageView 等。
3、优点:简单、方便;缺点:只能作用在视图控件;不能改变视图控件的属性;动画效果相对简单。
4、分类:平移(translate)、旋转(rotate)、缩放(scale)、透明度(alpha)。
5、具体使用

  1. 平移动画(TranslateAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返平移动画效果-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:duration="3000"	// 动画持续时间(ms)
   android:startOffset ="1000" 	// 动画延迟开始时间(ms)
   android:fillBefore = "true"	// 动画播放完后,视图是否停留在动画开始的状态,默认 true
   android:fillAfter = "true"	// 动画播放完后,视图是否停留在动画结束的状态,优先于 fillBefore 值,默认为false
   android:fillEnabled= "false"	// 是否应用 fillBefore 值,对 fillAfter 值无影响,默认为true
   android:repeatMode= "reverse"	// 重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为 restart
   android:repeatCount = "infinite"	// 重放次数(动画的播放次数= 重放次数+1),为infinite时无限重复
   android:interpolator = "@null"	// 插值器,即影响动画的播放速度

   android:fromXDelta="0"	// 视图在水平方向x 移动的起始值,
   android:toXDelta="500"	// 视图在水平方向x 移动的结束值
   android:fromYDelta="0"	// 视图在竖直方向y 移动的起始值
   android:toYDelta="500">	// 视图在竖直方向y 移动的结束值
</translate>
注:android:xxxDelta 为具体值 “1” = 视图自身左上角 + 1 px;百分比 “200%” = 视图自身左上角 + 自身宽/高度*200%;parent “50p” = 视图自身左上角 + 父控件宽/高*50%
// 创建动画对象
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
// 播放动画
btn_translate.startAnimation(translateAnimation);
  1. 旋转动画(RotateAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返旋转动画-->
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"	
    android:startOffset ="1000"
    android:fillBefore = "true"
    android:fillAfter = "true"
    android:fillEnabled= "false"
    android:repeatMode= "reverse"
    android:repeatCount = "infinite"
    android:interpolator = "@null"

    android:fromDegrees="0"	// 动画开始时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
    android:toDegrees="360"	// 动画结束时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
    android:pivotX="50%"	// 旋转轴点的x坐标
    android:pivotY="50%"	// 旋转轴点的y坐标
    >
注:android:pivotX/Y 为具体值 “1” = 视图自身左上角 + 1 px;百分比 “200%” = 视图自身左上角 + 自身宽/高度*200%;parent “50p” = 视图自身左上角 + 父控件宽/高度*50%
</rotate>
Animation rotateAnimation=AnimationUtils.loadAnimation(this,R.anim.rotate_anim); 
btn_rotate.startAnimation(rotateAnimation);
  1. 缩放动画(ScaleAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返缩放动画-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:startOffset ="1000"
    android:fillBefore = "true"
    android:fillAfter = "true"
    android:fillEnabled= "false"
    android:repeatMode= "reverse"
    android:repeatCount = "infinite"
    android:interpolator = "@null"

    android:fromXScale="1"	// 0.0表示收缩到没有,1.0表示正常无伸缩,<1 缩小,>1 放大
    android:toXScale="2"	// 动画在水平方向X的结束缩放倍数
    android:fromYScale="1"	// 动画在竖直方向Y的开始缩放倍数
    android:toYScale="2"	// 动画在竖直方向Y的结束缩放倍数
    android:pivotX="50%"	// 缩放轴点的x坐标
    android:pivotY="50%"	// 缩放轴点的y坐标
    >
</scale>
注:android:pivotX/Y 为具体值 “1” = 视图自身左上角 + 1 px;百分比 “200%” = 视图自身左上角 + 自身宽/高度*200%;parent “50p” = 视图自身左上角 + 父控件宽/高*50%
  1. 透明度动画(AlphaAnimation 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<!--无限往返透明度动画-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:startOffset ="1000"
    android:fillBefore = "true"
    android:fillAfter = "true"
    android:fillEnabled= "false"
    android:repeatMode= "reverse"
    android:repeatCount = "infinite"
    android:interpolator = "@null"

    android:fromAlpha="1.0"	// 动画开始时视图的透明度(取值范围: -1 ~ 1,0 看不见,1 原状态)
    android:toAlpha="0.0"	// 动画结束时视图的透明度
    >

</alpha>
  1. 组合动画(AnimationSet 动态创建)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
         />

    <translate
       />

    <alpha
       />

    <scale
        />
</set>
Animation allAnimation=AnimationUtils.loadAnimation(this,R.anim.set_anim);
btn_set.startAnimation(allAnimation);

6、监听动画

anim.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                // 动画开始
                Log.e("tag","onAnimationStart");
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // 动画结束
                Log.e("tag","onAnimationEnd");
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // 动画重复执行的时候回调
                Log.e("tag","onAnimationRepeat");
            }
        });

7、 Activity、Fragment 切换动画、ListView,RecycleView 出场动画。

  1. Activity 切换动画
startActivity(new Intent(MainActivity.this, AnimActivity.class));
// 自定义淡入淡出动画
// overridePendingTransition(R.anim.fade_in,R.anim.fade_out);
// 自定义从右向左滑动动画
overridePendingTransition(R.anim.in_from_right,R.anim.out_to_left);
@Override
 public void finish() {
     super.finish();
     // 自定义淡入淡出动画
     // overridePendingTransition(R.anim.fade_in,R.anim.fade_out);
     // 自定义从左往右滑动动画
     overridePendingTransition(R.anim.in_from_left,R.anim.out_to_right);
    }
// fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    // 淡入动画
    <alpha
        android:duration="1500"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>
// fade_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    // 淡出动画
    <alpha
        android:duration="1500"
        android:fromAlpha="1.0"
        android:toAlpha="0.0"/>
</set>
// in_from_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1500"
        android:fromXDelta="100%p"
        android:toXDelta="0%p"/>
</set>
// out_to_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1500"
        android:fromXDelta="100%p"
        android:toXDelta="0%p"/>
</set>
// in_from_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1500"
        android:fromXDelta="-100%p"
        android:toXDelta="0%p"/>
</set>
// out_to_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1500"
        android:fromXDelta="0%p"
        android:toXDelta="100%p"/>
</set>
  1. Fragment 切换动画
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 设置默认动画 FragmentTransaction.TRANSIT_NONE:无动画,FragmentTransaction.TRANSIT_FRAGMENT_OPEN:标准的打开动画效果,FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:标准的关闭动画效果
// fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_NONE);
// 设置自定义动画
fragmentTransaction.setCustomAnimations(R.anim.in_from_right,R.anim.out_to_left);
  1. ListView,RecycleView item 出场动画
// item_rv_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    >

    <alpha
        android:duration="1000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

    <translate
        android:duration="1000"
        android:fromXDelta="500"
        android:toXDelta="0"
        />

</set>
// layout_rv_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="0.15" 	// 子元素延迟时长 = 入场动画的总时长*0.15 = 150 ms
    android:animationOrder="normal"	// 子元素动画顺序:normal(顺序显示,排在前面的子元素先播放入场动画)、reverse(倒序显示,排在后面的子元素先播放入场动画)、random(随机播放入场动画)
    android:animation="@anim/item_rv_anim"		// 入场的具体动画效果
    >
</layoutAnimation>
<android.support.v7.widget.RecyclerView
        android:id="@+id/rv_message"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutAnimation="@anim/layout_rv_anim">
</android.support.v7.widget.RecyclerView>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值