共享元素转换 Android 不起作用
Shared Element Transition Android Doesn't Work
我试了一天,但我不知道问题出在哪里!我有一个包含两个片段的 activity,在第一个片段中我有一个 RecyclerView 包含一个图像视图,在另一个片段中我有另一个图像视图。
自定义视图层imageview:
<ImageView
android:id="@+id/clst_img_cover"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scaleType="centerCrop"
app:srcCompat="@drawable/no_image"
android:transitionName="@string/transition_name_cover"/>
片段两个图像视图:
<ImageView
android:id="@+id/img_movie_cover"
android:transitionName="@string/transition_name_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@color/colorWhite" />
在我的列表视图适配器中:
MovieDetailsFragment movieDetails = new
MovieDetailsFragment().newInstance(String.valueOf(model.getId()));
FragmentManager manager = ((MainActivity)v.getContext()).getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
String a = v.getContext().getResources().getString(R.string.transition_name_cover);
cover.setTransitionName(a);
movieDetails = new MovieDetailsFragment().newInstance(String.valueOf(model.getId()),((BitmapDrawable)cover.getDrawable()).getBitmap());
Transition changeTransform = TransitionInflater.from(context).inflateTransition(R.transition.default_transition);
changeTransform.setDuration(1500);
MovieList current = (MovieList) manager.findFragmentById(R.id.activity_main_container_body);
movieDetails.setSharedElementReturnTransition(new CustomTransition());
movieDetails.setSharedElementEnterTransition(new CustomTransition());
movieDetails.setEnterTransition(new Fade());
current.setExitTransition(new Fade());
String x = cover.getTransitionName();
transaction.addSharedElement(cover,a);
}
else{
transaction.setCustomAnimations(R.animator.fr_fade_in,R.animator.fr_slide_out_right,R.animator.fr_slide_in_right,R.animator.fr_fade_out);
}
transaction.replace(R.id.activity_main_container_body,movieDetails,"movieDetails");
transaction.addToBackStack(null);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.commit();
我的第二个片段有两个 newInstance 方法,如下所示:
public static MovieDetailsFragment newInstance(String Movie_ID) {
MovieDetailsFragment fragment = new MovieDetailsFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, Movie_ID);
fragment.setArguments(args);
return fragment;
}
public static MovieDetailsFragment newInstance(String Movie_ID,Bitmap bmp) {
MovieDetailsFragment fragment = new MovieDetailsFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, Movie_ID);
args.putParcelable(ARG_PARAM2, bmp);
fragment.setArguments(args);
return fragment;
}
这是 CustomTransition.java :
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class CustomTransition extends TransitionSet {
public CustomTransition(){
setOrdering(ORDERING_TOGETHER);
addTransition(new ChangeBounds()).addTransition(new ChangeTransform()).addTransition(new ChangeImageTransform());
}
}
它对淡入淡出起作用,但对图像不起作用!
更新
我建议在我的 git 存储库中使用 this example,这对初学者来说是一个很好的例子。
请通过this link and the link to his github is here。它可以回答您的所有问题。我也遵循了相同的 link。
我终于在一周后纠正了我的****错误。
最好使用 android.support.v4.app.Fragment
这就是它不起作用的原因
我混合在 android.support.v4.app.Fragment
和 android.app.Fragment
之间
我强烈推荐你使用this tutorial, specially download the git repository
我试了一天,但我不知道问题出在哪里!我有一个包含两个片段的 activity,在第一个片段中我有一个 RecyclerView 包含一个图像视图,在另一个片段中我有另一个图像视图。
自定义视图层imageview:
<ImageView
android:id="@+id/clst_img_cover"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scaleType="centerCrop"
app:srcCompat="@drawable/no_image"
android:transitionName="@string/transition_name_cover"/>
片段两个图像视图:
<ImageView
android:id="@+id/img_movie_cover"
android:transitionName="@string/transition_name_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@color/colorWhite" />
在我的列表视图适配器中:
MovieDetailsFragment movieDetails = new
MovieDetailsFragment().newInstance(String.valueOf(model.getId()));
FragmentManager manager = ((MainActivity)v.getContext()).getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
String a = v.getContext().getResources().getString(R.string.transition_name_cover);
cover.setTransitionName(a);
movieDetails = new MovieDetailsFragment().newInstance(String.valueOf(model.getId()),((BitmapDrawable)cover.getDrawable()).getBitmap());
Transition changeTransform = TransitionInflater.from(context).inflateTransition(R.transition.default_transition);
changeTransform.setDuration(1500);
MovieList current = (MovieList) manager.findFragmentById(R.id.activity_main_container_body);
movieDetails.setSharedElementReturnTransition(new CustomTransition());
movieDetails.setSharedElementEnterTransition(new CustomTransition());
movieDetails.setEnterTransition(new Fade());
current.setExitTransition(new Fade());
String x = cover.getTransitionName();
transaction.addSharedElement(cover,a);
}
else{
transaction.setCustomAnimations(R.animator.fr_fade_in,R.animator.fr_slide_out_right,R.animator.fr_slide_in_right,R.animator.fr_fade_out);
}
transaction.replace(R.id.activity_main_container_body,movieDetails,"movieDetails");
transaction.addToBackStack(null);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.commit();
我的第二个片段有两个 newInstance 方法,如下所示:
public static MovieDetailsFragment newInstance(String Movie_ID) {
MovieDetailsFragment fragment = new MovieDetailsFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, Movie_ID);
fragment.setArguments(args);
return fragment;
}
public static MovieDetailsFragment newInstance(String Movie_ID,Bitmap bmp) {
MovieDetailsFragment fragment = new MovieDetailsFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, Movie_ID);
args.putParcelable(ARG_PARAM2, bmp);
fragment.setArguments(args);
return fragment;
}
这是 CustomTransition.java :
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class CustomTransition extends TransitionSet {
public CustomTransition(){
setOrdering(ORDERING_TOGETHER);
addTransition(new ChangeBounds()).addTransition(new ChangeTransform()).addTransition(new ChangeImageTransform());
}
}
它对淡入淡出起作用,但对图像不起作用!
更新 我建议在我的 git 存储库中使用 this example,这对初学者来说是一个很好的例子。
请通过this link and the link to his github is here。它可以回答您的所有问题。我也遵循了相同的 link。
我终于在一周后纠正了我的****错误。
最好使用 android.support.v4.app.Fragment
这就是它不起作用的原因
我混合在 android.support.v4.app.Fragment
和 android.app.Fragment
我强烈推荐你使用this tutorial, specially download the git repository