我最近一直在尝试为我的应用程序添加一些很酷的片段过渡animations
,我或多或少已经弄清楚如何做到这一点。然而,我只能让我的动画在API level 11 and up
上工作。这是因为我使用的属性动画不支持的库。我试图通过包括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>
<<p> Gradle依赖/strong> 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+"
看看这篇关于Flip动画的文章。此外,这篇文章一定是有帮助的,至少我在11之前成功地使用了API级别的Flip动画(实际上在2.3.5上进行了测试,它可以工作)。简而言之,你需要一个"支持v4支持nineoldandroid"的库。