我想动画删除片段。
我试过了:
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
.remove(myFragment)
.commit();
但片段刚刚消失。
我注意到out动画只播放'replace',所以我尝试用这样的空片段替换片段:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
.replace(viewId, new Fragment())
.commit();
但它仍然只是消失了。
那么,我如何设置片段的删除动画?
答案 0 :(得分:19)
我明白了。
退出视图在输入视图的画布上设置动画,因此如果没有输入画布,则没有动画画布。
要显示动画,我必须始终使用替换并使用与退出相同大小的输入片段。动画结束后,我将新片段的视图设置为消失。
答案 1 :(得分:16)
当我遇到类似的问题时,我就看到了这一点,并且我认为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);
}
答案 2 :(得分:7)
您可以通过将此自定义动画设置为fragmentTransaction
来为删除设置动画 fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);
第三和第四个参数用于删除片段
答案 3 :(得分:2)
替换为空片段,在插入下一个片段之前,还延迟插入下一个片段(200ms),以便空白片段的退出动画可以播放,解决了我的问题。
这是用于插入带有退出动画的空片段的代码。
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>
答案 4 :(得分:1)
我从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.从活动的onBack()调用片段的animateOut。
干杯
我的getDensity()是:
public static int getDensity(Context context)
{
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return (int)metrics.density;
}
用它计算当前运行设备的DP值。
答案 5 :(得分:1)
原因如@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();
答案 6 :(得分:1)
我同意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);
}
}
}
}
答案 7 :(得分:0)
输入什么:
它是必须显示的新片段
什么退出:
它是必须隐藏的当前片段
popEnter:
它是必须显示的先前片段
popExit:
它是必须隐藏的当前片段
要使用这些动画,您应该在show或hide transaction命令上定位它们。退出动画不适用于删除/替换过程。
答案 8 :(得分:0)
1-在fragment.getView()上调用动画。
2-删除onAnimationEnd()内部的片段。
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();
答案 9 :(得分:0)
setCustomAnimations(输入,退出,popEnter,popExit)支持输入和退出动画,因此设置四个动画并必须在 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()
答案 10 :(得分:0)
简单的方法:
打开片段(从父活动调用)时:
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)
答案 11 :(得分:0)
在https://developer.android.com/training/basics/fragments/animate中查看动画的不同变体。
在任何事件(按钮单击,超时等)上,您都可以在片段中编写:
parentFragmentManager.beginTransaction()
.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.remove(this)
.commitAllowingStateLoss()
// parentFragmentManager.popBackStack() - might be needed if the fragment keeps visible after removing.