我想在 ViewPager 中使用从一个 Fragment 到另一个 Fragment 的 SharedElement 转换为视图设置动画。
我在 ViewPager 中有 3 个片段,每个片段在 XML 文件中都有一个具有相同转换名称的 TextView。
现在,当 ViewPager 滑动另一个 Fragment 时,我想看到 SharedElement 的运行情况。
animation android shared-element-transition android-design-library
当我尝试使用Medium GitHub 上这篇文章中的类似代码对片段使用转换时。当我在片段管理器上使用 add method() 时它不起作用,但它可以与 replace() 一起使用。
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.addSharedElement(mSharedElement, "transName")
.add(D.id.content_frame, fragment, FRAG_NAME)
.addToBackStack(null)
.commit();
Run Code Online (Sandbox Code Playgroud)
我需要使用 add() 方法来保留下面的片段,因为用户将在包含项目列表的第一个片段和显示有关该项目的详细信息的第二个片段之间来回导航。我不想继续用列表加载片段。
在片段管理器上使用 add() 时,有没有办法让共享元素转换工作,而不是 replace()。
android android-fragments fragmentmanager android-transitions shared-element-transition
我有一个带有两个的应用程序activities,其中第二个用作图像“选择器”并向第一个提供一些信息,以便ImageView可以相应地更新。
为此,我activity通过调用第二个startActivityForResult(),并ImageView根据收到的信息更新onActivityResult()。
当我尝试为选取器和主元素之间的共享元素设置动画时,问题出现了Activity:过渡动画似乎是第一个“快照” Activity,即使恢复后ImageView立即更新Activity,过渡动画也会“闪烁”较旧的版本View显示当前版本之前。
这是我制作的一个示例应用程序,用于说明我在说什么:
无缝实现此动画的最佳方法是什么?是否应该使用另一种方法?
这是用于示例的代码:
主要活动
public class MainActivity extends AppCompatActivity {
ImageView mainImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().setTitle("Main Activity");
mainImageView = (ImageView) findViewById(R.id.imageView);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, PickerActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(MainActivity.this, mainImageView, "shape_transition");
startActivityForResult(intent, 1, options.toBundle());
}
});
}
@Override …Run Code Online (Sandbox Code Playgroud) android android-intent activity-transition shared-element-transition
我已经使用回收器视图实现了共享元素图像转换,并且工作正常。问题是我想像谷歌照片应用程序一样提高它的图像转换速度。我们可以以编程方式做到这一点吗?我正在分享几行代码。
开始活动
Intent intent = new Intent(StartActivity.this, TargetActivity.class);
intent.putExtra(KEY_EXTRA_IMAGES_URLS, urls);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(StartActivity.this, view,
getResources().getString(R.string.transition_name_profile_image));
ActivityCompat.startActivity(StartActivity.this, intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud) 我正在尝试在不同活动的片段之间实现共享元素转换,我已经实现了共享元素进入转换,但无法管理回退转换。
片段 A 托管在 Activity A 中,单击按钮时,图像被添加为共享元素,然后启动 Activity B,其中托管包含共享元素的目标视图的 Fragment B。
活动一:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content, FragmentA.newInstance())
.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
finishAfterTransition();
}
Run Code Online (Sandbox Code Playgroud)
片段A:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
postponeEnterTransition();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setSharedElementEnterTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
setSharedElementReturnTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final ImageView imageView = (ImageView) view.findViewById(R.id.simple_activity_a_imageView);
Button button = (Button) view.findViewById(R.id.simple_activity_a_btn);
button.setOnClickListener(new View.OnClickListener() {
@Override …Run Code Online (Sandbox Code Playgroud) animation android android-fragments material-design shared-element-transition
所以这里的问题是:我有一个主活动,其中包含一个包含 RecyclerView 的片段,共享元素位于 RecyclerView 的视图中。当您单击此共享元素时,它会启动一个具有共享元素转换的新活动。第一次启动它时,共享元素将闪烁,如果您返回动画播放效果很好。如果您第二次启动与之前相同的元素,动画也会很好地播放。它只是第一次闪烁。
这是来自 RecyclerView 适配器的回调,我传递共享视图并启动其他活动。这段代码在我上面提到的片段中。
@Override
public void onClick(int arrayPosition, int position, View view) {
Movie movie = mMovieLists.get(arrayPosition).getMovieList().get(position);
Intent intent = new Intent(getActivity(), MovieDetailActivity.class);
intent.putExtra(MovieDetailActivity.MOVIE_ID_INTENT, movie.getmId());
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), view, getString(R.string.movie_poster_trans));
startActivity(intent, options.toBundle());
}
Run Code Online (Sandbox Code Playgroud) 我从带有共享元素转换的 ActivityA ActivityB 打开。它工作正常。当我按下“返回”按钮时,共享元素同样可以正常工作,并且我看到了近距离动画。
但是,如果我按下“主页”按钮,然后返回应用程序 (ActivityB),然后单击“返回”转到 ActivityA,则转换不起作用。
三个活动的情况相同。
活动A -(工作)->活动B -(工作)->活动C
之后我开始按“返回”按钮
活动C -(工作)->活动B -(不工作)->活动A
工作 - 这意味着共享元素过渡工作,我看到动画
对于开始活动,我使用
ActivityOptionsCompat options = ActivityOptionsCompat
.makeSceneTransitionAnimation(getActivity(), itemView, transitionName);
startActivity(intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)
尝试更改清单(不要工作)
android:name=".ActivityB"
android:launchMode="singleTask"
android:parentActivityName=".ActivityA"
Run Code Online (Sandbox Code Playgroud)
尝试保存共享元素(不要工作)
android:name=".ActivityB"
android:launchMode="singleTask"
android:parentActivityName=".ActivityA"
Run Code Online (Sandbox Code Playgroud)
我注意到在最小化应用程序后,按“返回”时不会调用 onMapSharedElements()。否则呼叫正在发生。
我猜 onStop() 调用会中断共享元素转换。但我无法避免这一点。任何帮助或想法,请
animation android android-lifecycle android-activity shared-element-transition
问题
我想实现 Activity A 和 B 之间以及 Activity B 和 C 之间的共享元素转换。
我根据android 转换文档做了所有事情。
之间没有问题:
A => B => 回到 A
A => B 和 B => C => 回到 B
但如果我这样做:
最后一步不会有任何共享元素过渡(实际上不仅是共享元素过渡,即使只有淡入淡出也可能会丢失)。
我一直在到处寻找解决方案,但似乎每个人都只需要 A => B(和 B => A)共享元素转换,而不再关心从 B => C 返回到 A 的任何转换。
例子
看一个我基于android的动画示例创建的例子,其中Activity A = MainActivity,B = DetailActivity,C = DetailDetailActivity。单击活动 B 上的按钮将导航到活动 C。
请注意,这个问题与此处找到的问题非常相似。没有解决方案,所以我想我应该提供一些代码并再次询问。
本质上,我试图在两个片段之间进行 ImageView 的共享元素转换。我的最终目标是制作一个看起来与默认图片库非常相似的动画。重要的一点是我使用 Glide 来加载图像。我遇到的问题是我无法让scaleType 平滑地进行动画处理(从centerCrop 到fitCenter)。
我有一个包含 RecyclerView 的片段,其每个项目都包含一个 ImageView。这些 ImageView 是缩略图,XML 如下所示:
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/large_spacing"
android:scaleType="centerCrop"/>
Run Code Online (Sandbox Code Playgroud)
重要/有问题的部分是scaleType="centerCrop"
我使用以下命令设置转换名称并在 RecyclerView 适配器中加载图像:
holder.ivPhoto.setTransitionName(current.getPhotoFilepath());
Glide.with(holder.ivPhoto.getContext())
.load(current.getPhotoFilepath())
.dontTransform()
.into(holder.ivPhoto);
Run Code Online (Sandbox Code Playgroud)
单击某个项目时,将运行以下代码:
@Override
public void onItemClicked(AssetDetail assetDetail, ImageView imageView) {
if (assetDetail.getPhotoFilepath() != null) {
AssetDetailFragmentDirections.ActionAssetDetailFragmentToDisplayImageFragment action = AssetDetailFragmentDirections.actionAssetDetailFragmentToDisplayImageFragment(assetDetail.getPhotoFilepath());
FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder()
.addSharedElement(imageView, assetDetail.getPhotoFilepath())
.build();
NavHostFragment.findNavController(this).navigate(action, extras);
}
}
Run Code Online (Sandbox Code Playgroud)
这将带您到第二个片段,它基本上只包含以下 ImageView(技术上是 PhotoView,我也尝试过使用普通 ImageView):
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/ivImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:adjustViewBounds="true"
android:scaleType="fitCenter" />
Run Code Online (Sandbox Code Playgroud)
我推迟输入转换并设置我想要使用的转换:
@Override …Run Code Online (Sandbox Code Playgroud) 我正在为API级别为20+的设备进行场景转换.它工作正常,但我想设置自定义持续时间来进行转换.可能吗 ??
我的代码:
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(this,
viewStart,
transitionName
);
ActivityCompat.startActivity(this, detailsIntent, options.toBundle());
Run Code Online (Sandbox Code Playgroud) animation android android-transitions shared-element-transition