Android fragment退出view时怎么设置退出动画?求救...

梅明子 2015-01-15 02:58:11
我的项目是这样的:点击 图1 的item项,就打开对应的图2页面。这个是fragment做的,相信大家都知道。现在我要的效果就是,当点击图2左上角的返回按钮时,图2消失,显示图1,这个图2消失的过程不是闪一下就没了,而是要慢慢向右边滑动出去,请问这个该怎么实现?

图1:


图2:
...全文
1017 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
神奇一Long 2015-12-14
  • 打赏
  • 举报
回复
点击Push按钮,就会向界面中添加一个新的Fragment,这个Fragment的内容很简单,就是显示一个文本,内容为”Fragment #数字”,其中数字从1递增。从上面我们就可以知道原来指定Fragment的动画用很简单的一句话就可以了: FragmentTransaction android.app.FragmentTransaction.setCustomAnimations(intenter, int exit, int popEnter, int popExit) 其中参数的意义是 1)enter 指定向栈中放入新的Fragment时的动画 2)exit 指定向栈中弹出当前栈顶的Fragment时的动画 3)popEnter 指定由于当前栈顶Fragment弹出而显示底层的Fragment时的动画 4)popExit 指定当前栈顶的Fragment被弹出时的动画
hdev0225 2015-07-03
  • 打赏
  • 举报
回复

	public static void removeFragment(Context context, Fragment fragment, int outAnimId) {
		if (fragment == null) return;
		FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
		if (outAnimId != -1) {
			ft.setCustomAnimations(0, outAnimId);
		}
		ft.remove(fragment);
		ft.commit();
		
		 ((FragmentActivity)context).getSupportFragmentManager().popBackStackImmediate();
	}
       

andy_yyyy 2015-04-23
  • 打赏
  • 举报
回复
你好!我也是遇到这个问题,请问你的问题解决了吗?怎么解决的?
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
fragment 的布局文件 R.layout.XXX 至于底部那个东西,可以做个popupWindow来实现。 View viewIn = LayoutInflater.from(this).inflate(R.layout.XXX, null); //this指的是Context //R.layout.XXX 由你掌控,一般是子布局,适配器里面经常用到的啊。当然也有addView的时候。 android里面貌似除了4大组件 + Intent,像控件,布局这些都是View或ViewGroup.你项目里的布局文件.xml就是View.这个动画很简单了,你先把思路捋清楚吧。
梅明子 2015-01-16
  • 打赏
  • 举报
回复
引用 15 楼 u012137924 的回复:
兄弟,你新建一个APP然后做两个布局,然后试验我给的代码,这个很简单啊。就是一个TranslationX而已。当然,里面还可以加上渐变效果,我现在也在做项目,呵呵,偷空上来看看的。加油!
你的代码都不是fragment的呀!直接两个view跳转的,我的是fragment的
梅明子 2015-01-16
  • 打赏
  • 举报
回复
引用 14 楼 u012137924 的回复:
要做成,xml文件的话,需要在res 目录下新建文件夹animator,注意不是anim,关于这个你可以去找找资料。这里说太浪费时间了。呵呵。等过年放假的时候,我准备写几篇总结的博客,届时希望捧个场。
晕,好啊,你把邮箱告诉我,我发给你,你帮我看怎么实现嘛,我很差的,你说那么多我都不太明白。
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
兄弟,你新建一个APP然后做两个布局,然后试验我给的代码,这个很简单啊。就是一个TranslationX而已。当然,里面还可以加上渐变效果,我现在也在做项目,呵呵,偷空上来看看的。加油!
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
要做成,xml文件的话,需要在res 目录下新建文件夹animator,注意不是anim,关于这个你可以去找找资料。这里说太浪费时间了。呵呵。等过年放假的时候,我准备写几篇总结的博客,届时希望捧个场。
梅明子 2015-01-16
  • 打赏
  • 举报
回复
引用 10 楼 u012137924 的回复:
view 由你自己指定啊。。。
你好,要不这样,我发给你一个我开始做的时候,写的一个类似的小demo,你帮我看看怎么实现好么?
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
// 如果要2个动画一起动,那么实现这个方法 public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub inAnimator.start(); } // 初始化动画 outAnimator(viewOut); inAnimator(viewIn); 左图的初始化了没,监听器里面做,顺便说下,动画可以做成res目录下面的.xml文件。你可以先新建一个新文件来测试下,应该是没有问题的,如果还需要反向动画的话,那么在动画里面的参数改下就OK了。 outAnimator.addListener(new AnimatorListener() 可以放在public void outAnimator(View v) 方法里面。
梅明子 2015-01-16
  • 打赏
  • 举报
回复
引用 8 楼 u012137924 的回复:
晕,表情是怎么上去的。对了,上面的动画监听里面还可以添加渐变等等效果,也就是集成动画,不过有点取巧,呵呵,可以用AnimatorSet这个类去搞,里面有个animatorSet.playTogether(items);这个方法可以把你想要的动画全部加载进去。 顺便问句,你的项目是 本地,在线 双用的吗?
目前还没有做在线的,效果跟viewpage差不多吧!但是左图里面本身就有一个了,现在实现的只有右图的进入动画,左图的一点效果都没有。

