Android 片段动画期间新片段出现在旧片段下方
Android new fragment appears below old one during fragment animation
我在片段之间使用动画 :
从左边滑入:
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:propertyName="x"
android:valueFrom="2000"
android:valueTo="0"
android:valueType="floatType"
android:fillAfter="true"/>
</set>
从右边滑入:
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:propertyName="x"
android:valueFrom="0"
android:valueTo="-400"
android:valueType="floatType"/>
</set>
此动画将前一个片段移到左侧,新片段移到右侧。我将它与片段交易一起使用。
transaction.setCustomAnimations(R.animator.slide_in_from_left,R.animator.slide_in_from_right);
当新片段滑到旧片段下方时我遇到了麻烦,为了解决这个问题,我在我的新片段上设置了高度,但我想要 API 低于 21 的解决方案。
是否可以强制新片段在旧片段之上
如果我理解正确,你在新片段上使用了 android:elevation
属性(如果没有,请随意写下你的方法)——尽管它只适用于 Lollipop 及更高版本,正如你也提到的.但是,根据下面的链接主题,有几种方法可以在 Lollipop 之前的设备上实现提升效果。
"android:elevation=" doesn't work on devices pre-Lollipop with compile API21
第一次评论后编辑: 好的,很抱歉误解了您的问题...:)
当我在主题中搜索一点点时,有一些有趣的例子,新片段与旧片段重叠,如下所列。前 2 个示例需要一些特殊的布局设计和现有视图的扩展 classes,但也许其中之一就是您正在寻找的。
- 在我看来,最漂亮的解决方案将基于此示例:http://swarmnyc.com/whiteboard/android-fragment-animations(布局不包含
FrameLayout
来替换片段,它包含 <fragment>
标签;代码中可以使用简单的过渡动画;源码在文末)
- 这里还有一个:http://trickyandroid.com/fragments-translate-animation/(可以看到原生
RelativeLayout
视图class的扩展,内置函数实现动画;源码也在文末提供主题)
此外(没有源代码)我可以建议您另外 2 种方法:
- 您搜索的动画可以通过使用完美实现
显示 UI 和
startActivity(intent)
之后 activity 内的 overridePendingTransition()
方法。但是,如果
如果你真的想使用片段,也许你会跳过这个。
- 最后(也是我认为最简单的)解决方案可能是通过添加新片段来重叠旧片段
片段而不是替换它。但是我认为这是最糟糕的
解决方案,因为可能存在内存使用问题(较旧
片段不会被删除,只是被更新的片段简单地淡化了。
我希望我能帮上忙...:)
如果片段出现在另一个片段下方是因为片段容器不是好的容器类型
你需要将fragment放在FrameLayout或RelativeLayout中,如果你想测试你可以将你的fragment布局代码粘贴到fragment容器的底部进行预览
我在片段之间使用动画 :
从左边滑入:
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:propertyName="x"
android:valueFrom="2000"
android:valueTo="0"
android:valueType="floatType"
android:fillAfter="true"/>
</set>
从右边滑入:
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:propertyName="x"
android:valueFrom="0"
android:valueTo="-400"
android:valueType="floatType"/>
</set>
此动画将前一个片段移到左侧,新片段移到右侧。我将它与片段交易一起使用。
transaction.setCustomAnimations(R.animator.slide_in_from_left,R.animator.slide_in_from_right);
当新片段滑到旧片段下方时我遇到了麻烦,为了解决这个问题,我在我的新片段上设置了高度,但我想要 API 低于 21 的解决方案。 是否可以强制新片段在旧片段之上
如果我理解正确,你在新片段上使用了 android:elevation
属性(如果没有,请随意写下你的方法)——尽管它只适用于 Lollipop 及更高版本,正如你也提到的.但是,根据下面的链接主题,有几种方法可以在 Lollipop 之前的设备上实现提升效果。
"android:elevation=" doesn't work on devices pre-Lollipop with compile API21
第一次评论后编辑: 好的,很抱歉误解了您的问题...:)
当我在主题中搜索一点点时,有一些有趣的例子,新片段与旧片段重叠,如下所列。前 2 个示例需要一些特殊的布局设计和现有视图的扩展 classes,但也许其中之一就是您正在寻找的。
- 在我看来,最漂亮的解决方案将基于此示例:http://swarmnyc.com/whiteboard/android-fragment-animations(布局不包含
FrameLayout
来替换片段,它包含<fragment>
标签;代码中可以使用简单的过渡动画;源码在文末) - 这里还有一个:http://trickyandroid.com/fragments-translate-animation/(可以看到原生
RelativeLayout
视图class的扩展,内置函数实现动画;源码也在文末提供主题)
此外(没有源代码)我可以建议您另外 2 种方法:
- 您搜索的动画可以通过使用完美实现
显示 UI 和
startActivity(intent)
之后 activity 内的overridePendingTransition()
方法。但是,如果 如果你真的想使用片段,也许你会跳过这个。 - 最后(也是我认为最简单的)解决方案可能是通过添加新片段来重叠旧片段 片段而不是替换它。但是我认为这是最糟糕的 解决方案,因为可能存在内存使用问题(较旧 片段不会被删除,只是被更新的片段简单地淡化了。
我希望我能帮上忙...:)
如果片段出现在另一个片段下方是因为片段容器不是好的容器类型
你需要将fragment放在FrameLayout或RelativeLayout中,如果你想测试你可以将你的fragment布局代码粘贴到fragment容器的底部进行预览