正如您在下面的视频中所看到的,当分割屏幕上的活动位于右侧时,共享元素之间转换的开始和结束被奇怪地抵消。
查看高分辨率视频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(在主题中设置)
所有这一切都很奇怪。
如果有人想出奇异的叠加偏移的答案,我期待听到它。