Fragment幻灯片动画问题

时间:2015-05-20 06:13:42

标签: android animation android-fragments

我正在创建自动播放幻灯片动画。在那,它不仅仅是幻灯片放映,它是重叠的幻灯片放映。

意思是,我有5组片段fragA,fragB,fragC,fragD,fragE。

首先,我希望fragA保持静态(没有动画),它应该保持静态0.5秒。之后,fragB应该滑过fragA。一旦fragB完成,fragA就会消失。在启动fragB 0.5秒后,应启动fragC。一旦fragC完成,fragB就会消失,等等。

我发现如果我使用android:name属性在活动中添加元素,则当fragB滑入时,fragA保持静态。

问题空间:

但是当fragB完成滑入时,屏幕上会弹出fragA并且看不到碎片B.

所以,我在片段B中编写了下面的代码,当动画结束时,它应该从堆栈中删除fragA。但是当我执行下面的代码时,没有动画发生,只显示了fragB。

@Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
        if(nextAnim == 0 || !enter) {
            return super.onCreateAnimator(transit, enter, nextAnim);
        }
        Animator animator = AnimatorInflater.loadAnimator(getActivity(),nextAnim);
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {
                ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(getView(),new XFractionProperty(),1.0f,0.0f);
                objectAnimator.setDuration(1600);
                objectAnimator.setStartDelay(500);
                objectAnimator.start();
            }

            @Override
            public void onAnimationEnd(Animator animator) {
                FragmentManager fm = getActivity().getFragmentManager();
                fm.popBackStack("one",FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });
        return animator;
    }

我正在创建如下的片段,

FragmentTransaction ft = getFragmentManager().beginTransaction();
        FirstFragment firstFragment = FirstFragment.newInstance("one");
        ft.add(R.id.frame, firstFragment);
        ft.addToBackStack("one");

        ft.commit();

        final SecondFragment secondFragment = SecondFragment.newInstance("second");


        FragmentTransaction ft1 = getFragmentManager().beginTransaction();

        //ft1.show(firstFragment);
        ft1.replace(R.id.frame, secondFragment);
        ft1.setCustomAnimations(R.anim.slideinwithhalfasecdelay, R.anim.slideout);
        //ft1.hide(firstFragment);

        //ft1.addToBackStack("two");

        ft1.addToBackStack("two");
        //ft1.show(secondFragment);
        ft1.commit();

我的活动代码如下:

<LinearLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">


    <fragment
        android:id="@+id/frame"
        android:name="clinicloud.com.slideshowtesting.FirstFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    </fragment>


</LinearLayout>

有人可以帮我解决这个问题吗?

好的,根据Hasmukh的建议,我修改了代码,它起作用了。

FirstFragment firstFragment1 = FirstFragment.newInstance("first");

        Log.d(TAG, "****Adding first fragment");
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        FirstFragment firstFragment = FirstFragment.newInstance("one");
        ft.add(R.id.frame, firstFragment);
        ft.addToBackStack("one");
        ft.commit();

        final SecondFragment secondFragment = SecondFragment.newInstance("second");


        FragmentTransaction ft1 = getFragmentManager().beginTransaction();
        ft1.setCustomAnimations(R.anim.slideinwithhalfasecdelay, R.anim.slideout);
        ft1.replace(R.id.frame, secondFragment);
        ft1.commit();

但现在我正在尝试添加我的第三个片段,

FirstFragment firstFragment1 = FirstFragment.newInstance("first");

        Log.d(TAG, "****Adding first fragment");
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        FirstFragment firstFragment = FirstFragment.newInstance("one");
        ft.add(R.id.frame, firstFragment);
        ft.addToBackStack("one");
        ft.commit();

        final SecondFragment secondFragment = SecondFragment.newInstance("second");


        FragmentTransaction ft1 = getFragmentManager().beginTransaction();
        ft1.setCustomAnimations(R.anim.slideinwithhalfasecdelay, R.anim.slideout);
        ft1.replace(R.id.frame, secondFragment);
        ft1.commit();

        ThirdFragment thirdFragment = ThirdFragment.newInstance("three");
        FragmentTransaction ft2 = getFragmentManager().beginTransaction();
        ft2.setCustomAnimations(R.anim.slideinwithasecdelay, R.anim.slideout);
        ft2.replace(R.id.frame, thirdFragment);
        ft2.commit();

现在,只有我的第三个片段滑过第一个片段。我希望第二个片段在第一个和第三个片段上滑动以在第二个片段上滑动。

我在代码中做错了什么?

1 个答案:

答案 0 :(得分:1)

您只需进行一次更改。

请在替换片段之前设置自定义动画。

ft1.setCustomAnimations(R.anim.slideinwithhalfasecdelay, R.anim.slideout);

// and then 

ft1.replace(R.id.frame, secondFragment);

不需要隐藏第一个片段。希望它适合你。