使用 Material Design 在 Android Lollipop 中的 ListView 中的活动转换动画

Posted

技术标签:

【中文标题】使用 Material Design 在 Android Lollipop 中的 ListView 中的活动转换动画【英文标题】:Activity Transition animation in a ListView in Android Lollipop with Material Design 【发布时间】:2015-02-14 00:08:26 【问题描述】:

我正在使用 Master/Detail 模式,目前正在迁移到 android Lollipop。如果我单击 ListView 中的一个项目,我想拥有其中一个 new activity transistions。动画正在运行,但我不知道如何在共享元素(在我的情况下为 ImageView)之间制作特定动画。

如果我单击自定义 ListView 中的一行(带有图像和文本),则转换应切换到 DetailActivtiy 中的图像。它应该看起来像这个视频:http://youtu.be/RhiPJByIMrM?t=2m41s 或这个视频:http://youtu.be/XkWI1FKKrs4

我已经将这段代码添加到我的两个 ImageViews 中:

<ImageView
            android:transitionName="@string/transition_title_image"/>

我的列表活动:

@Override
protected void onCreate(Bundle savedInstanceState) 
    if (Build.VERSION.SDK_INT >= 21) 
        //To enable window content transitions in your code instead, call the Window.requestFeature() method:
        getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
        Transition ts_enter = new Slide();  //Slide(); //Explode();
        Transition ts_exit = new Explode();

        ts_enter.setDuration(2000);
        ts_exit.setDuration(2000);
        /*
        If you have set an enter transition for the second activity,
        the transition is also activated when the activity starts.
        */
        getWindow().setEnterTransition(ts_enter);
        getWindow().setExitTransition(ts_exit);
    
    super.onCreate(savedInstanceState);

使用这个方法调用我的DetailActivity:

    if (Build.VERSION.SDK_INT >= 21) 
        Intent intent = new Intent(ArticleListActivity.this, ArticleDetailActivity.class);
        intent.putExtra("pos", id);
        intent.putExtra("articleList", articleList);
        String transitionName = getString(R.string.transition_title_image);
        ImageView article_thumb = (ImageView) findViewById(R.id.article_thumb);

        ActivityOptionsCompat options =
                ActivityOptionsCompat.makeSceneTransitionAnimation(ArticleListActivity.this,
                        article_thumb,   // The view which starts the transition
                        transitionName    // The transitionName of the view we’re transitioning to
                );
        ActivityCompat.startActivity(ArticleListActivity.this, intent, options.toBundle());
    

我的详细活动:

@Override
protected void onCreate(Bundle savedInstanceState) 
    if (Build.VERSION.SDK_INT >= 21) 
        //To enable window content transitions in your code instead, call the Window.requestFeature() method:
        getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
        Transition ts_enter = new Slide();  //Slide(); //Explode();
        Transition ts_exit = new Explode();  //Slide(); //Explode();

        ts_enter.setDuration(2000);
        ts_exit.setDuration(2000);

        getWindow().setEnterTransition(ts_enter);
        getWindow().setExitTransition(ts_exit);
    
    super.onCreate(savedInstanceState)

;

【问题讨论】:

好的,但你没有解释问题是什么。现在的动画是什么样子的?是否出现故障?在您的代码中,您使用setEnterTransition()setExitTransition() 设置了内容转换,但是您在哪里设置共享元素转换? 另外,如果您在描述您遇到的问题时遇到困难,您可能需要考虑发布您自己的应用程序的视频。 Android Studio 有一个非常有用的视频捕捉工具,可能会派上用场。 This blog post 可能有用。 【参考方案1】:

试试这个:

    首先,确保在第一个活动中为每个 ImageView 指定一个唯一的转换名称。如果所有图像视图都具有相同的过渡名称,则框架将不知道在动画开始时选择哪一个,并且过渡将无法正常运行。

    单击ImageView 时,将其唯一的转换名称作为Intent 额外的名称传递给详细信息活动。

    在 details Activity 的 onCreate() 方法中,从 Intent 包中检索名称,并将其设置为 ImageView 的转换名称。

【讨论】:

只是一个调整:你不应该在额外的意图中使用唯一的过渡名称。您应该使用 details Activity 中使用的转换名称。唯一的名称会自动关联,因此当您返回时,框架知道将哪个 View 与共享元素关联,即使重新创建 Activity 也是如此。 ApiDemos 有一个简单的例子应该会有所帮助。 @GeorgeMount 我不确定我是否完全理解您的意思。 “ApiDemos”是指这个示例项目吗? github.com/googlesamples/android-ActivitySceneTransitionBasic @GeorgeMount 我找到了 ApiDemos here。但是,我仍然很困惑,为什么在这种情况下必须使用SharedElementCallback 映射共享元素......将共享元素传递给Intent 内的被调用活动会有什么问题?您的意思是,如果其中一个活动被系统破坏并重新创建,是否有可能发生某种与状态丢失相关的错误?我错过了什么吗? 当你从一个细节Activity转到一个列表Activity时,框架必须知道列表Activity中的哪个View作为共享元素。当您“返回”时,它可以为您解决问题,因为您使用了它。继续前进时,您可能知道列表 Activity 中的特定 transitionName,但更有可能的是,您共享一个更通用的名称,并且由列表 Activity 分配正确的视图。例如,如果您不在同一个应用程序中,则您无法深入了解远程应用程序的命名方案(除了商定的共享元素名称)。 啊,好吧...关于存在于不同应用程序中的活动,这是一个很好的观点。感谢您清除它!

以上是关于使用 Material Design 在 Android Lollipop 中的 ListView 中的活动转换动画的主要内容,如果未能解决你的问题,请参考以下文章

Design Support Library(支撑Material Design)

Material Design使用总结

React Material Design:在类组件中使用带有 redux 的 React Material Design 自定义样式

推荐开发者使用 Material Design 组件

推荐开发者使用 Material Design 组件

新建一个Material Design工程