Android on Chrome问题:MutliWindowMode + Overlay问题导致SharedElements偏移

时间:2017-12-16 15:57:05

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

正如您在下面的视频中所看到的,当分割屏幕上的活动位于右侧时,共享元素之间转换的开始和结束被奇怪地抵消。

gif

查看高分辨率视频here

如果全屏或活动锚定在左侧,转换工作正常。

以前有没有人经历过这个?

片段A和活动B之间发生了转换。 Fragment RecyclerAdapter的clickListener如下所示。

@Override
protected void onBindViewHolder(final ChartViewHolder viewHolder, int position, final Chart chart) {
    viewHolder.setChart(chart);
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            clickListener.onChartClicked(chart, viewHolder);
        }
    });
}

FYI。我也尝试将位置传递给onChartClicked并直接从片段A中的recycleradapter获取sharedelement,但这也没有用。

片段A.onchartClicked在下面。

@Override
public void onChartClicked(Chart chart, MyChartRecyclerAdapter.ChartViewHolder viewHolder) {


    mClickedChart = viewHolder;

    Intent intent = new Intent(getActivity(), ChartDetailsActivity.class);
    intent.putExtra(PhysioHelper.ARG_DB_REF, "orgs/" + mOrgKey + "/clients/" + mClientKey + "/charts/" + chart.getUid());
    intent.putExtra(PhysioHelper.ARG_CLIENT_NAME, mClientName);
    intent.putExtra(PhysioHelper.ARG_CLIENT_KEY, mClientKey);

    View decor = getActivity().getWindow().getDecorView();
    View statusBar = decor.findViewById(android.R.id.statusBarBackground);
    View navBar = decor.findViewById(android.R.id.navigationBarBackground);

    List<Pair<View, String>> pairs = new ArrayList<>();
    pairs.add(Pair.create((View) viewHolder.chartlistcard, viewHolder.chartlistcard.getTransitionName()));

    pairs.add(Pair.create((View) getActivity().findViewById(R.id.toolbar), getActivity().findViewById(R.id.toolbar).getTransitionName()));

    if (statusBar != null)
        pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
    if (navBar != null)
        pairs.add(Pair.create(navBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));


    Bundle options = makeSceneTransitionAnimation(getActivity(),
            pairs.toArray(new Pair[pairs.size()])).toBundle();
    startActivity(intent, options);

}

似乎makeSceneTransitionAnimation错误地偏移了所有共享元素(包括工具栏),只是精确地加倍了左侧Activity的宽度。 FWIW。当应用程序调整大小并且应用程序未锚定在左上角(0,0)时,在Chromebook上运行时存在同样的问题。 当锚定在左上角时,一切都很棒。 当未锚定在左上角时,共享元素的x和y坐标似乎偏移了活动距离0,0的距离的两倍。

任何想法都会非常感激。 感谢

更新:setSharedElementsUseOverlay(false)&#39;修复&#39;偏移问题,但引入了其他转换问题,因此它绝对不是解决方案。

我对叠加层不是很熟悉。当活动是屏幕右侧的MultiWindowMode时,为什么Overlay处于错误的位置? (提醒,活动在左侧没有问题)

由于我已经挣扎太久了,我决定在活动不全屏时避免过渡。

我尝试过的事情包括: - 删除约束布局 -ActivityOptions.setLaunchBounds - 将所有布局设置为fitsSystemWindow = true - 在Framelayouts中包装共享元素

更新#2 根据我到目前为止所学到的知识,Chrome上的Android应用需要ActivityOptions选项= ActivityOptions.makeSceneTransitionAnimation(getActivity(),null); (或用共享元素对替换null)以使任何交叉活动转换起作用。

通过交叉活动转换,我的意思是在活动主题(v21 \ styles)中设置的任何窗口进入/退出/重新输入/返回转换。

但还有更多问题。 如果活动A处于活动状态(包含父/细节片段的主要活动)并且窗口调整大小发生,以便活动A启动活动B(包含详细信息片段),则活动A仍然明显位于活动B ...但接收到的触摸活动B !! 基本上,活动B的输入转换不会发生!!

要解决此问题,我强制检测活动A中的调整大小,将该知识传递给活动B,然后强制活动B不使用任何输入转换。

    if (useEnterTransition == false)
        getWindow().setEnterTransition(null);

fyi,默认在活动B上输入转换是@android:transition / slide_right(在主题中设置)

所有这一切都很奇怪。

如果有人想出奇异的叠加偏移的答案,我期待听到它。

0 个答案:

没有答案