方向变化后的过渡闪烁

8

更新

我已经向Google提交了一个错误报告:https://issuetracker.google.com/issues/63663775

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

我有一个源Activity,其中包含一个Fragment,在该Fragment中有一个RecyclerView

当我单击RecyclerView中的图像时,我会转换到我的目标Activity,该活动包含一个Fragment,该Fragment以可接受的动画正确显示图像。

按下返回按钮会正确地反转动画。

上述内容在纵向和横向方向均正常工作。

当我在查看目标Fragment时更改方向,然后按下Back按钮时,就会出现闪烁问题。

还存在其他问题,例如图像不会直接返回到其原始位置,在旧设备上,我看到像是来自调整不良的模拟电视机的干扰水平线。

最糟糕的是闪烁问题,设备屏幕完全黑屏约500毫秒。

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

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

这里是一个展示问题的视频。

已添加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

也许在这里:https://github.com/saulmm/Android-Material-Examples - RonTLV
1
你能发布一个展示这个行为的视频吗? - azizbekian
@Hector,该项目已经不再维护。我刚刚检查了一下,发现无法构建。我升级了一些插件并推送了更改。现在可以在Android O上构建和运行。 - azizbekian
@azizbekian 我刚刚将你的黄页应用构建并部署到我的O设备(PIXEL XL)上,它具有如此展示的闪烁功能 https://youtu.be/tGA_DGx6lbU - Hector
1
@Hector,哇,那真的很有趣。不幸的是,我没有一台带有O系统的设备,模拟器非常不响应,会无缘无故地卡住和重新加载。logcat里有什么信息吗? - azizbekian
显示剩余6条评论
3个回答

5
这里的问题是:您在纵向模式下启动了Activity2,并在横向模式下返回到Activity1。但由于您进行了方向更改,Activity1的视图层次结构被销毁并创建,因此不再有最初开始转换的View
您可以通过使用Activity#setExitSharedElementCallback() API将视图从旧视图重新映射到新视图。但是,要处理这种情况需要做一些工作,我已经在我的答案中逐步描述了如何处理。
对您来说最好的选择是查看Alex Lockwoodgithub上的应用,其中包含您需要的功能,这样您就可以更容易地了解如何处理这种情况。
@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
            }
        }
    });
}

基本上,您正在清除地图并向其中添加新的“转换名称-视图”对。您可以在此处查看如何完成“如果我们返回到Activity1”的检查(此处)
这是一个功能,在我的某个应用程序中实现。

enter image description here


1
这个视频展示了Alex的应用在屏幕方向改变时出现了完全相同的问题。 - Hector
我很感激你在示例应用程序上所付出的努力。虽然没有闪烁,但是你所采取的方法对于我的特定应用程序是不可接受的。当返回到纵向方向时,保持横向UI的做法会显示出大量空白屏幕。 - Hector
正如@Hector所说,AlexLockwood的示例应用程序存在闪烁问题。我在Nexus 5X上看到了它,但在三星Galaxy Note 5上没有看到。我建议你在Nexus上测试你的应用程序。这可能不是Nexus 5X的错误,因为Google相册应用程序在5X上没有受影响,所以有一种方法可以使其工作,在某个地方隐藏着... - Tim Autin

2
我认为问题出在ImageView的layoutbounds上,场景过渡计算起始和结束位置之间的差异,然后动画化差异,但是这里由于方向改变而改变了结束位置,你能否尝试在方向改变时按下返回键重新创建结束布局,也许我错了,但只能想到这种情况,你能提供相同的代码吗?(这个评论太长了,所以必须作为答案添加。)

1

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