两个recyclerViews之间的makeSceneTransitionAnimation只能反向工作

时间:2015-08-30 18:04:28

标签: android android-animation

简而言之:

使用另一个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());
}

1 个答案:

答案 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;
                    }
                });
    }