我最近一直试图为我的应用程序添加一些很酷的片段转换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+"