我在使用fragmentTransaction.setCustomAnimations(R.animator.slide_in_down, R.animator.slide_out_down)
时遇到一些问题,当我希望两个片段顺利滑下时,in-fragment
会在out-fragment
完成slide_out_down
的动画制作后立即出现,并且当我改变动画师希望两个片段顺利滑动时,in-fragment
会在out-fragment
开始动画师之前消失。
有更多细节。
我有一个列表视图,屏幕左侧有三个项目,右边有三个片段,一个项目有一个片段。
样本
在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"/>
感谢任何回复。
答案 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();
}
}
}