活动/片段转换是不是与棒棒糖之前的设备兼容?

Posted

技术标签:

【中文标题】活动/片段转换是不是与棒棒糖之前的设备兼容?【英文标题】:Are Activity/Fragment Transitions compatible with pre-Lollipop devices?活动/片段转换是否与棒棒糖之前的设备兼容? 【发布时间】:2014-12-21 10:33:51 【问题描述】:

我正在尝试在棒棒糖之前的设备 (4.x) 上使用共享元素进行活动转换。可能吗?到目前为止,我正在尝试这个:

public class RewardDetail extends ActionBarActivity 
    @Override
    public void onCreate(final Bundle savedInstanceState) 
        ...

        ViewCompat.setTransitionName(imageView, TRANSITION_NAME);
    

    ...

    public static void launch(ActionBarActivity activity, View transitionView, WelcomeReward detailData) 
        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionView, TRANSITION_NAME);
        Intent intent = new Intent(activity, RewardDetail.class);
        intent.putExtra(PARAM_DATA, detailData);
        ActivityCompat.startActivity(activity, intent, options.toBundle());
    

调用者:

@Override
public void onClick(final View v) 
    int position = recyclerView.getChildPosition(v);
    WelcomeReward welcomeReward = data.get(position);
    RewardDetail.launch(WelcomeRewardActivity.this, v.findViewById(R.id.reward_view), welcomeReward);

但它会导致“常规”过渡(没有共享元素)。有什么想法吗?

编辑

根据这个视频,可以做到:

https://www.youtube.com/watch?v=RhiPJByIMrM&index=8&list=WL

是否有一个库已经为 pre Lollipop 实现了这个?

【问题讨论】:

如果您正在寻找一种在棒棒糖之前的方法,您可以使用此视频作为示例:youtube.com/watch?v=CPxkoe2MraA(请注意,它需要更多的工作才能实现)。 支持库 24.2.0 - developer.android.com/topic/libraries/support-library/… 有一个有希望的更新,带有 android.support.transition 包,但它是仅用于视图级的反向移植 API! 【参考方案1】:

不,活动/片段转换在棒棒糖之前的设备上是不可能的。根据documentation:

如果可以的话,用额外的启动信息开始一个活动。

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

另请参阅 George Mount 对this *** question 的回答。

【讨论】:

那么...如果活动/片段转换只能在 Lollipop 中实现,这是否意味着某些 Google 应用程序使用更复杂的方法(如您在问题评论中提供的那样)来实现转换?我真的很好奇 Google 日历和 Keep 如何让它在较低版本中工作.. Google 日历和 Google Keep 可能已经实现了自己的自定义库来执行此操作...没有支持棒棒糖前设备的官方 API。 你可以尝试自己实现一些东西,但谷歌没有提供向后兼容的库。 您帖子中的链接被替换是有原因的:Blacklist the use of common link shorteners in posts。 This is being discussed on meta【参考方案2】:

有一个支持库,但它不支持(所有)低于 5.0 的 Android 版本的转换。不过也有一些选择:

非官方兼容库https://github.com/andkulikov/transitions-everywherehttps://github.com/takahirom/PreLollipopTransitionhttps://github.com/lgvalle/Material-Animations

Android KitKathttp://www.doubleencore.com/2013/11/new-transitions-framework/ 和一个 在您的 SDK 示例文件夹中找到示例。

之前在此处发布了此问题的副本:https://***.com/a/27344471/1683141

【讨论】:

【参考方案3】:

虽然花哨的 Lollipop Activity/Fragment 转换在 Lollipop 之前不可用(不使用 3rd 方库),但您仍然可以覆盖用于在 Activity 之间转换的动画。

就在您开始调用 startActivity() 之前/之后,您可以调用 [Activity.overridePendingTransition](http://developer.android.com/reference/android/app/Activity.html#overridePendingTransition(int, int))。当你离开你的活动时,调用相同的方法。

同样,您可以使用 ActivityOptionsCompat 定义自定义动画以在过渡期间使用。

ActivityOptionsCompat opts =
    ActivityOptionsCompat.makeCustomAnimation(getActivity(), R.anim.in, R.anim.out);
startActivity(intent, opts.toBundle());

【讨论】:

【参考方案4】:

您可以查看此库,了解棒棒糖前设备的活动和片段转换

dependencies 
        compile 'com.albinmathew:PreLollipopTransition:1.1.2'

https://github.com/albinmathew/PreLollipopTransition

【讨论】:

以上是关于活动/片段转换是不是与棒棒糖之前的设备兼容?的主要内容,如果未能解决你的问题,请参考以下文章

何时使用活动转换与动态片段的模式

不同活动的片段之间的共享元素转换

使用滑动刷新布局的片段不转换

不同活动的片段之间的共享元素转换

如何将活动转换为片段以在抽屉中使用

跨活动的片段之间的共享元素转换不一致