我希望你能帮我解决这个问题。我有两个片段,第一个是带有几个图像的recyclerview,第二个片段是这个图像的详细视图。如果用户点击图像,应用程序会执行片段事务处理并显示详细信息。
我已经成功地在片段之间实现了共享元素转换,如果我点击第一个片段上的小图像,它会变大并移动到细节视图上的最终位置。
那么,问题就在于,图像的初始位置不是预期的,它开始从原来的位置移动几个像素,当我点击图像向右跳一点点时底部。
为什么会这样?它很烦人!
转换xml:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeTransform />
<changeBounds />
</transitionSet>
如果我对Recyclerview以外的按钮执行相同操作,则效果非常好。这是Recyclerview中的某种错误吗?
答案 0 :(得分:14)
您的RecyclerView项目需要在其共享视图上设置唯一的转换名称。如果您想象RecyclerView的渲染布局层次结构,其中将有许多具有相同转换名称的项目(视图)。这种方式不清楚转换,实际共享元素是什么。例如,您可以将位置附加到视图转换名称,例如transition1,transition2等。现在,当您启动详细信息片段时,必须将转换名称移交给它,并将此名称设置为详细信息片段中的共享视图,例如在onViewCreated()。
答案 1 :(得分:5)
如果未从回收站视图中拾取正确的视图,则可能会发生这种情况。确保使用精确视图(基于位置)而不是根视图。对于例如在下面的代码片段中,应使用View v(您在onClick()中收到的内容):
mAdapter.setOnItemClickListener(
new MyAdapter.OnItemClickListener() {
@Override
public void onClick(View v, int position) {
ImageView heroView;
heroView = (ImageView) v.findViewById(R.id.category_icon);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), heroView, heroView.getTransitionName());
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
答案 2 :(得分:2)
如果您的共享元素为ImageView
,那么您还需要使用ChangeImageTransform
转换。尝试将<changeImageTransform />
添加到转换集。
答案 3 :(得分:1)
我按照 Shared Element Transitions - Part 4: RecyclerView 这篇文章解决了这个问题,该文章显示了代码剪切并给出详细解释。
确保共享元素之间的
RecyclerView
必须是相同,并且还必须在视图层次结构中是唯一的至于
Fragment
到transitionName
,如果我们在XML中设置onBindViewHolder
,那么图库中的所有ImageView都会有相同的,这意味着当我们回到图库时框架不知道将图像移动到哪里。
由于项目位置是唯一的,因此最好使用此处的位置在xls_file = Roo::Excelx.new('test.xlsx')
CSV.open('test.csv') do |csv|
(2..xls_file.last_row).each do |i| # if you do not need header otherwise (1..xls_file.last_row)
csv << a.row(i)
end
end
中设置transitionName。
答案 4 :(得分:0)
对于其他遇到这些问题的人,我通过确保将相同的图像转换应用于两个共享元素来解决了该问题。就我而言,我没有对我的fragment2进行任何转换,而对我的fragment1进行了中央裁剪,从而导致了视觉错误。
答案 5 :(得分:0)
你可以删除style->theme中的item name="android:windowFullscreen"true。对我很有用。