java - 如何自定义 Lollipop 上的 Activity 转换,以在某些 View 上以不同方式工作?

标签 java android android-5.0-lollipop activity-transition

背景

Lollipop 引入了一种在 Activity 之间转换的新方法(链接 herehereherehere)。

问题

他们在其中一个视频 (here) 中说,我可以准确选择每个 View 的过渡方式,但我找不到如何操作。我发现的唯一一件事是如何为所有 View 设置它,“英雄” View 除外(您可以选择如何将其转换到新 Activity 并返回)。

例如,让我们以 Google Now 应用程序为例,它具有以下屏幕: enter image description here

当您点击 editText 时,底部的卡片具有“爆炸”效果,但一切都变暗并且 editText 后面的 imageView 淡出。

editText 可能是“英雄” View ,它在 Activity 之间转换,并且因为它位于屏幕上的相同位置,所以这可能对用户没有任何视觉效果。

我尝试过的

我试图模仿谷歌现在所做的,但正如我所写的,imageView 也有“爆炸”效果,所以它到达底部,在 listView 后面,这是一个奇怪的效果(因为它在动画时被裁剪)。我更喜欢它要么动画到不同的方向,要么只是淡出。

这是我正在使用的转换示例代码:

    final Intent intent = new Intent(activity, SearchActivity.class);
    ViewCompat.setTransitionName(viewToTransitionFromAndTo, VIEW_TO_TRANSITION_TO);
    final ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
            viewToTransitionFromAndTo, VIEW_TO_TRANSITION_TO);
    ActivityCompat.startActivityForResult(activity, intent, requestCode, options.toBundle());

在启动另一个 Activity 的 Activity 主题中,我有这个:

<style name="AppTheme.transition" parent="@style/AppTheme">

    <!-- transition support -->
    <item name="android:windowContentTransitions" tools:targetApi="21">true</item>
    <item name="android:windowActivityTransitions" tools:targetApi="21">true</item>
    <item name="android:windowEnterTransition" tools:targetApi="21">@transition/explode</item>
    <item name="android:windowExitTransition" tools:targetApi="21">@transition/explode</item>
    <item name="android:windowSharedElementEnterTransition" tools:targetApi="21">@transition/move_image</item>
    <item name="android:windowSharedElementExitTransition" tools:targetApi="21">@transition/move_image</item>
    <item name="android:windowAllowReturnTransitionOverlap" tools:targetApi="21">true</item>
    <item name="android:windowAllowEnterTransitionOverlap" tools:targetApi="21">false</item>
</style>

过渡文件是:

explode.xml

<?xml version="1.0" encoding="utf-8"?>
<explode />

move_image.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet>

    <changeBounds />

    <changeImageTransform />

</transitionSet>

问题

我如何选择每个 View 在转换时将执行的操作,而不是仅仅说所有内容都具有相同的效果(“英雄” View 除外)?

例如,是否可以为除“英雄” View 之外的所有 View 选择“分解”过渡,以及将具有不同过渡(例如淡出/淡入)的 View ?

请举例说明如何操作。如果需要,您可以使用我上面编写的代码。

最佳答案

使用 TransitionSet 并使用 Transition#addTarget()Transition#excludeTarget() 添加/排除某些目标。例如,假设您有两个 View ,并且您希望每个 View 都从屏幕上向不同的方向滑出。您可以使用以下代码创建这样的转换:

TransitionSet set = new TransitionSet();

Transition slideUp = new Slide(Gravity.UP);
slideUp.addTarget(view1);
set.addTransition(slideUp);

Transition slideDown = new Slide(Gravity.DOWN);
slideDown.addTarget(view2);
set.addTransition(slideDown);

TransitionSet extends Transition,因此生成的 set 对象可以用作窗口内容过渡,这将同时并行播放两个幻灯片过渡。

关于java - 如何自定义 Lollipop 上的 Activity 转换,以在某些 View 上以不同方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27722028/

相关文章:

java - 如何转义正则表达式中的字符

android - 将 Android 手机与 ASP.net MVC 4 应用程序连接的 Web 服务

android - react-native-fbsdk 的共享插件错误。

android - 键盘仅在 Lollipop 中覆盖 edittext 和 webview

android - [Android L]Android Material 圆形按钮

java - 资源映射在没有 xml 配置的 spring 5 中不起作用

java - 为什么 void 关键字不用作方法参数?

android - Universal Image Loader 版本 1.9.2 出错

Android 5 屏幕故障/静态与 Viewpager 内的 Google map fragment

Java Spring-boot 和内存中的 db H2。 db 不在 h2 web 控制台中