• Android Fragment 切换动画设置


    在Activity跳转之间可以设置动画效果,例如平移,渐变,旋转等动画,当然在Fragment中也可以设置切换的动画效果,可以达到跟ViewPager切换动画类似的效果。在Fragment中设置自定义切换动画主要分为了两种情景,一种是使用 android.app.Fragment包里面的Fragment类时,FragmentManager里面的FragmentTransaction事务只支持XML中的animator标签,如objectAnimator属性动画,不支持传统的补间动画标签如<translate>,<alpha>等。

    另一种是使用兼容性版本的android.support.v4.app.Fragment包里面的Fragment类,SupportFragmentManager里面的FragmentTransaction事务支持XML中的animation标签,也就是传统的补间动画,例如<translate>,<alpha>,不支持属性动画标签。

    设置Fragment的切换动画主要是使用FragmentTransaction事务类的中setCustomAnimations方法:

    setCustomAnimations 
    FragmentTransaction setCustomAnimations (int enter, 
    int exit, 
    int popEnter, 
    int popExit)

    该方法有4个参数,第一个参数enter是指当一个Fragment被添加added 或者绑定attached到视图上,该Fragment进入视图时的animation或者animator的资源ID;

    第二个参数exit是指当一个Fragment从视图上被移除removed或者解除绑定detached时,该Fragment移出视图时的animation或者animator的资源ID;

    第三个参数popEnter是指当调用popBackStack()方法或者类似的方法弹出栈顶的Fragment后,Fragment栈的栈顶Fragment重新被添加readded或重新绑定reattached到视图上时,该Fragment进入视图时的animation或者animator的资源ID;

    第四个参数popExit是指当调用popBackStack()方法或者类似的方法弹出栈顶的Fragment时,该弹出的Fragment即从视图上被移除removed或者解除绑定detached,该Fragment移出视图时的animation或者animator的资源ID。

    android.support.v4.app.Fragment包实现

    要实现Fragment的自定义切换动画效果,首先需要自定义XML动画资源文件,可以在res文件夹下新建anim文件夹然后新建XML资源文件。由于android.support.v4.app.Fragment包只支持补间动画的标签,所以可以按照自己的想法来在根标签set中新建动画标签来实现效果,如translate平移,alpha渐变透明度,rotate旋转,scale缩放等。

    • slide_left_in.xml 左视图进入时动画
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <translate
            android:fromXDelta="-100%p"
            android:toXDelta="0%p"
            android:duration="300"/>
    
        <alpha
            android:fromAlpha="0.5"
            android:toAlpha="1.0"
            android:duration="100"/>
    </set>
    • slide_left_out.xml 左视图移出时动画
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <translate
            android:fromXDelta="0%p"
            android:toXDelta="-100%p"
            android:duration="300"/>
    
        <alpha
            android:fromAlpha="1.0"
            android:toAlpha="0.5"
            android:duration="200"/>
    </set>
    • slide_right_in.xml 右视图进入时动画
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:fromXDelta="100%p"
            android:toXDelta="0%p"
            android:duration="300"/>
    
        <alpha
            android:fromAlpha="0.5"
            android:toAlpha="1.0"
            android:duration="200"/>
    </set>
    • slide_right_out.xml 右视图移出时动画
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:fromXDelta="0%p"
            android:toXDelta="100%p"
            android:duration="300"/>
    
        <alpha
            android:fromAlpha="1.0"
            android:toAlpha="0.5"
            android:duration="200"/>
    </set>

    Activity中实现 

    package com.example.call_aidl;
    
    import android.os.Bundle;
    
    
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    
    public class Main2Activity extends AppCompatActivity {
    
        ActionBar actionBar;
        Fragment curFragment;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
    
            actionBar = getSupportActionBar();
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            ActionBar.Tab tab1 = actionBar.newTab();
            tab1.setText("新业务Service");
    
            tab1.setTabListener(new MyTabListener(new LeftFragment()));
            ActionBar.Tab tab2 = actionBar.newTab().setText("盘点Service");
            tab2.setTabListener(new MyTabListener(new RightFragment()));
            actionBar.addTab(tab1);
            actionBar.addTab(tab2);
        }
    
        class MyTabListener implements ActionBar.TabListener{
    
            private Fragment fragment;
            public MyTabListener (Fragment fragment){
                this.fragment=fragment;
            }
    
    
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
                curFragment = fragment;
                ft.setCustomAnimations(R.anim.slide_right_in,
                        R.anim.slide_left_out,
                        R.anim.slide_left_in,
                        R.anim.slide_right_out).replace(R.id.context,fragment);
            }
    
            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
    
            }
    
            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
    
            }
        }
    
        @Override
        protected void onDestroy() {
    
            super.onDestroy();
        }
    }
    
    
    
  • 相关阅读:
    Linux下使用cut切割有规则的列文本
    注解相关
    修改Feign数据解析,由jackson改为fastjson,同时解决fastjson中Content-Type问题
    Spring Data JPA整合REST客户端Feign时: 分页查询的反序列化报错的问题
    Aliyun STS Java SDK示例
    GIT : IDEA切换到某个tag
    [LeetCode] 351. Android Unlock Patterns 安卓解锁模式
    QSpinBox 和 QSlider 联合使用方法
    Qt 控件随窗口缩放
    [LeetCode] 350. Intersection of Two Arrays II 两个数组相交之二
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/12620047.html
Copyright © 2020-2023  润新知