【问题标题】:Android Activity transitions using Support v4 up to date with Android L使用 Android L 最新支持 v4 的 Android Activity 转换
【发布时间】:2014-11-01 10:34:31
【问题描述】:

我正在为我的应用实施材料设计。我看到可以在这里进行活动之间的转换:http://android-developers.blogspot.com.es/2014/10/implementing-material-design-in-your.html

所以我试着按照“真实动作”部分所说的:

ActivityMain.java

Intent intent = new Intent();
String transitionName = getString(R.string.transition_album_cover);
…
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
    albumCoverImageView,   // The view which starts the transition
    transitionName    // The transitionName of the view we’re transitioning to
    );
ActivityCompat.startActivity(activity, intent, options.toBundle());

activity_main.xml

<ImageView
    …
    android:transitionName="@string/transition_album_cover" />

activity_details.xml

<ImageView
    …
    android:transitionName="@string/transition_album_cover" />

但是,这似乎使默认的 android 活动转换,我看不到任何动画。

请记住,我调用了 requestWindowFeature(Window.FEATURE_CONTENT_TRANSITIONS),正如这里所说的 http://developer.android.com/reference/android/support/v4/app/ActivityOptionsCompat.html#makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String)

所有这些都使用 Nexus4 API Level 19 进行了测试

问题出在哪里?

【问题讨论】:

    标签: android animation android-support-library material-design


    【解决方案1】:

    ActivityOptionsCompat.makeSceneTransitionAnimation 仅适用于 API 级别 >= 21。 来自docs

    一些材料设计功能,如材料主题和自定义 活动转换仅适用于 Android 5.0(API 级别 21) 以上。但是,您可以设计您的应用程序以利用这些 在支持材料设计的设备上运行时的功能和 仍与运行旧版 Android 的设备兼容。

    这是它的定义:

    public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
            View sharedElement, String sharedElementName) {
        if (Build.VERSION.SDK_INT >= 21) {
            return new ActivityOptionsCompat.ActivityOptionsImpl21(
                    ActivityOptionsCompat21.makeSceneTransitionAnimation(activity,
                            sharedElement, sharedElementName));
        }
        return new ActivityOptionsCompat();
    }
    

    那么为什么支持包中存在这种方法呢?

    这样做是为了保持与旧版本的向后兼容性(api 级别 maintaining compatibility docs:

    // Check if we're running on Android 5.0 or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // Call some material design APIs here
    } else {
        // Implement this feature without material design
    }
    

    【讨论】:

    • 那么为什么不自己添加检查并创建所需的变量呢?看起来很没用,不是吗?
    • 只要 AppCompat 的 API 保持不变,那么这就是我们需要为未来版本持续维护的 if 语句。另外,对于这个来说,它可能看起来不多,但您不希望在整个代码中维护大量这样的案例。
    • 看起来现在它倒退了,我看不到关于那个的文档
    【解决方案2】:

    Activity 转换是 Android 5.0 独有的。 ActivityOptionsCompat. makeSceneTransitionAnimation 在你运行 19 岁或以下时不会做任何事情。

    【讨论】:

    • 那么为什么支持包中存在这种方法呢?这没有任何意义......还要检查这个方法文档。它没有说任何关于api级别developer.android.com/reference/android/support/v4/app/…,android.view.View,java.lang.String)
    • 它可能只是为了防止根据 api 级别使用不同的代码来启动活动的义务。
    • 好吧,所以对于低于 L 的 api 级别,它只会被“忽略”,但在 L+ 上它会按预期工作,对吗?为什么官方文档中没有这样说?
    • SDK + 支持库中的常见模式;任何以Compat 结尾的类都会以这种方式运行。在某些情况下,将提供向后兼容的行为,而在其他情况下,它将是无操作的。
    • 未来也可能会更新。这发生在一些 Compat 类上,它们最初什么都不做(没有操作,所以没有崩溃),但后来被填充了 shims / polyfills
    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多