3

我试图使共享元素过渡工作与回收器视图内的元素。当用户点击我的回收商查看项目中的文本视图时,详细信息活动即会打开。在细节活动内部,我展示了一些信息,并且我也有一个选项卡布局,可以使用picasso从url加载一些图像。过渡到细节活动正在工作,但如果用户在加载所有图像之前返回到主活动,主活动中的回收站视图将在逆向动画之后消失!当我禁用共享元素转换时,问题消失了。与RecyclerView项目共享元素过渡 - Android

这两项活动都适用于碎片。所以,我试图在两个片段之间创建一个转换,这些片段处于不同的活动中。

在RecyclerViewAdapter,我设定的转换名:

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

onClickListener我的TextView的(在主要活动的片段内):

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

详细活动的片段具有共享内元素(在onCreateView中):

profileImage.setTransitionName("profile"+position); 

我已经检查了trans当意图发生时两个活动中的ition名称相同。

我被困在这个问题两天,看不见发生了什么事情。如果您需要更多信息或代码,只需询问。

谢谢!

+0

我不知道,如果该事项,但两个活动(主要和详细信息)的片段,这样的意图,详细活动从主要活动的片段和setTransitionName称为( )的第二个活动在其片段的onCreateView()内调用。 –

+0

当然你会有这个问题。毕加索是在BackGround上的一个异步调用,如果它没有完成任务,那么你移动到另一个Activity,这是你的MainActivity。来自毕加索的异步电话将被暂停。 @G_comp。我不认为他正在使用碎片,因为你设置了碎片交易的过渡。 – Aizen

+0

@Aizen,但问题发生在共享元素转换启用时,所以我不认为这是毕加索的错误。当我禁用共享元素转换时,我可以在加载图像之前返回主活动 –

回答

5

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

如果共享元素依赖于异步加载数据通过AsyncTask,AsyncQueryHandler,Loader或类似的东西,然后可以确定它们在被调用活动中的最终外观,那么框架可能会在数据交付之前开始转换回到主线程。
所以,soluation如下:

  1. 通话postponeEnterTransition()你叫活动的onCreate()方法。
  2. 如果您确定所有共享元素都已正确定位并调整大小,请致电startPostponedEnterTransition()以恢复转换。你会发现一个常见的模式是在OnPreDrawListener中启动推迟的转换,这将在测量和布局共享元素之后调用。

您使用毕加索,因为我知道毕加索有一个加载图像时,将名为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);