Android 共享元素转换-片段

Android 共享元素转换-片段,android,android-fragments,android-transitions,shared-element-transition,fragment-transitions,Android,Android Fragments,Android Transitions,Shared Element Transition,Fragment Transitions,我已将我的示例应用推到此处: 我在我的应用程序中遵循主细节模式。主片段(MyRecyclerFragment/MyListFragment)显示文本视图列表。当用户单击这些文本视图中的任何一个时,将启动详细信息片段(MyDetailsFragment)。详细信息片段的标题(与用户单击的标题相同) 我正在努力实现以下过渡效果: 分解现有视图的过渡 用于显示视图的淡入淡出过渡 这两个片段之间共享的TextView的移动/转换转换 问题: 转换开始时,共享文本视图将消失。但是,如果单击列表的第一

我已将我的示例应用推到此处:

我在我的应用程序中遵循主细节模式。主片段(
MyRecyclerFragment
/
MyListFragment
)显示文本视图列表。当用户单击这些文本视图中的任何一个时,将启动详细信息片段(
MyDetailsFragment
)。详细信息片段的标题(与用户单击的标题相同)

我正在努力实现以下过渡效果:

  • 分解现有视图的过渡
  • 用于显示视图的淡入淡出过渡
  • 这两个片段之间共享的TextView的移动/转换转换
问题:

  • 转换开始时,共享文本视图将消失。但是,如果单击列表的第一项,共享转换将奇迹般地工作
  • 如果详细信息布局发生更改,转换将起作用。请参见
    details.xml
    。如果我完全删除FrameLayout
    title\u栏
    ,并将TextView
    title
    作为根LinearLayout的直接子级,共享元素转换将非常有效
  • 似乎epicentre因共享元素返回转换而改变。例如,如果我单击列表中的第7个TextView,则exit transition(explode)将该TextView作为震中。它上面的所有文本视图向上滑动,下面的文本视图向下滑动。但是,当从细节片段返回到主片段时,返回转换的中心不是单击的TextView
      试试这个-

      使用不同的转换名称设置每行图像-

       @Override
          public View getView(int position, View convertView, ViewGroup parent) {
      
              View view = convertView;
      
              if (view == null) {
                  view = LayoutInflater.from(getContext()).inflate(R.layout.list_item, null);
              }
      
              TextView textView = (TextView) view.findViewById(R.id.textView);
      
              ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
      
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                  textView.setTransitionName("transtext" + position);
                  imageView.setTransitionName("transition" + position);
              }
      
              return view;
          }
      }
      
      然后单击项目,例如-

       ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
                  TextView textView = (TextView) view.findViewById(R.id.smallerImageView);
      
                  EndFragment endFragment = new EndFragment();
      
                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      
                      imageTransitionName = imageView.getTransitionName();
                      textTransitionName = textView.getTransitionName();
      
      
      
       setSharedElementReturnTransition(TransitionInflater.from(
                              getActivity()).inflateTransition(R.transition.change_image_trans));
      
      
        setExitTransition(TransitionInflater.from(
                          getActivity()).inflateTransition(android.R.transition.fade));
      
                  endFragment.setSharedElementEnterTransition(TransitionInflater.from(
                          getActivity()).inflateTransition(R.transition.change_image_trans));
                  endFragment.setEnterTransition(TransitionInflater.from(
                          getActivity()).inflateTransition(android.R.transition.fade));
      
                  }
      
       Bundle bundle = new Bundle();
      
              FragmentManager fragmentManager = getFragmentManager();
      
                  bundle.putString("TRANS_NAME", imageTransitionName);
                  bundle.putString("TRANS_TEXT", textTransitionName);
                  endFragment.setArguments(bundle);
      
                  fragmentManager.beginTransaction()
                          .replace(R.id.container, endFragment)
                          .addToBackStack("Payment")
                          .addSharedElement(imageView, imageTransitionName)
                          .addSharedElement(textView, textTransitionName)
                          .addSharedElement(staticImage, getString(R.string.fragment_image_trans))
                          .commit();
      
      在oncreate方法的EndFragment中,获取转换名称的键并在视图上设置-

       public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                   Bundle savedInstanceState) {
              Bundle bundle = getArguments();
              String actionTitle = "";
              Bitmap imageBitmap = null;
              String transText = "";
              String transitionName = "";
      
              if (bundle != null) {
                  transitionName = bundle.getString("TRANS_NAME");
                  actionTitle = bundle.getString("ACTION");
                  imageBitmap = bundle.getParcelable("IMAGE");
                  transText = bundle.getString("TRANS_TEXT");
              }
      
              getActivity().setTitle(actionTitle);
              View view = inflater.inflate(R.layout.fragment_end, container, false);
      
              if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                  view.findViewById(R.id.listImage).setTransitionName(transitionName);
                  view.findViewById(R.id.smallerImageView).setTransitionName(transText);
              }
      
              ((ImageView) view.findViewById(R.id.listImage)).setImageBitmap(imageBitmap);
              ((TextView) view.findViewById(R.id.smallerImageView)).setText(actionTitle);
      
              return view;
          }
      
      相关的

      如果你有答案,请投票支持我的答案。:)

      • 转换开始时,共享文本视图将消失。但是,如果单击列表的第一项,共享转换将奇迹般地工作
      • 如果详细信息布局发生更改,转换将起作用。请参阅details.xml。如果我完全删除FrameLayout title_栏,并将TextView title作为根LinearLayout的直接子级,那么共享元素转换将非常有效
      细节文本视图似乎不能在其父边界之外设置动画。尝试将details.xml中TextView的所有父视图的clipChildren设置为false,如下所示。这对我有用

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:clipChildren="false"
                    android:orientation="vertical">
      
          <FrameLayout
              android:id="@+id/title_bar"
              android:layout_width="match_parent"
              android:layout_height="40dp"
              android:clipChildren="false">
      
              <TextView
                  android:id="@+id/title"
                  android:layout_width="match_parent"
                  android:layout_height="40dp"
                  android:background="@android:color/white"
                  android:gravity="center"
                  android:text="@string/dummy_title"
                  android:textColor="@android:color/black"/>
          </FrameLayout>
          ...
      </LinearLayout>
      
      
      ...
      
      如果这两个问题相同,则应将其作为重复问题关闭。如果不是,那么您应该在此处提供完整答案,而不是仅提供链接答案。