片段setCustomAnimations()效果不好?

时间:2015-10-16 03:21:22

标签: android animation transactions fragment

我在使用fragmentTransaction.setCustomAnimations(R.animator.slide_in_down, R.animator.slide_out_down)时遇到一些问题,当我希望两个片段顺利滑下时,in-fragment会在out-fragment完成slide_out_down的动画制作后立即出现,并且当我改变动画师希望两个片段顺利滑动时,in-fragment会在out-fragment开始动画师之前消失。

看起来像这张照片 enter image description here

为什么?怎么解决这个问题?

有更多细节。

我有一个列表视图,屏幕左侧有三个项目,右边有三个片段,一个项目有一个片段。

样本

enter image description here

MyActivity中的

,我在onCreate()

中初始化了我的所有片段
private void createFragment(int initPosition) {
     mFragment[0] = new Fragment();
     mFragment[1] = new Fragment();
     mFragment[2] = new Fragment();

     mFragmentManager = getFragmentManager();
     mFragmentTransaction = mFragmentManager.beginTransaction();
     mFragmentTransaction.add(R.id.content_layout, mFragment[initPosition]);
     mFragmentTransaction.commit();
}

当listview更改它的选择时,我将onItemSelectedListener设置为listview,名为replaceFragment(int fromPos, int toPos)

private void replaceFragment(int fromPos, int toPos) {
    if(fromPos != toPos) {
        mFragmentTransactoin = mFragmentManager.beginTransaction();

        //add animator
        if (fromPos < toPos) {
            mFragmentTransaction.setCustomAnimations(R.animator.slide_in_up, R.animator.slide_out_up);
        } else {
            mFragmentTransaction.setCustomAnimations(R.animator.slide_in_down, R.animator.slide_out_down);
        }

        if (!mFragments[toPos].isAdded()) {
            mFragmentTransaction.add(R.id.content_layout, mFragments[toPos]);
        }
        mFragmentTransaction.show(mFragments[toPos]);
        mFragmentTransaction.hide(mFragments[toPos]);
        mFragmentTransaction.commit();
    }
}

为什么不使用replace(),因为replace()导致out-fragment被毁,in-fragment每次都会初始化。这很糟糕。show()hide()可以避免这种情况。

动画师代码:

slide_in_up.xml

<objectAnimator
    android:valueFrom="1280"
    android:valueTo="0"
    android:propertyName="translationY"
    android:duration="800"/>


slide_out_up.xml

<objectAnimator
    android:valueFrom="0"
    android:valueTo="-1280"
    android:propertyName="translationY"
    android:duration="800"/>


slide_in_down.xml

<objectAnimator
    android:valueFrom="-1280"
    android:valueTo="0"
    android:propertyName="translationY"
    android:duration="800"/>


slide_out_down.xml

<objectAnimator
    android:valueFrom="0"
    android:valueTo="1280"
    android:propertyName="translationY"
    android:duration="800"/>

感谢任何回复。

1 个答案:

答案 0 :(得分:0)

class NavigatorBloc extends Bloc<NavigatorAction, dynamic>{
  final GlobalKey<NavigatorState> navigatorKey;
  NavigatorBloc({this.navigatorKey});

  @override
  dynamic get initialState => 0;

  @override
  Stream<dynamic> mapEventToState(NavigatorAction event) async* {
    if(event is NavigatorActionPop){
      yield navigatorKey.currentState.pop();
    }
  }
}