我想动画去除片段。
我试过了:
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
.remove(myFragment)
.commit();
但片段就会消失。
我注意到了动画只能用“取代”玩,所以我试图用这样一个空的片段来替代片段:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
.replace(viewId, new Fragment())
.commit();
但它仍然只是消失消失。
所以,我怎么能动画去除片段?
Answer 1:
我想到了。
离开的视图的进入视图的画布上的动画,所以如果没有进入画布没有画布动画。
为了显示动画,我不得不经常更换使用,并使用相同尺寸的碎片进入那些退出。 动画结束后我设置新的片段走了的观点。
Answer 2:
我看到这个的时候我有类似的问题,只是认为Id下降一个快速的注意。
而不是为了取代现有的创建一个虚拟的片段,我认为你应该动画当前片段观看。 当动画完成,你可以简单地删除片段。
这是我做的:
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);
}
Answer 3:
您可以通过这个自定义动画设置为fragmentTransaction动画拆除
fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);
第三和第四PARAMS是用于除去碎片
Answer 4:
一个空的片段更换,下一个片段的插入点之前,也延缓了下一个片段的插入(由200毫秒),使坯料片段的退出动画可以播放,解决了我的问题。
这在代码中插入与退出动画一个空的片段。
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>
Answer 5:
我从Zoltish回答的灵感,这是我的实现:
1.增加该片段内该方法中,将动画片段在屏幕的左边的:
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.call片段的从活动的onBack()的animateOut。
干杯
顺便说一下我的getDensity()是:
public static int getDensity(Context context)
{
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return (int)metrics.density;
}
它我计算当前运行设备的DP值。
Answer 6:
理由@hugoc说
离开的视图的进入视图的画布上的动画,所以如果没有进入画布没有画布动画。
为了显示动画,我不得不经常更换使用,并使用相同尺寸的碎片进入那些退出。 动画结束后我设置新的片段走了的观点。
下面是实际的代码:
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();
Answer 7:
我同意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);
}
}
}
}
Answer 8:
什么输入:
它是必须展示新片段
什么退出:
它是必须隐藏当前片段
什么popEnter:
这是以前的片段,它必须是表演
什么popExit:
它是必须隐藏当前片段
对于使用这些动画,你应该显示或隐藏交易指令对其进行定位。 退出动画不会在所有的工作/更换程序。
Answer 9:
下面一个简单的办法:
1-呼叫动画上fragment.getView()。
内部onAnimationEnd 2-删除片段()。
final Fragment frag= getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
frag.getView().animate().alpha(0f).scaleX(0f).scaleY(0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
getSupportFragmentManager()
.beginTransaction()
.remove(frag)
.commit();
}
}).start();
Answer 10:
setCustomAnimations(进入,退出,popEnter,popExit)支持进入和退出动画,所以设置4个动画,必须transaction.replace之前保持()
科特林:
val manager = supportFragmentManager
val transaction = manager.beginTransaction()
transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right ,
android.R.anim.slide_in_left, android.R.anim.slide_out_right)
transaction.commit()
Answer 11:
所以,最简单的方法:
当你打开一个片段(从父活动叫):
FragmentA fragment = new FragmentA();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.slide_up, R.anim.slide_down);
transaction.add(android.R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commit();
指定进入和退出交易
transaction.setCustomAnimations(R.anim.slide_up,R.anim.slide_down);
当关闭一个片段(从片段中调用)
getActivity().getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_up, R.anim.slide_down).remove(this).commit();
指定进入和退出交易
setCustomAnimations(R.anim.slide_up,R.anim.slide_down)
文章来源: How to animate fragment removal