android - 方向改变后过渡闪烁

标签 android animation android-animation android-transitions shared-element-transition

更新

我用 Google 打开了一个错误 https://issuetracker.google.com/issues/63663775

我正在尝试在我当前的 Android 应用程序中使用 makeSceneTransitionAnimation

我有一个 Source Activity,它包含一个 Fragment,在 Fragment 中有一个 RecyclerView

当我点击 RecyclerView 中的图像时,我会转换到我的 Target Activity,它包含一个 Fragment,该 Fragment 使用可接受的动画正确显示图像。

按下后退按钮可以正确反转动画。

以上在纵向和横向方向上都可以正常工作。

当我在查看目标 Fragment 时改变方向然后按返回按钮时,会出现闪烁问题。

还有其他问题,例如图像没有直接返回到其原始位置,并且在旧设备上我看到水平线,就像来自调谐不佳的模拟电视的干扰。

闪烁非常糟糕,设备屏幕完全变黑大约 500 毫秒。

我已经下载并部署了 google 示例共享元素转换应用程序,它似乎具有相同的“功能”。

我尝试了多种解决方案,但都没有奏效,例如 this .

Here's一个显示问题的。

已添加 LOGCAT

07-21 12:57:18.097 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=30KB, data=21KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=30KB, data=23KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 128KB
07-21 12:57:20.540 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/home/search-1/?company_name=Happy http/1.1
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 256KB
07-21 12:57:21.084 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/home/search-1/?company_name=Happy (543ms, unknown-length body)
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=124KB, data=93KB
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=98KB, data=59KB
07-21 12:57:22.377 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 512KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile boolean org.jsoup.parser.HtmlTreeBuilderState$7.process(org.jsoup.parser.Token, org.jsoup.parser.HtmlTreeBuilder)
07-21 12:57:22.701 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=245KB, data=178KB
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=216KB, data=130KB
07-21 12:57:25.040 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/companies/happy-print-printing-house/34896 http/1.1
07-21 12:57:25.101 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=true
07-21 12:57:25.437 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/companies/happy-print-printing-house/34896 (396ms, unknown-length body)
07-21 12:57:26.111 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:26.123 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=251KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=249KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 1024KB
07-21 12:57:26.173 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:26.177 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:26.186 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:26.226 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:26.232 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:26.238 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:26.244 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:26.265 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 8MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:26.437 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:26.579 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 6MB to compile void android.view.ViewRootImpl.performTraversals()
07-21 12:57:27.754 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:27.761 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:27.765 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:27.772 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:27.784 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:27.788 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:27.792 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:27.796 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:29.889 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.117 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.756 1962-1962/com.incentive.yellowpages W/AutofillManager: Session 409360048 could not be restored
07-21 12:57:30.922 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=498KB, data=362KB
07-21 12:57:30.923 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=445KB, data=262KB

最佳答案

问题在于:您以纵向模式启动 Activity2,然后以横向模式返回到 Activity1。但是因为您执行了方向更改,Activity1 的 View 层次结构被销毁并创建,因此不再有最初开始转换的View

您可以做的是使用 Activity#setExitSharedElementCallback() 将 View 从旧 View 重新映射到新 View 应用程序接口(interface)。不过,要处理这种情况还有一些工作要做,我已经在我的 this 中逐步描述了这一点。回答。

您最好的选择是结帐 Alex Lockwoodapp at github有了您需要的功能,您会更容易理解如何处理这种情况。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setExitSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {

            if (we are coming back to Activity1) {
                View newSharedElement = findViewById(R.id.your_imageview);
                if (newSharedElement != null) {
                    names.clear();
                    names.add("transition name");
                    sharedElements.clear();
                    sharedElements.put("transition name", newSharedElement);
                }
            } else {
                // we are leaving Activity1
            }
        }
    });
}

基本上,您正在清除 map 并添加新的“转换名称- View ”对 给它。您可以看到 if (we are coming back to Activity1) 检查是如何完成的 here .


这是在 one of my apps 中实现的功能.

enter image description here

关于android - 方向改变后过渡闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44908605/

相关文章:

安卓属性动画

android - 扩大recyclerview项目

java - 如何在mpandroidchart中实时显示图表?

javascript - WebView无法调用JavaScript函数

Android 以指定帐户的 Intent 打开谷歌驱动器

javascript - 如何在 JavaScript 中暂停我的动画

android - 如何制作美丽时尚的应用程序,如 Timely

java - Android Studio中如何保存按钮的状态?

javascript - Jquery - 推迟回调直到多个动画完成

javascript - HTML5 Canvas,无法同时运行多个动画