支持片段转换动画可能吗?

时间:2014-08-20 05:23:17

标签: android animation fragment android-support-library

我最近一直试图为我的应用程序添加一些很酷的片段转换animations,而我或多或少已经想出了如何做到这一点。但是我只能使用我的动画来处理API level 11 and up。这是因为我正在使用不支持compat库的Property Animations。我试图通过包含nineOldAndroids库来解决此问题。我还投入了support-v4-NineOldAndroids图书馆来帮忙。

当我运行较新的设备并为我的旧设备抛出运行时错误时,我的动画仍然有效。 SupportFragment动画可能吗?如果是这样,你怎么建议应该这样做?

这是我为片段制作动画的逻辑。我需要将我的主片段向右滑动,但在我的导航片段从左侧滑入时保持在视图中。

 public  void flipFragment() {
    if(showingMenu){
        getSupportFragmentManager().popBackStack();


        slideToMain(null);
        return;
    }

    showingMenu = true;


    Animator.AnimatorListener listener = new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {

            android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.setCustomAnimations(R.anim.slide_in, 0, 0, R.anim.slide_out)
                    .add(R.id.fragment_container, customNavigation)
                    .addToBackStack(null)
                    .commit();
        }
    };
    slideToNav(listener);

}

private void slideToMain(String sReddit) {




        if (sReddit != null && apiTask != null) {
            apiTask.execute(sReddit);
        }


    View movingFragmentView = mainView.getView();

    PropertyValuesHolder rotateY = PropertyValuesHolder.ofFloat("rotationY",-15f, 0f);
    PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX",1.0f);
    PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
    PropertyValuesHolder translateX = PropertyValuesHolder.ofFloat("translationX",0f);

    ObjectAnimator movingFragmentsAnimator = ObjectAnimator.ofPropertyValuesHolder(movingFragmentView, rotateY, scaleX, scaleY, translateX);


    movingFragmentsAnimator.setDuration(1300);
    movingFragmentsAnimator.setStartDelay(1);

    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.play(movingFragmentsAnimator);
    animatorSet.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            showingMenu = false;
        }
    });
    animatorSet.start();

}

private void slideToNav(Animator.AnimatorListener listener) {
    View movingFragmentView = mainView.getView();

    PropertyValuesHolder rotateY = PropertyValuesHolder.ofFloat("rotationY",-15f);
    PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX",0.8f);
    PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.8f);
    PropertyValuesHolder translateX = PropertyValuesHolder.ofFloat("translationX",400f);

    ObjectAnimator movingFragmentsAnimator = ObjectAnimator.ofPropertyValuesHolder(movingFragmentView, rotateY, scaleX, scaleY, translateX);


    movingFragmentsAnimator.setDuration(1000);


    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(movingFragmentsAnimator);
    animatorSet.addListener(listener);
    animatorSet.start();


}

动画xml

<set>
<objectAnimator
    android:valueFrom="-100"
    android:valueTo="-1290"
    android:propertyName="translationX"
    android:interpolator="@android:interpolator/accelerate_decelerate"
    android:duration="1300"
    />
<objectAnimator
    android:valueFrom="0"
    android:valueTo="1"
    android:propertyName="alpha"
    android:startOffset="1000"
    android:duration="1"
    />
</set>

Gradle依赖

compile files('libs/nineoldandroids-2.4.0.jar')
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
compile files('libs/support-v4-animator-13.0.0-sources.jar')
compile "com.android.support:appcompat-v7:19.1.0+"

1 个答案:

答案 0 :(得分:0)

看看this post - 关于翻转动画。同样this post必须有所帮助,至少我成功使用了11级之前的API级别的Flip动画(实际上在2.3.5上进行了测试并且它可以工作)。简而言之 - 您需要为NineOldAndroids&#34;提供支持-v4支持。库。