3

我使用最近在 android support-v4 库中支持的 ActivityOptionsCompat 和 ActivityCompat 实现了窗口动画。

我使用下面的代码来实现动画:

Intent subActivity = new Intent(WindowAnimations.this,
                    AnimatedSubActivity.class);
            // The enter/exit animations for the two activities are
            // specified by xml resources
            Bundle translateBundle = ActivityOptionsCompat
                    .makeCustomAnimation(WindowAnimations.this,
                            R.anim.slide_in_left, R.anim.slide_out_left)
                    .toBundle();
            ActivityCompat.startActivity(WindowAnimations.this,
                        subActivity, translateBundle);

上面的代码在 android 4.3 和 4.0 中运行良好。

任何人都能够使其在 2.X 中工作?任何帮助表示赞赏。

4

1 回答 1

10

@Luksprog 基本上已经在您的问题的第一个问题中回答了这个问题,但是这里有更多文档可以进一步支持该主张。

首先,仔细阅读 javadoc 。我强调了一些相关的关键字:ActivityCompat#startActivity(Activity activity, Intent intent, Bundle options)

如果可以的话,使用其他启动信息开始一项活动。

在 Android 4.1+ 中引入了额外的选项,以允许对活动启动动画进行更多控制。应用程序可以将此方法与 ActivityOptionsCompat 一起使用,以便在可用时使用这些动画。在不存在此功能的平台版本上运行时,活动将正常启动

所以这基本上告诉我们(可选)动画功能仅适用于原生支持它的 Android 版本。在所有其他平台版本上,Activity将“正常”启动 - 即没有可选动画。

实际证明可以在以下源代码中ActivityCompat轻松找到:

public static void startActivity(Activity activity, Intent intent, Bundle options) {
    if (Build.VERSION.SDK_INT >= 16) {
        ActivityCompatJB.startActivity(activity, intent, options);
    } else {
        activity.startActivity(intent);
    }
}

换句话说:如果这段代码在 JB 之前的设备上执行,一个普通的旧startActivity()调用将是疯狂的,其中options参数被忽略。只有 JB 设备最终会使用它。

也许多余的提及,但显然这同样适用于startActivityForResult()对方。

总结一下:目前,支持库只是提供了一个静态帮助类来以“向后兼容的方式”执行某些功能——它实际上并没有向后移植该功能(还)。它在这个阶段所做的只是让您不必if/else在自己的应用程序中编写条件。

话虽如此,当前的实现确实允许实际功能的未来反向移植。这可能也是ActivityOptionsCompat该类存在的原因。目前,该类为 pre-JB 设备提供了一个“空”实现,理论上,可以在稍后阶段“填充”。通过这些兼容性助手调用的任何代码都将自动开始工作。

ActivityOptionsCompat返回空实现的调用示例:

public static ActivityOptionsCompat makeCustomAnimation(Context context,
        int enterResId, int exitResId) {
    if (Build.VERSION.SDK_INT >= 16) {
        return new ActivityOptionsImplJB(
            ActivityOptionsCompatJB.makeCustomAnimation(context, enterResId, exitResId));
    }
    return new ActivityOptionsCompat();
}
于 2013-10-02T03:26:40.417 回答