简而言之:
使用另一个recylcerView创建具有recyclelerView onClick开放活动的片段之间的共享元素活动转换不会触发转换。
但是,使用supportFinishAfterTransition();
关闭已打开的活动会正确触发动画(它会向后移动到上一个活动)。
此外,在recyclelerView中创建共享元素 将使动画在每种情况下都正常工作(完成后向前和向后) - 因此我的代码必须正确。
使用OnClickListener打开活动的Viewholder - 简化以减少无用的代码。
public class StatsViewHolder extends WebStatsViewHolder implements View.OnClickListener{
protected TextView vTitle;
protected ImageView vPicture;
public StatsViewHolder (View itemView) {
super(itemView);
vTitle = (TextView) itemView.findViewById(R.id.stats_title);
vPicture = (ImageView) itemView.findViewById(R.id.stats_picture);
vTitle.setClickable(true);
vTitle.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(v, getLayoutPosition(), v.getRootView());
}
}
}
点击标题可打开新活动。 - 除非我将目标放在回收站
之外,否则动画不会触发mAdapter.SetOnItemClickListener(new MySteamWebStatsAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position, View parent) {
Intent intent = new Intent(getActivity(), Details.class);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(getActivity(), parent.findViewById(R.id.stats_picture), "stats_picture");
startActivity(intent, options.toBundle());
}
答案 0 :(得分:1)
原来我只是愚蠢,如果有人犯了同样的错误就把它留下来。
在目标recyclerView
中,我使用Picasso来加载drawable - Picasso加载图像所需的时间恰好是动画拍摄的时间,因此它并没有显示出来。这也是动画反向运作的原因 - 图像已经被缓存了。
如何解决问题:
等到图像加载 - 我在onCreate
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
postponeEnterTransition();
}
在加载图片时请求毕加索回电
Picasso.with(this).load(mapObject.getDrawable()).transform(new CircleTransform()).fit().centerCrop().into(detailPicture, new Callback() {
@Override
public void onSuccess() {
scheduleStartPostponedTransition(detailPicture);
}
@Override
public void onError() {
}
});
开始动画
private void scheduleStartPostponedTransition(final View sharedElement) {
sharedElement.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
});
}