我有些绝望需要帮助,所以请抓住你的帽子,因为我们走了:
我有两项活动需要在两者之间进行转换。每个活动都包含一个ViewPager,每个ViewPager都有一个PagerAdapter,负责创建我可以在其间切换的片段。
在活动中 A 我有一个包含一个大图像的片段。在活动中 B 我有一个包含RecyclerGridView的片段,其中包含一个网格ImageView的' S
所以我希望归档的过渡:
活动 A - > PagerAdapter - >片段 - > ImageView
活动 b - > PagerAdapter - >片段 - > RecyclerView - > ImageView的
我知道我必须使用postponeEnterTransition();
和startPostponedEnterTransition();
,但我无法确定何时致电startPostponedEnterTransition();
以确保时机正确。
活动 A 我在哪里开始活动 B
Intent intent = new Intent(this, PagesOverviewActivity.class);
if (Build.VERSION_CODES.LOLLIPOP <= Build.VERSION.SDK_INT) {
final PageRecyclingImageView pageRecyclingImageView = ((PageDetailFragment) mAdapter.getFragment(mPager.getCurrentItem())).getPageRecyclingImageView();
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(PageActivity.this, pageRecyclingImageView, "page_number_" + getCurrentPageNumber());
startActivity(intent, options.toBundle());
}
活动中的OnCreate B 我调用postponeTransition并创建名为 PagesOverviewFragmentAdapter 的PagerAdapter
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
postponeEnterTransition();
...
mFragmentAdapter = new PagesOverviewFragmentAdapter(getSupportFragmentManager(), sections, getApplicationContext());
mViewPager.setAdapter(mFragmentAdapter);
在我的PagesOverviewFragmentAdapter.getItem()
我创建了包含RecyclerView的片段
public class PagesOverviewFragmentAdapter extends FragmentPagerAdapter {
@Override
public Fragment getItem(int position) {
PagesOverviewFragment fragment = PagesOverviewFragment.newInstance();
return fragment;
}
在 PagesOverviewFragment 中,我为我的RecyclerView创建适配器 PagesOverviewAdapter
public class PagesOverviewFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.pages_overview_fragment_layout, container, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.pages_overview_recycler_view);
mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
mAdapter = new PagesOverviewAdapter(mSection, getActivity());
mRecyclerView.setAdapter(mAdapter);
return view;
最后在 PagesOverviewAdapter 内部,我创建了ImageView,当我点击想要制作动画的imageView时,我想转换到并调用startPostponedEnterTransition
。
@Override
public void onBindViewHolder(final PagesOverviewViewHolder holder, int position) {
int leftPagePosition;
leftPagePosition = mSection.getFirstPage();
if (Build.VERSION_CODES.LOLLIPOP <= Build.VERSION.SDK_INT) {
holder.mLeftCardView.setTransitionName("page_number_" + leftPagePosition);
}
Glide.with(mContext).load(getLocalPathToFile(leftPagePosition)).placeholder(R.drawable.card_cover_placeholder).into(holder.mLeftCardView);
holder.mLeftCardView.setText(mContext.getString(R.string.page, leftPagePosition));
if (leftPagePosition == 4) { //Hardcode position 4 for test.
holder.mLeftCardView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mActivity.startPostponedEnterTransition();
holder.mLeftCardView.getViewTreeObserver().removeOnPreDrawListener(this);
return false;
}
});
}
}
现在应该完成文字墙!
以下是我的应用中的外观视频:
http://www.youtubeslow.com/watch?v=crdRjDTy43o
当我按下后退按钮时你可以看到转换工作,所以两个imageView都有正确的转换名称,但当我启动Activity B 时,imageView在我的RecyclerView中转到了错误的位置
如果有人知道如何解决这个问题,我会找到你并拥抱你!