Android 如何设置片段移除的动画
我想动画的片段删除 我试过:Android 如何设置片段移除的动画,android,animation,fragment,Android,Animation,Fragment,我想动画的片段删除 我试过: getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out) .remove(myFragment) .commit(); 但是碎片消失了 我注意到out动画只播放“replace”,因此我尝试用空片段替换片段,如下所示: getSupportFragmentManager()
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();
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();
但它还是消失了
那么,我怎样才能为片段的移除设置动画呢?我想出来了
退出视图在进入视图的画布上设置动画,因此如果没有进入画布,则没有用于动画的画布
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.exit, R.anim.pop_exit)
.replace(R.id.fragmentLayout, new Fragment())
.commit();
为了显示动画,我必须始终使用replace,并使用与退出的片段大小相同的输入片段。动画完成后,我将新片段的视图设置为“消失”。当我遇到类似问题时,我看到了这一点,我只是想写个简短的说明 我认为应该为当前片段视图设置动画,而不是创建虚拟片段来替换现有片段。动画完成后,只需删除片段即可 我就是这样做的:
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);
}
我从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()
.setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
.replace(viewId, new Fragment())
.commit();
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();
2.从活动的onBack()调用片段的animateOut
干杯
顺便说一下,我的getDensity()是:
使用它,我计算当前运行设备的DP值。您可以通过将此自定义动画设置为fragmentTransaction来设置删除的动画
fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);
第三个和第四个参数用于删除片段,正如@hugoc所说
getActivity().getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_up, R.anim.slide_down).remove(this).commit();
退出视图在进入视图的画布上设置动画,因此如果没有进入画布,则没有用于动画的画布
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.exit, R.anim.pop_exit)
.replace(R.id.fragmentLayout, new Fragment())
.commit();
为了显示动画,我必须始终使用replace,并使用与退出的片段大小相同的输入片段。动画完成后,我将新片段的视图设置为“消失”
以下是实际代码:
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();
用一个空片段替换,在插入下一个片段之前,也延迟下一个片段的插入(以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>
输入内容:这是必须展示的新片段 什么出口:
必须隐藏的是当前片段 什么popEnter:
必须显示的是上一个片段 什么POPEEXIT:
必须隐藏的是当前片段
要使用这些动画,应在“显示”或“隐藏事务”命令中以它们为目标。退出动画在删除/替换过程中不起作用 我同意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);
}
}
}
}
下面是一个简单的解决方案:
1-调用fragment.getView()上的动画
2-删除onAnimationEnd()中的片段
setCustomAnimations(回车、退出、弹出回车、弹出退出)支持回车和退出动画,因此设置四个动画,并且必须在transaction.replace()之前保留它。 科特林: 所以简单的方法是: 打开片段(从父活动调用)时: 指定输入和退出事务 transaction.setCustomAnimations(R.anim.slide\u向上,R.anim.slide\u向下) 关闭片段时(从片段内部调用) 指定输入和退出事务 设置自定义动画(R.anim.slide\u向上,R.anim.slide\u向下)
请参见中动画的不同变体 在任何事件(按钮点击、超时等)中,您都可以在片段中写入:
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.
我很想多听听这方面的情况。我想为几个片段的移除设置动画,然后在一段时间后(异步任务处理)在另一组片段中设置动画。我可以简单地创建一个“虚拟”片段,其透明视图的大小与我想要制作动画的原始片段的大小相同吗?是的,这正是我所做的。没有其他解决方案吗?但是你在哪里做的??碎片的哪种方法?你想移除碎片的地方。Fx我是在计时器达到0或用户按下discard时做的。你可以这样做,但如果你想在backPress上向后播放动画呢?制作片段动画的意义在于,你不必为viewshad设置动画,就可以在2020年的SherlockActivity上咧嘴大笑。过去的好时光:-)OnAnimationEnd()坏了