fragManage = MainActivity.this.getSupportFragmentManager();
			FragmentTransaction transion = fragManage.beginTransaction();
			FragmentInfoContent infocon = new FragmentInfoContent(
					MainActivity.this, play, musicName, main_top, scroll,
					cursor_layout, pager,transion);

			main_top.setVisibility(View.GONE);
			scroll.setVisibility(View.GONE);
			cursor_layout.setVisibility(View.GONE);
			pager.setVisibility(View.GONE);

			transion.setCustomAnimations(R.anim.push_left_in, R.anim.push_left_out);
			transion.replace(R.id.activity_lin_title, infocon);
			transion.addToBackStack(null);
			//transion.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);// 设置动画效果
			transion.commit();
代码里的隐藏部分,是因为无论哪个界面都要看到背景图,所以两个view的背景都是透明的,这样一来左图的内容就先隐藏了,不然右图替换过来,还会看到左图的内容。
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
view 由你自己指定啊。。。
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
你的效果就是类似Gallery的效果是吧?
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
晕,表情是怎么上去的。对了,上面的动画监听里面还可以添加渐变等等效果,也就是集成动画,不过有点取巧,呵呵,可以用AnimatorSet这个类去搞,里面有个animatorSet.playTogether(items);这个方法可以把你想要的动画全部加载进去。 顺便问句,你的项目是 本地,在线 双用的吗?
梅明子 2015-01-16
  • 打赏
  • 举报
回复
引用 6 楼 u012137924 的回复:
简单的动画就可以实现了啊。针对你的问题粗略的写了个,你自己优化下。


你好,麻烦你先好好看看我想实现的效果图:
山鹰1985 2015-01-16
  • 打赏
  • 举报
回复
简单的动画就可以实现了啊。针对你的问题粗略的写了个,你自己优化下。 public class MainActivity extends Activity { private ObjectAnimator outAnimator, inAnimator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //你的两个布局 View viewOut = LayoutInflater.from(this).inflate( R.layout.activity_main, null); View viewIn = LayoutInflater.from(this).inflate(R.layout.XXX, null); // 初始化动画 outAnimator(viewOut); inAnimator(viewIn); //监听动画过程 viewOut.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { outAnimator.start(); outAnimator.addListener(new AnimatorListener() { // 如果要2个动画一起动,那么实现这个方法 public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub inAnimator.start(); } @Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub } // 如果要先让出动画完成后,再实现进动画;那么用这个方法 @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub // inAnimator.start(); } @Override public void onAnimationCancel(Animator animation) { // TODO Auto-generated method stub } }); } }); } // 出动画.注意v.getWidth()是你布局的宽度,也可以说是你手机的屏幕宽度. public void outAnimator(View v) { outAnimator = ObjectAnimator.ofFloat(v, "translationX", 0.0f, v.getWidth()); outAnimator.setInterpolator(new LinearInterpolator()); outAnimator.setDuration(500); } private void inAnimator(View v) { inAnimator = ObjectAnimator.ofFloat(v, "translationX", -v.getWidth(), 0.0f); inAnimator.setInterpolator(new LinearInterpolator()); inAnimator.setDuration(500); } }
梅明子 2015-01-16
  • 打赏
  • 举报
回复
引用 3 楼 u010853225 的回复:
	/**
	 * 切换Fragment
	 * @param fragment
	 * @param isFirst
	 */
	protected void change(Fragment fragment, boolean isFirst) {
		FragmentTransaction t = this.fragmentManager.beginTransaction();
		setCustomAnimations(R.anim.push_left_in, R.anim.push_left_out, t);
		t.replace(R.id.container, fragment);
		if (!isFirst) {
			t.addToBackStack(null);
		}
		t.commit();
	}
R.anim.push_left_in:

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

</set>
上面是我写的,用法就是这样,具体的你再斟酌一下!
但是我这个并不是两个fragment同时滑动,也就是说一进一出,所以图2进入动画有,但退出动画就没有了,怎么设置?
梅明子 2015-01-15
  • 打赏
  • 举报
回复
引用 3 楼 u010853225 的回复:
	/**
	 * 切换Fragment
	 * @param fragment
	 * @param isFirst
	 */
	protected void change(Fragment fragment, boolean isFirst) {
		FragmentTransaction t = this.fragmentManager.beginTransaction();
		setCustomAnimations(R.anim.push_left_in, R.anim.push_left_out, t);
		t.replace(R.id.container, fragment);
		if (!isFirst) {
			t.addToBackStack(null);
		}
		t.commit();
	}
你那不是替换吗!我要的是退出动画呀。 getFragmentManager().popBackStack();//退出
budworm 2015-01-15
  • 打赏
  • 举报
回复
	/**
	 * 切换Fragment
	 * @param fragment
	 * @param isFirst
	 */
	protected void change(Fragment fragment, boolean isFirst) {
		FragmentTransaction t = this.fragmentManager.beginTransaction();
		setCustomAnimations(R.anim.push_left_in, R.anim.push_left_out, t);
		t.replace(R.id.container, fragment);
		if (!isFirst) {
			t.addToBackStack(null);
		}
		t.commit();
	}
R.anim.push_left_in:

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

</set>
上面是我写的,用法就是这样,具体的你再斟酌一下!
梅明子 2015-01-15
  • 打赏
  • 举报
回复
引用 1 楼 u010911576 的回复:
PendingIntent
????????
加载更多回复(1)

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