`
疯狂的犀牛
  • 浏览: 34625 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

自定义fragment出入栈时候的动画

阅读更多

在fragment出入栈时候添加动画,主要用到FragmentTransaction类中的方法:

 

public abstract FragmentTransaction setCustomAnimations (int enter, int exit)

Since: API Level 11

Set specific animation resources to run for the fragments that are entering and exiting in this transaction. These animations will not be played when popping the back stack.

 

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

Since: API Level 13

Set specific animation resources to run for the fragments that are entering and exiting in this transaction. The popEnter and popExit animations will be played for enter/exit operations specifically when popping the back stack.

 

相关的方法还有(可直接设置标准的动画):

 

public abstract FragmentTransaction setTransition (int transit)

Since: API Level 11

Select a standard transition animation for this transaction. May be one of TRANSIT_NONETRANSIT_FRAGMENT_OPEN, or TRANSIT_FRAGMENT_CLOSE

public abstract FragmentTransaction setTransitionStyle (int styleRes)

Since: API Level 11

Set a custom style resource that will be used for resolving transit animations.

 

下面看一个示例:

1.主activity布局文件:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:padding="4dip"
    android:gravity="center_horizontal"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <FrameLayout
            android:id="@+id/simple_fragment"
            android:layout_width="match_parent"
            android:layout_height="0px"
            android:layout_weight="1">
    </FrameLayout>

    <Button android:id="@+id/new_fragment"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_weight="0" 
        android:text="@string/new_fragment">
        <requestFocus />
    </Button>

</LinearLayout>
 

 

2.主activity,包括一个fragment类:CountingFragment

 

public class FragmentCustomAnimations extends Activity {
    int mStackLevel = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_stack);

        // Watch for button clicks.
        Button button = (Button)findViewById(R.id.new_fragment);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                addFragmentToStack();
            }
        });

        if (savedInstanceState == null) {
            // Do first time initialization -- add initial fragment.
            Fragment newFragment = CountingFragment.newInstance(mStackLevel);
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(R.id.simple_fragment, newFragment).commit();
        } else {
            mStackLevel = savedInstanceState.getInt("level");
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("level", mStackLevel);
    }


    void addFragmentToStack() {
        mStackLevel++;

        // Instantiate a new fragment.
        Fragment newFragment = CountingFragment.newInstance(mStackLevel);

        // Add the fragment to the activity, pushing this transaction
        // on to the back stack.
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.setCustomAnimations(R.animator.fragment_slide_left_enter,
                R.animator.fragment_slide_left_exit,
                R.animator.fragment_slide_right_enter,
                R.animator.fragment_slide_right_exit);
        ft.replace(R.id.simple_fragment, newFragment);
        ft.addToBackStack(null);
        ft.commit();
    }



    public static class CountingFragment extends Fragment {
        int mNum;

        /**
         * Create a new instance of CountingFragment, providing "num"
         * as an argument.
         */
        static CountingFragment newInstance(int num) {
            CountingFragment f = new CountingFragment();

            // Supply num input as an argument.
            Bundle args = new Bundle();
            args.putInt("num", num);
            f.setArguments(args);

            return f;
        }

        /**
         * When creating, retrieve this instance's number from its arguments.
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
        }

        /**
         * The Fragment's UI is just a simple text view showing its
         * instance number.
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.hello_world, container, false);
            View tv = v.findViewById(R.id.text);
            ((TextView)tv).setText("Fragment #" + mNum);
         
            return v;
        }
    }

}
 

 

2.用户fragment出入站时候的动画文件(在res/animator目录下的四个文件):

   fragment_slide_left_enter.xml

 

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="100dp" android:valueTo="0dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0.0" android:valueTo="1.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

 

 fragment_slide_left_exit.xml

 

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0dp" android:valueTo="-100dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="1.0" android:valueTo="0.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

 

 fragment_slide_right_enter.xml:

 

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="-100dp" android:valueTo="0dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0.0" android:valueTo="1.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

 

 fragment_slide_right_exit.xml

 

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0dp" android:valueTo="100dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="1.0" android:valueTo="0.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>
 

 

3.fragment中的createView()方法用到的布局文件hello_world.xml:

 

<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:gravity="center_vertical|center_horizontal"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/hello_world"/>
 

 

问题:objectAnimator是什么?怎么使用?

分享到:
评论
1 楼 蓝月儿 2015-01-29  
objectAnimator 是位移动画吧。使用一般的动画,假如你给一个按钮添加移动动画效果和点击事件,动画结束,按钮不在原来的地方,点击按钮,点击事件不会响应,点击原来的位置点击事件有响应。而使用objectAnimator,点击按钮的新位置有响应。

相关推荐

    android自定义fragment

    自定义Fragment则是对系统提供的Fragment类进行扩展,以满足特定需求或实现特定功能。本篇文章将深入探讨Android自定义Fragment的相关知识点。 一、Fragment的基本概念与生命周期 Fragment作为Android应用程序中的...

    fragment + fragmentTabHost实现底部菜单与自定义fragment管理

    此外,为了提高用户体验,可以添加动画效果,使得Fragment切换更流畅。 总的来说,使用Fragment和FragmentTabHost结合底部菜单,可以构建出用户友好、交互丰富的Android应用。这种设计模式让开发者能够灵活地组织和...

    fragment切换动画

    在Android中,我们可以自定义Fragment切换动画,实现进入和退出动画。这些动画可以通过FragmentTransaction的setCustomAnimation方法来设置。例如,可以设置一个淡入淡出的效果,使得当一个Fragment被添加或显示时...

    Android Fragment切换动画

    在某些场景下,可能需要自定义更复杂的动画逻辑,例如,当两个Fragment同时存在时,可能需要一个过渡动画。这时,可以使用`SharedElementTransition`,这是一种特殊类型的动画,用于共享元素在两个Fragment之间的...

    Android下Fragment的动画切换效果

    在FragmentTransaction中,我们可以使用`setCustomAnimations()`方法应用自定义动画。例如,当我们添加一个新的Fragment时: ```java FragmentTransaction transaction = getSupportFragmentManager().begin...

    android Fragment回退栈简单示例

    Fragment回退栈是Android系统管理Fragment的一种机制,它模拟了浏览器的后退功能,用户可以通过点击设备上的返回按钮或者程序逻辑来触发回退操作。下面将详细介绍Android Fragment回退栈的原理、使用方法以及实践中...

    Android fragment切换动画.rar

    Android提供了多种方式来实现Fragment的动画效果,包括使用`Transaction`对象以及自定义动画。 1. **使用`FragmentManager`和`FragmentTransaction`**: 在Fragment的切换过程中,我们通常会使用`FragmentManager`...

    Fragment后退栈和add,remove,replace的基本使用

    本篇文章将详细探讨Fragment后退栈以及`add`, `remove`, `replace`这三种操作的基本使用。 首先,理解Fragment后退栈(BackStack)的概念至关重要。后退栈是Android系统用于管理Fragment状态的一种机制,它模拟了...

    安卓自定义ViewGroup 自定义TextView fragment自由切换带渐变

    安卓自定义ViewGroup 自定义TextView fragment自由切换带渐变 写的demo 好多东西可以用到各种项目里 还有我写的布局 全部相对布局,完美适配各种屏幕,适合新手学习,

    viewpager和自定义Fragment滚动

    在这个实例中,我们将探讨如何实现一个类似于QQ界面的布局,其中`TabHost`用于切换不同`Activity`,而`ViewPager`则负责展示自定义的`Fragment`进行平滑滚动。 首先,`TabHost`是一个可以容纳多个`TabWidget`(标签...

    Fragment,Activity切换动画demo

    我们可以使用`FragmentManager.beginTransaction()`方法创建一个事务,并通过`setCustomAnimation()`方法设置自定义的进入和退出动画。 例如,要实现一个简单的左右滑动动画,我们可以这样编写代码: ```java ...

    Activity之间以及fragment之间跳转 共享元素动画实现

    最后,为了在回退栈中正确处理动画,我们需要在AndroidManifest.xml中对目标Activity添加android:allowEmbedded="true"属性,以允许其在另一个Activity中作为Fragment嵌入。 通过以上步骤,我们就可以在Activity和...

    包括fragment的使用 动画的使用

    4. **自定义动画**:开发者还可以根据需求自定义动画,例如通过继承`Animator`类或实现`AnimatorListener`接口来创建复杂的动画效果。 在实际开发中,熟练掌握Fragment和动画的使用能够帮助我们构建更高级、更具有...

    fragment多种切换动画效果

    对于Fragment动画,可以使用`FragmentTransaction`的`setCustomAnimation()`方法设置自定义动画,参数是进入和退出动画的资源ID。 2. **帧动画(Frame Animation)**:帧动画是通过连续播放一系列静态图像来创建...

    fragment回退栈案例

    Fragment回退栈是Android开发中的一个重要概念,尤其是在处理复杂用户界面和导航时。在这个案例中,我们将深入探讨Fragment回退栈的工作原理、如何使用以及它在实际应用中的常见实践。 首先,Fragment是Android SDK...

    Fragment_21种动画滑动Gesture手势触发

    在标题“Fragment_21种动画滑动Gesture手势触发”中,提到的核心概念是利用Gesture(手势)来实现Fragment之间的动画切换。下面我们将深入探讨Fragment、动画以及Gesture在Android中的应用。 首先,Fragment是...

    Android中21中fragment切换的动画

    8. **自定义动画**:开发者还可以通过实现`Animator`接口来自定义自己的动画效果,提供无限可能。 实现这些动画主要涉及以下几个步骤: 1. **创建动画资源**:在`res/anim`目录下创建XML动画文件,定义动画的属性...

    Fragment切换动画

    这个过程中,`FragmentTransaction`提供了丰富的功能,不仅可以控制动画,还可以处理Fragment的生命周期和回退栈管理。通过熟练掌握这些技巧,你可以为Android应用创造出流畅、动态的界面交互。

    Fragment实现并且有动画效果

    此外,还可以通过监听Fragment的生命周期方法,比如`onCreateAnimator()`,自定义更复杂的动画效果。这需要重写`Fragment`并返回一个`Animator`对象。 总结来说,实现Fragment切换动画的关键步骤包括: 1. 创建...

    Fragment和动画

    - 当Fragment被添加、移除或替换时,可以自定义进入和退出动画,这可以通过在FragmentTransaction中设置setCustomAnimations()来实现。 - 对Fragment内的视图使用属性动画,例如,点击按钮后,让按钮放大并改变颜色...

Global site tag (gtag.js) - Google Analytics