【问题标题】:Screen flicker while fragment transition片段过渡时屏幕闪烁
【发布时间】:2017-03-01 09:27:03
【问题描述】:

Here is the link to recording while pressing back button

当我在片段事务中使用动画时,它工作正常,但我得到了下一个屏幕的闪烁,这让我很烦。找了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

但我非常想知道如果我坚持使用动画方法有什么解决方案

【问题讨论】:

  • 代码看起来没问题。在切换 Fragment 时,您是否正在做任何会阻塞主线程的工作?
  • 你能分享你调用这些函数的代码吗?我想看看流量。还要提及是否在所有转换(如前进和后退)上都发生闪烁?
  • 我只是在点击按钮时调用上述函数
  • 我从 27.0.2 -> 27.1.0 更新了支持库,我看到了类似的东西
  • @darnmason 在这里完全相同,我恢复到 27.0.2 并且闪烁消失了。此解决方法:stackoverflow.com/questions/49180295/… 为我修复了它,而无需返回 27.0.2。

标签: android animation fragment android-transitions


【解决方案1】:

删除动画文件中的 元素。我刚遇到这个问题,当我删除它们时它就消失了。

我的动画 xml:

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

【讨论】:

  • 这应该是公认的答案。删除设置将删除闪烁。谢谢!
【解决方案2】:

问题是因为 commit() 是异步的,并且可能是某些竞争条件导致闪烁。通过让事务管理器执行 commitNow() 而不是 commit() 解决

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多