如何animation片段删除

我想animation去除片段

我试过了:

getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out) .remove(myFragment) .commit(); 

但片段就消失了。

我注意到outanimation只能用'replace'来播放,所以我试图用这样一个空的fragment来replacefragment:

 getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out) .replace(viewId, new Fragment()) .commit(); 

但它仍然消失。

那么,我该如何animation去除碎片呢?

Solutions Collecting From Web of "如何animation片段删除"

我想到了。

退出的视图在input视图的canvas上是animation的,所以如果没有inputcanvas,那么animation就没有canvas。

要显示animation,我必须始终使用replace,并使用input相同大小的碎片到那些退出。 animation完成后,我将新片段的视图设置为去除。

当我遇到类似的问题时,我看到了这一点,只是想到了一个简单的说明。

而不是创build一个虚拟的片段,以取代现有的片段,我认为你应该animation当前的片段视图。 当animation结束时,您可以简单地删除片段。

这是我做到的:

 final FragmentActivity a = getSherlockActivity(); if (a != null) { //Your animation Animation animation = AnimationUtils.loadAnimation(a, R.anim.bottom_out); animation.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)); //You can use AnimationListener, MagicAnimationListener is simply a class extending it. animation.setAnimationListener(new MagicAnimationListener() { @Override public void onAnimationEnd(Animation animation) { //This is the key, when the animation is finished, remove the fragment. try { FragmentTransaction ft = a.getSupportFragmentManager().beginTransaction(); ft.remove(RestTimerFragment.this); ft.commitAllowingStateLoss(); } catch (Exception e) { e.printStackTrace(); } } }); //Start the animation. getView().startAnimation(animation); } 

您可以通过将此自定义animation设置为fragmentTransaction来animation化删除

  fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out); 

第三个和第四个参数是为了删除片段

我从Zoltish的答案中得到了启发,这是我的实现:

1.将此方法添加到片段中,将片段移出屏幕左侧的animation:

 public void animateOut() { TranslateAnimation trans=new TranslateAnimation(0,-300*Utils.getDensity(getActivity()), 0,0); trans.setDuration(150); trans.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub ((BetsActivty)getActivity()).removeFrontFragmentAndSetControllToBetting(); } }); getView().startAnimation(trans); } 

onAnimationEnd()里面的方法就是这样去掉这个片段:

 getSupportFragmentManager().beginTransaction(). remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit(); 

2.从活动的onBack()中调用fragment的animateOut。

干杯

顺便说一句,我的getDensity()是:

 public static int getDensity(Context context) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return (int)metrics.density; } 

与我计算当前运行设备的DP值。

理由为@ hugoc说

退出的视图在input视图的canvas上是animation的,所以如果没有inputcanvas,那么animation就没有canvas。

要显示animation,我必须始终使用replace,并使用input相同大小的碎片到那些退出。 animation完成后,我将新片段的视图设置为去除。

下面是实际的代码:

 FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top); transaction.hide(removeFragment).add(R.id.fragment_container,addFragment).commit(); transaction = manager.beginTransaction(); transaction.remove(removeFragment).commit(); 

在插入下一个片段之前,用一个空的片段replace,并延迟插入下一个片段(200ms),以便空白片段的退出animation可以播放,解决了我的问题。

这是用退出animation插入一个空片段的代码。

 getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.exit, R.anim.pop_exit) .replace(R.id.fragmentLayout, new Fragment()) .commit(); 

Exit.xml

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="-100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="200"/> </set> 

pop_exit.xml

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="200"/> </set> 

什么input:
它是必须显示的新片段

什么退出:
这是目前必须隐藏的片段

什么popEnter:
它是必须显示的前一个片段

什么popExit:
这是目前必须隐藏的片段

为了使用这些animation,您应该在显示或隐藏事务命令上进行定位。 退出animation不适用于删除/replace程序。

我同意hugoc和这里的一些代码来解决它

 public class MyActivity extends Activity { //Some thing public void Fragment2BackToFragment1(Fragment fragment1, Fragment fragment2) { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); animateExit(fragment2); ft.replace(R.id.main_content, fragment1, "fragment1"); ft.commit(); } private void animateExit(Fragment exitFragment) { if (exitFragment != null) { final View view = exitFragment.getView(); if (view != null) { int anim = R.anim.fade_out; Animation animation = AnimationUtils.loadAnimation(getActivity(), anim); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { view.postDelayed(new Runnable() { @Override public void run() { view.setVisibility(View.GONE); } }, 300); } @Override public void onAnimationRepeat(Animation animation) { } }); view.startAnimation(animation); } } } }