片段转换时屏幕闪烁

8

这是按下返回按钮时记录的链接

在使用片段转换中的动画时,它运行得很好,但我会看到下一个屏幕的闪烁,这让我很烦恼。我已经搜索了2天,但没有进展。

我正在使用以下代码进行过渡:

public void moveToBaseSelect() {
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.setCustomAnimations(R.anim.enter_from_right,R.anim.exit_to_left,R.anim.enter_from_left,R.anim.exit_to_right);
    ft.replace(R.id.home_frame, new BaseSelectFragment(), HomeActivity.BASE_SELECT);
    ft.addToBackStack(HomeActivity.BASE_SELECT);
    ft.commit();

}

public void moveToLogin()
{
    if(fragmentManager.getBackStackEntryCount()>=1 && fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-1).getName().equals(HomeActivity.LOGIN))
        return;

    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.setCustomAnimations(R.anim.enter_from_right,R.anim.exit_to_left,R.anim.enter_from_left,R.anim.exit_to_right);
    ft.replace(R.id.home_frame, new LoginFragment(), HomeActivity.LOGIN);
    ft.addToBackStack(HomeActivity.LOGIN);
    ft.commit();
}

动画文件

从左侧进入

<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="-100%p"
        android:toXDelta="0%p" />
</set>
</set>

从右侧进入

<?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="100%p"
        android:toXDelta="0%p" />
</set>
</set>

向左退出

<?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />
</set>
</set>

退出向右

 <?xml version="1.0" encoding="utf-8"?>
<set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXDelta="0%p"
        android:toXDelta="100%p" />
</set>
</set>

我已经尝试了一种替代方法,使用动画师(animator)而不是anim以及使用app.fragment而不是v4.fragment

但是我非常好奇,如果我坚持使用anim方法,是否有任何解决方案?


代码看起来没问题。在切换Fragment时,你是否有做任何会阻塞主线程的工作? - Chintan Soni
我只是在按钮点击时调用上述函数。 - Milind Chaudhary
不考虑更大的背景,很难判断。 - Martin Marconcini
3
我已将支持库从27.0.2升级到27.1.0,看到了类似的情况。 - darnmason
2
@darnmason 这里也是完全一样的情况,我回到了27.0.2版本,闪烁问题解决了。这个解决方法:https://dev59.com/26nka4cB1Zd3GeqPRaaK#49316479 对我起了作用,不需要回退到27.0.2版本。 - mjp66
显示剩余4条评论
2个回答

9

移除你动画文件中的<set>元素。当我移除它们后,这个问题就消失了。

我的一个动画xml:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromXDelta="0%"
    android:toXDelta="-100%" />


这应该是被接受的答案。移除该集合将会消除闪烁。谢谢! - JoM
仍然闪烁,我已经更改了动画文件但还是不起作用。 - Dhaval Solanki

2
问题是由于commit()是异步的,可能会导致一些竞争条件引起闪烁。通过让事务管理器执行commitNow()而不是commit()来解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接