Android开发 之 补间动画

安卓的补间动画

补间动画在动画界早都存在的技术,android是在2.0版本以后引进的。补间动画其实只是在屏幕上做了效果的绘制,其实组件的真是位置并没有发生改变。

主要应用场景,组件,布局,fragment,activity都能使用这种动画技术

本文以fragment的切换动画为例进行讲解:
1.平移动画:
如上图效果,左右平移的动画,对角平移那个渐变动画,下面会讲到。
补间动画有自己的专属文件夹存放,在res目录下建立anim文件夹,在anim文件夹中创建自己想要的动画。
创建进入页面的动画:translate_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="100%"
    android:toXDelta="0"
    android:duration="500"
    android:fillAfter="true">
</translate>

创建退出页面的动画:translate_fragment_out.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0"
    android:toXDelta="-100%"
    android:duration="500"
    android:fillAfter="true">
</translate>

对以上属性进行解释:

android:fromXDelta     起始点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,具体意义已在scale标签中讲述,这里就不再重讲
android:fromYDelta    起始点Y轴从标,可以是数值、百分数、百分数p 三种样式;
android:toXDelta         结束点X轴坐标
android:toYDelta        结束点Y轴坐标
android:duration        动画持续时间,以毫秒为单位 
android:fillAfter          如果设置为true,控件动画结束时,将保持动画最后时的状态
android:fillBefore       如果设置为true,控件动画结束时,还原到开始动画前的状态
android:fillEnabled    与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
android:repeatCount 重复次数
android:repeatMode 重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
android:interpolator  设定插值器,其实就是指定的动作效果,比如弹跳效果等,不在这小节中讲解,后面会单独列出一单讲解。

对动画xml的调用:下面代码的bt01按钮。

package th.zxq.com.quxianyundong;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;

import th.zxq.com.quxianyundong.fragments.fragment01;
import th.zxq.com.quxianyundong.fragments.fragment02;
import th.zxq.com.quxianyundong.fragments.fragment03;
import th.zxq.com.quxianyundong.fragments.fragment04;

/**
 * Created by Administrator on 2017/7/22.
 */

public class FragmentActivity extends AppCompatActivity {
    private FrameLayout fl;
    private FragmentManager sfm;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);
        fl= (FrameLayout) findViewById(R.id.fl);
        sfm = getSupportFragmentManager();
    }
    public void button(View view)
    {
        switch (view.getId())
        {
            case R.id.bt01:
                sfm.beginTransaction()
                   .setCustomAnimations(R.anim.translate_fragment,R.anim.translate_fragment_out)
                   .replace(R.id.fl,new fragment01()).commit();
                break;
            case R.id.bt02:
                sfm.beginTransaction()
                        .setCustomAnimations(R.anim.scale_fragment_in,R.anim.scale_fragment_out)
                        .replace(R.id.fl,new fragment02()).commit();
                break;
            case R.id.bt03:
                sfm.beginTransaction()
                        .setCustomAnimations(R.anim.rotate_fragment,R.anim.rotate_fragment_out)
                        .replace(R.id.fl,new fragment03()).commit();
                break;
            case R.id.bt04:
                sfm.beginTransaction()
                    .setCustomAnimations(R.anim.alpha_fragment_in,R.anim.alpha_fragment_out)
                    .replace(R.id.fl,new fragment04()).commit();
                break;
        }
    }
}

2.缩放动画:


和上面一样,在anim文件中创建xml
进入界面的动画:scale_fragment_in.xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="0"
    android:toXScale="1"
    android:fromYScale="0"
    android:toYScale="1"
    android:duration="500"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fillAfter="true">
</scale>

退出界面的动画:scale_fragment_out.xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="1"
    android:toXScale="0"
    android:fromYScale="1"
    android:toYScale="0"
    android:duration="500"
    android:fillAfter="true">
</scale>

属性解释:
android:fromXScale    起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;
android:toXScale        结尾的X方向上相对自身的缩放比例,浮点值;
android:fromYScale    起始的Y方向上相对自身的缩放比例,浮点值,
android:toYScale        结尾的Y方向上相对自身的缩放比例,浮点值;
android:pivotX            缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。(具体意义,后面会举例演示)
android:pivotY           缩放起点Y轴坐标,取值及意义跟android:pivotX一样。
android:duration        动画持续时间,以毫秒为单位 
android:fillAfter          如果设置为true,控件动画结束时,将保持动画最后时的状态
android:fillBefore       如果设置为true,控件动画结束时,还原到开始动画前的状态
android:fillEnabled    与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
android:repeatCount 重复次数
android:repeatMode 重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
android:interpolator  设定插值器,其实就是指定的动作效果,比如弹跳效果等,不在这小节中讲解,后面会单独列出一单讲解。

代码调用:上面代码的bt02

3.旋转动画:


创建进入动画:rotate_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:duration="1000"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true">
    </rotate>
    <scale
        android:fromXScale="0"
        android:toXScale="1"
        android:fromYScale="0"
        android:toYScale="1"
        android:duration="1000"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true">
    </scale>
</set>
这里用到一个动画集合,就是多个动画一起执行。因为旋转不加缩放的话很难看。

创建退出动画:rotate_fragment_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="360"
        android:toDegrees="0"
        android:duration="500"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true">
    </rotate>
    <scale
        android:fromYScale="1"
        android:toXScale="0"
        android:toYScale="0"
        android:fromXScale="1"
        android:duration="500"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true"
        >
    </scale>
</set>
属性解释:
android:fromDegrees     开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:toDegrees         结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:pivotX               缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
android:pivotY               缩放起点Y轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
其实属性和上面的一样。

代码调用如上面代码的 bt03

4. 渐变动画

创建进入动画:alpha_fragment_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="2000"
        android:fillAfter="true">
    </alpha>
    <scale
        android:fromXScale="0"
        android:fromYScale="0"



  
  

创建退出动画:alpha_fragment_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration="1000"
        android:fillAfter="true">
    </alpha>
    <scale
        android:fromXScale="1"
        android:fromYScale="1"
        android:toYScale="0"
        android:toXScale="0"
        android:duration="1000"
        android:fillAfter="true"
        android:pivotY="100%"
        android:pivotX="100%"
        >
    </scale>
</set>
属性解释:
android:fromAlpha   动画开始的透明度,从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
android:toAlpha       动画结束时的透明度,也是从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
其他和上面的一样

代码调用如上面代码的bt04


如果需要多个动画不同的动画一起执行就就创建一个动画集合set,如上面的旋转和渐变动画一样。

ps:这些都是给fragment自定义的动画设置,必须使用v4包下的fragment,不然会报错。
动画添加必须在替换fragment之前调用。
也可以通过setTransition(FragmentTransaction.TRANSIT_ENTER_MASK)方法去设置系统自带的动画。这种设置可以不用管fragment是不是v4包的。
例如:
            case R.id.bt02:
                sfm.beginTransaction()
                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
//                        .setCustomAnimations(R.anim.scale_fragment_in,R.anim.scale_fragment_out)
                        .replace(R.id.fl,new fragment02())
                        .commit();
                break;


尊重他人,转载请注明出处,谢谢





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值