gpt4 book ai didi

android - 在正在进行的 FragmentTransaction 期间更改 Fragments 的 z 顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:04 26 4
gpt4 key购买 nike

有没有办法更改正在进行的 FragmentTransaction 中 fragment 显示的 z 顺序?我有一个动画,其中两个 fragment 相互重叠,我希望从右侧滑动的 fragment (第二个 fragment )显示在另一个向左滑动的 fragment 下方。现在它们在交易期间以相反的顺序显示。

这是我的一个动画的代码:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="400"
android:zAdjustment="bottom">
<scale android:toXScale="1"
android:fromXScale="0.9"
android:pivotX="50%p"
android:pivotY="50%p"
android:toYScale="1"
android:startOffset="300"
android:fromYScale="0.9"/>
<translate android:fromXDelta="50%p"
android:interpolator="@android:interpolator/overshoot"
android:toXDelta="0"/>

</set>

这是交易代码

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.show(fragmentToShow).hide(fragmentToHide).commit();

我想让 fragmentToHide 出现在 fragmentToShow 下。我曾尝试使用 android:zAdjustment 属性来解决这个问题,但由于它显然只适用于窗口动画,所以它对我不起作用。

最佳答案

我也遇到了这个问题,我能找到的唯一解决方法是将另一个 FrameLayout 直接放在包含当前 fragment 的框架下方。然后,我将我的新 fragment 转换为备用 FrameLayout(其 z 顺序高于其下方的 FrameLayout)并在同一事务中从原始 FrameLayout 中删除旧 fragment 。像这样:

<FrameLayout
android:id="@+id/video_list_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>

<FrameLayout
android:id="@+id/video_player_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>

是的,我知道这会在层次结构中添加一个额外的 View ,但不会增加树的深度。为了进一步提升性能,我重写了 fragment 中的 onCreateAnimator 以将动画卸载到硬件层,如下所示:

@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
Animator animation = super.onCreateAnimator(transit, enter, nextAnim);

// HW layer support only exists on API 11+
if (Build.VERSION.SDK_INT >= 11) {
if (animation == null && nextAnim != 0) {
animation = AnimatorInflater.loadAnimator(getActivity(), nextAnim);
}

if (animation != null) {
animation.addListener(new LayerEnablingAnimatorListener(getView()));
}
}

return animation;
}

这是 LayerEnablingAnimatorListener:

public class LayerEnablingAnimatorListener extends AnimatorListenerAdapter {

private final View mTargetView;
private int mLayerType;

public LayerEnablingAnimatorListener(View targetView) {
mTargetView = Objects.requireNonNull(targetView, "Target view cannot be null");
}

public View getTargetView() {
return mTargetView;
}

@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
mLayerType = mTargetView.getLayerType();
mTargetView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}

@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mTargetView.setLayerType(mLayerType, null);
}
}

关于android - 在正在进行的 FragmentTransaction 期间更改 Fragments 的 z 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com