【问题标题】:Fragment transition with shared imageview. Wrong animation共享图像视图的片段过渡。错误的动画
【发布时间】:2015-08-17 09:55:17
【问题描述】:

我有 MainActivity,它显示了两个带有共享图像的片段。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ActivityCompat.postponeEnterTransition(this);
    if (savedInstanceState == null) {
        Fragment firstFragment = new FirstFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.frame, firstFragment);
        transaction.commit();
    }
}

public void showPhoto(View sharedView, String sharedName) {
    Fragment listFragment = getSupportFragmentManager().findFragmentById(R.id.frame);
    Fragment detailFragment = new SecondFragment();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        listFragment.setSharedElementReturnTransition(new ChangeImageTransform());
        listFragment.setExitTransition(TransitionInflater.from(this)
                .inflateTransition(android.R.transition.explode));
        detailFragment.setSharedElementEnterTransition(new ChangeImageTransform());

        detailFragment.setEnterTransition(TransitionInflater.from(this)
                .inflateTransition(android.R.transition.explode));
    }
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.addSharedElement(sharedView, sharedName);
    transaction.replace(R.id.frame, detailFragment);
    transaction.addToBackStack("viewer");
    transaction.commit();
}
}

第一个片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_first, container, false);
    final ImageView image = (ImageView) view.findViewById(R.id.image_small);
    image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((MainActivity) getActivity()).showPhoto(image, "name");
        }
    });
    ViewCompat.setTransitionName(image, "name");
    return view;
}

拳头片段布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

<ImageView
    android:transitionName="name"
    android:id="@+id/image_small"
    android:layout_width="200dp"
    android:scaleType="centerCrop"
    android:layout_height="200dp"
    android:layout_centerInParent="true"
    android:src="@drawable/image"/>

</RelativeLayout>

第二个片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_second, container, false);
    ImageView image = (ImageView) view.findViewById(R.id.image_big);
    ViewCompat.setTransitionName(image, "name");
    return view;
}

第二个片段布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

<ImageView
    android:id="@+id/image_big"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/image"
    android:transitionName="name"/>

 </FrameLayout>

我还有下一个动画: https://youtu.be/pRYHC59sSL8

但我想制作这样的动画: https://developer.android.com/design/material/videos/ContactsAnim.webm

我做错了什么?

Android 5.0 手机。

【问题讨论】:

    标签: android android-fragments android-transitions


    【解决方案1】:
    public void showPhoto(View sharedView, String sharedName) {
       Fragment listFragment = getSupportFragmentManager().findFragmentById(R.id.frame);
       Fragment detailFragment = new SecondFragment();
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             listFragment.setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform));
             listFragment.setExitTransition(TransitionInflater.from(this)
                .inflateTransition(android.R.transition.explode));
             detailFragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform));
    
             detailFragment.setEnterTransition(TransitionInflater.from(this)
                .inflateTransition(android.R.transition.explode));
    }
    
       FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
       transaction.addSharedElement(sharedView, sharedName);
       transaction.replace(R.id.frame, detailFragment);
       transaction.addToBackStack("viewer");
       transaction.commit();
    

    }

    【讨论】:

    • sharedView 是第一个片段的共享元素。我应该如何处理 mProductImage?
    • 我尝试将 new ChangeImageTransform() 替换为从资源中膨胀它。但效果是一样的。
    • mProductImage 表示您要在两个 Fragment 之间共享的 ImagView。
    • 在我的例子中,它命名为sharedView。我从第一个片段传递它:((MainActivity) getActivity()).showPhoto(image, "name");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多