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();
    }
}

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM