标签: shared-element-transition

使用共享元素在活动过渡中打嗝

我想使用Android Lollipop的新Activity Transitions.但目前我在动画片中看到非常奇怪的拾音.我把我能想到的最小样本砍在一起.

这是我在很短的版本中所做的:

  1. 启用了我的窗口内容转换 styles.xml
  2. slide.xml在我的风格中引用了一个非常简单的退出过渡
  3. android:transitionName为两个布局中的共享元素提供了一个
  4. ActivityOptions.makeSceneTransitionAnimation()使用该名称和我想要分享的视图调用
  5. 将生成的包传递给 startActivity()

这是我看到的行为(尝试慢10倍的动画速度来看看我的意思):在幻灯片动画向下滑动未共享的视图之前,这些视图会略微下降.他们实际上分开了一点.

但是:这只会在我第二次运行该动画时发生(之后每次都会发生).第一关看起来很好.而且只有当我想与下一个活动共享元素时才会发生这种情况.如果我不尝试共享元素,一切正常.

这是我的代码:

价值观/ styles.xml

<resources>
<style name="AppTheme" parent="android:Theme.Material.Light">
    <!-- enable window content transitions -->
    <item name="android:windowContentTransitions">true</item>

    <!-- specify exit transition -->
    <item name="android:windowExitTransition">@transition/slide</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)

过渡/ slide.xml

<slide />
Run Code Online (Sandbox Code Playgroud)

主要活动的布局

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#0000ff" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#00ff00" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#0000ff" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#00ff00" />

    </LinearLayout> …
Run Code Online (Sandbox Code Playgroud)

android android-5.0-lollipop activity-transition shared-element-transition

7
推荐指数
1
解决办法
9380
查看次数

在Android Lollipop上取消共享返回转换

我正在玩Lollipop的Activity Transition.

我在Activity A中有一个按钮,当点击它时调用Activity B.在Activity B中,我重写onBackPressed()并调用finishAfterTransition()

活动B只有两个具有背景颜色的相对布局块.我已经将一个共享元素从Button转换到其中一个块,它完美地运行.即使回归过渡也有效.

但我遇到的问题是我无法取消共享元素返回转换并实现正常的退出转换.

目的是将两个滑块从屏幕上滑下,顶部一个从顶部开始,另一个从底部滑下.如果我启用了共享元素转换,则无效.

我尝试设置退出转换并将null设置为活动B上的sharedElementReturn转换.不起作用.

我尝试使用幻灯片转换在活动A上设置重新转换过渡,但仍然是在后退时反转共享元素转换.

如果我关闭共享元素转换,从活动B返回到A时,所需的效果是完美的.

有任何想法吗?

android android-transitions shared-element-transition

7
推荐指数
0
解决办法
1806
查看次数

共享元素两个片段之间的转换,保持第一个片段可见

我在两个片段之间的共享元素转换正常工作.但是,问题是我不想隐藏第一个片段 - 我希望它显示在新添加的第二个片段下面.如果我不在ft.hide( firstFragment )FragmentTransaction的共享元素中包含转换将不会运行.

如何进行共享元素转换以保持两个片段可见?

android android-fragments shared-element-transition fragment-transitions

7
推荐指数
0
解决办法
211
查看次数

共享元素活动转换动画中的Z顺序

我正在做一些基本的共享元素活动过渡动画,代码类似于:

Intent i = new Intent(AnActivity.this, AnotherActivity.class);
ActivityOptionsCompat options =
        ActivityOptionsCompat.makeSceneTransitionAnimation(this,
                Pair.create(vBackground, "background"),
                Pair.create(vImage, "image"),
                Pair.create(vName, "name"),
                Pair.create(vDistance, "distance")
        );
startActivity(i, options.toBundle());
Run Code Online (Sandbox Code Playgroud)

我可以更改动画分配给视图的Z顺序吗?

原因是一些视图在动画期间被其他视图隐藏,即使在两种活动布局中都不是这种情况.在转换代码的某处,视图的Z顺序会发生变化.

我尝试重新排序Pair.create(...),但没有取得很大的成功.

android shared-element-transition

7
推荐指数
0
解决办法
644
查看次数

是否可以在viewpager中将共享元素从片段转换为ViewPager

我有活动A有一个片段包含项目列表,
当我点击项目时,该项目包含ImageView 我启动包含ViewPager片段的活动B,每个片段内部都有一个包含图像的ViewPager,我想要做的是在项目列表中的第一个ImageView和图像的viewpager中显示的第一个图像之间进行共享元素转换 ActivityA

ActivityB

android android-animation android-fragments android-viewpager shared-element-transition

7
推荐指数
1
解决办法
1272
查看次数

回来过渡片段共享元素消失了

在某些View在我的应用我显示Fragment一些OmagesRecyclerView。当Image被点击时,一个新的细节Fragment被示出(带有输入和返回过渡)。问题是当Button从 details 按下Back 时View,共享元素View有时会消失,有时不会。

这就是我所说的新细节Fragment

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        dialog.setSharedElementEnterTransition(new DetailsTransition());
        dialog.setEnterTransition(new Slide());
        setExitTransition(new Fade());
        dialog.setSharedElementReturnTransition(new DetailsTransition());
    }

    dialog.setTargetFragment(this, DETAIL_FRAGMENT);

    getActivity().getSupportFragmentManager()
            .beginTransaction()
            .addSharedElement(view, transitionmage)
            .replace(R.id.container, dialog, DetailFragment.TAG)
            .addToBackStack(DetailFragment.TAG)
            .commit();
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这些解决方案但没有成功:

如何在 Android Lollipop 中推迟 Fragment 的进入转换?

推迟的共享元素转换

android fragment android-transitions shared-element-transition

7
推荐指数
0
解决办法
635
查看次数

MaterialContainerTransform 转换在返回时不起作用

我的 MaterialContainerTransform 转换是从源 -> 目标进行的,但反之则不然。我的情况非常标准——我试图提供从 RecyclerView 项目(源片段)到“详细信息”片段(目标片段)的简单转换。RecyclerView 中的项目是 MaterialCardView,每个都有一个在目标 Fragment 中共享的 ImageView。

遵循这些文档https://material.io/develop/android/theming/motion似乎相当简单,尽管文档是用 Kotlin 编写的并且我使用的是 Java,所以也许我遗漏了一些东西?我在每个 RecyclerView 项中动态设置 ImageView 过渡名称,并将其传递到目标 Fragment,然后目标 Fragment 将过渡名称复制到其自己的 ImageView。通过日志记录,我可以确认每个片段中的共享transitionName 匹配。

从源 -> 目标的转换效果很好,但是当我点击后退按钮时,没有转换回来。这很奇怪,因为即使文档也声明:

片段能够定义进入和返回共享元素转换。当只设置了一个进入共享元素transition时,当Fragment弹出(返回)时会重新使用它。

有什么想法为什么返回转换(目标 -> 源)不起作用?这是相关代码:

RecyclerView Item (Source) **ImageView 是共享元素

<com.google.android.material.card.MaterialCardView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/result_layout_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="5dp"
    app:cardElevation="4dp"
    android:layout_margin="8dp"
    android:clickable="true"
    android:focusable="true"
    android:checkable="true"
    app:checkedIconTint="@color/checkedYellow"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_gravity="center">


        <ImageView
            android:id="@+id/result_image_thumbnail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter"
            android:contentDescription="@string/thumbnail_content_description"
            android:src="@drawable/corolla_preview"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/result_text_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="2018 Toyota Corolla"
                style="@style/TextAppearance.MaterialComponents.Subtitle1" …
Run Code Online (Sandbox Code Playgroud)

java android material-design shared-element-transition android-recyclerview

7
推荐指数
2
解决办法
1602
查看次数

ImageView共享元素转换(在Activity之间)以错误的scaleType开头

我在开始时发现了SimpleDraweeView 壁画的问题.但是我用android ImageView替换后问题仍然存在.所以我无法确定问题是由于Android还是仅仅是壁画.

问题是什么

  1. 第一个活动具有循环视图,每个视图都有一个ImageView(或SimpleDraweeView).想要的scaleType是"centerCrop"
  2. 第二个活动只有一个ImageView.想要的scaleType是"fitCenter"

但是在我的私人项目中,以及在示例项目中.
https://github.com/JackFan-Z/ActivitySharedElementTransition
ImageView以scaleType"fitCenter"开头,这是错误的.

我试图推迟共享元素转换,并在SharedElementCallback的回调中设置不同scaleType的共享元素.但它们都没有真正起作用.任何人都可以帮助弄清楚出了什么问题,或者在哪里调试?

该问题的屏幕截图

第一个Activity的截图:
在此输入图像描述

过渡的截图:
在此输入图像描述

android activity-transition shared-element-transition fresco android-5.1.1-lollipop

6
推荐指数
1
解决办法
1141
查看次数

带旋转的Android共享元素转换,可能已损坏?

(请参阅代码后的更新.)

我有一个带有旋转视图的屏幕,我希望将其转换到另一个屏幕,理想情况是使用Android的内置共享元素转换功能.但是,即使旋转相同,设置View旋转时产生的动画也会被破坏.我查看了共享元素转换的各种转换效果,"ChangeTransform"特别提到了旋转(并查看代码确认了这一点).使用它或不使用它具有相同的结果.(也就是说,明确地设置或仅使用默认设置,动画外观的结果没有变化,我将在下面描述.)

那会发生什么?让我举例解释一下.让我们进行两项活动 - 我们将摆脱所有片段,因此我们知道延迟的过渡不会妨碍它们 - 称之为MainActivity和AnotherActivity.MainActivity启动具有共享元素转换的AnotherActivity活动.取两个视图,viewOnene和viewTwo.ViewOne没有轮播.ViewTwo在MainActivity中设置了旋转,但没有设置AnotherActivity.在MainActivity中,两个视图都在左侧,而在AnotherActivity中,两个视图都在右侧.它们有不同的尺寸.

以下是发生的事情:

  • ViewOne将动画调整到目标位置,并适当缩放尺寸.这看起来很好,是预料之中的.
  • ViewTwo弹出无旋转(例如,即时旋转为0),然后动画到目标位置和大小.看起来很可怕.

这是倒退时发生的事情:

  • ViewOne反转动画,一切看起来都很好.
  • ViewTwo动画回到目标位置,有点太大了.然后它会弹出一个略有不同的位置和大小(更大,更奇怪)和目标旋转并平移和缩放到位.这看起来很糟糕.

你可能需要自己看一下.这里:https://youtu.be/cUlVZgmJV_A

我试过直接通过代码更改转换,从样式中查看TransitionSet和引用,结果是一样的.就像转换(无论是来自代码还是XML)一样,转换被分成两半.

我创建了一个小项目来演示,如果需要可以共享整个项目.但是,我怀疑我可能只是遗漏了一些简单的东西,特别是因为一个视图在转换时工作正常.

我期望发生的是旋转随着翻译和规模平稳变化.对于动画师来说,这是相对简单的,但是如果可能的话,我想避免手动创建共享元素转换.

以下是相关文件的相关部分:

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final View viewOne = findViewById(R.id.viewOne);
        final View viewTwo = findViewById(R.id.viewTwo);

        viewOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AnotherActivity.class);
                Pair<View, String> viewOneTx = new Pair<>(viewOne, "view_one");
                Pair<View, String> viewTwoTx = new Pair<>(viewTwo, "view_two");

                ArrayList<Pair<View, String>> viewsList = new ArrayList<>();

                viewsList.add(viewOneTx);
                viewsList.add(viewTwoTx);

                ActivityOptionsCompat options;

                //noinspection unchecked …
Run Code Online (Sandbox Code Playgroud)

android android-transitions shared-element-transition

6
推荐指数
0
解决办法
907
查看次数

如何使SharedElement在片段内的viewPager片段中工作

我的情况是我只有一项活动.首先,它显示fragment1,在该片段内,我有一个recyclerView来显示一个cardview列表,在每个CardView中,有一个图像.当用户点击每个CardView时,fragment1将被片段2替换.Fragment2包含一个viewPager,viewpager在fragment1中显示与recyclerView相同的数据,但更具体.我想在fragment1中的image1和fragment2中的image2之间创建一个shareElement动画. 在此输入图像描述 我做的是:recyclelerView的OnLickListener,我按项目的代码为image1设置transitionName

    image1.setTransitionName(item.getContentID().toString());
Run Code Online (Sandbox Code Playgroud)

替换framgent和addShareElement:

  fragmentTransaction
                .replace(R.id.fragment, sharedElementFragment2, FragmentEnum.FEED.toString())
                .addToBackStack(null)
                .addSharedElement(image1,image1.getTransitionName())
                .commit();
Run Code Online (Sandbox Code Playgroud)

在viewPager的片段中,我更新了image2,其中transitionName由片段1发送

@Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        view.findViewById(R.id.image2).setTransitionName(feed.getContentID()+"");

    }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我试图将image2放在viewpager之外(直接在片段2下)并且它可以工作.看来,当viewPager中的目标元素时,shareElement不起作用.对此有何解决方案?

android android-fragments shared-element-transition

6
推荐指数
1
解决办法
471
查看次数