gpt4 book ai didi

android - 使用 RecyclerView 项目的共享元素转换 - Android

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:58 25 4
gpt4 key购买 nike

我正在尝试使共享元素转换与回收器 View 中的元素一起使用。当用户单击我的回收器 View 项目中的 TextView 时,详细信息 Activity 将打开。在 Detail Activity 中,我显示了一些信息,我还有一个选项卡布局,可以使用 picasso 从 url 加载一些图像。到 Detail Activity 的转换是有效的,但是如果用户在加载所有图像之前返回到 Main Activity,则 Main Activity 中的回收器 View 在反向动画后消失!当我禁用共享元素转换时,问题就消失了。

这两个 Activity 都使用 fragment 。因此,我正在尝试在不同 Activity 中的两个 fragment 之间创建过渡。

在 RecyclerViewAdapter 中,我设置了转换名称:

public void onBindViewHolder(final ViewHolder viewHolder, int position) {
...
viewHolder.profileImage.setTransitionName("profile"+position);

我的 TextView 的 onClickListener(在主 Activity 的 fragment 内):

Intent i = new Intent(getCurrentActivity(), DetailActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(getCurrentActivity(), (View) profileImage, "profile"+position);
getCurrentActivity().startActivity(i, options.toBundle());

在具有共享元素的详细 Activity fragment 内(在 onCreateView 中):

profileImage.setTransitionName("profile"+position);

当 Intent 发生时我已经检查了两个 Activity 中的转换名称并且它是相同的。

我在这个问题上卡了两天,看不出发生了什么。如果您需要有关它的更多信息或代码,请询问。

谢谢!

最佳答案

问题是共享元素转换是在 Activity 生命周期的早期由框架启动的。转换必须捕获其目标 View 的开始和结束状态,以便构建正常运行的动画。因此,如果框架在其共享元素在被调用的 Activity 中获得最终大小、位置和大小之前启动共享元素转换,则转换将为其共享元素捕获不正确的结束值,并且生成的动画将完全失败。

如果共享元素依赖于由 AsyncTask、AsyncQueryHandler、Loader 或类似的东西异步加载的数据,然后才能确定它们在被调用 Activity 中的最终外观,则框架可能会在该数据之前开始转换被传递回主线程。
所以,解决方案如下:

  1. 在您调用的 Activity 的 onCreate() 方法中调用 postponeEnterTransition()
  2. 当您确定所有共享元素都已正确定位和调整大小时,调用 startPostponedEnterTransition() 以恢复过渡。您会发现一个有用的常见模式是在 OnPreDrawListener 中启动延迟过渡,它将在共享元素被测量和布局后调用。

您使用 Picasso ,因为我知道 Picasso 在加载图像时有一个名为 RequestCreator 的回调。
例如:

private final Callback callBack = new Callback() {
@Override
public void onSuccess() {
imageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
imageView.getViewTreeObserver().removeOnPreDrawListener(this);
MainActivity.this.startPostponedEnterTransition();
return true;
}
});
}

@Override
public void onError() {

}
};

RequestCreator requestCreator = Picasso.with(this).load(imageUrl);
requestCreator.into(imageView, callback);

关于android - 使用 RecyclerView 项目的共享元素转换 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35963234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com