可以给 recreate() 一个过渡动画吗?

Posted

技术标签:

【中文标题】可以给 recreate() 一个过渡动画吗?【英文标题】:Can recreate() be given a transition animation? 【发布时间】:2019-11-26 00:19:39 【问题描述】:

我正在创建一个简单的考试结果存储程序。活动根据用户的当前结果更改主题 - 例如血红色代表不及格等。当用户删除主题并导致整体结果发生重大变化时,主题会发生变化。 主题由这种方法决定:

    private int getTheme()
        

            String[] themes="GreenTheme","TurquoiseTheme","OrangeTheme","RedTheme","BlackTheme";
            int index=0;
            float gpa =getSemesterGpa(currentSemester);

                if (gpa >= 3.5)
                    index = 0;
                else if (gpa >= 3)
                    index = 1;
                else if (gpa >= 2.5)
                    index = 2;
                else if (gpa >= 2)
                    index=3;
                else
                    index=4;


            return getResources().getIdentifier(themes[index],"style",getPackageName());
        

我的 onCreate() 中有:

protected void onCreate(Bundle savedInstanceState)

            
        setTheme(getSgpaTheme());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_semester_detail);
        ...
    

每当删除主题导致 GPA 发生重大变化时,我都会使用 recreate() 以便使用新主题重新加载活动。据我了解,没有其他方法可以动态应用新主题。不幸的是, recreate() 往往会产生屏幕不和谐的闪烁。在一台设备上,三星 S9+,屏幕甚至会暂时变黑。但是在我的S7和华为设备上只有一个闪烁,还是很烦人。

所以问题是:有没有办法实现这一点,无论是否使用 recreate(),这将允许我在颜色变化时添加一个很好的淡入过渡。

P.S:这是我的第一个问题,如果我提供的信息太少,请原谅。我不确定什么是相关的。另外,我只用 Java 和 android-Studio 编程大约 3 周,所以我要求一个面向菜鸟的答案。谢谢。

【问题讨论】:

【参考方案1】:

根据需要修改以下代码

 @Override
    public Resources.Theme getTheme() 

        Resources.Theme theme=super.getTheme();

        preferencesTheme=getSharedPreferences("themes", Context.MODE_PRIVATE);
        String themeName=preferencesTheme.getString("theme","orange");

        if("orange".equals(themeName))
             theme.applyStyle(R.style.OrangeTheme,true);
        else if("red".equals(themeName)) 
             theme.applyStyle(R.style.RedTheme,true);
        

        return theme;
    

比按钮点击

@Override
    public void onClick(View v) 

        SharedPreferences.Editor mEditorTheme=preferencesTheme.edit();

        if(v.getId()==R.id.rdoOrange )

            mEditorTheme.putString("theme","orange");
            mEditorTheme.apply();
            recreate();

        else if(v.getId()==R.id.rdoRed)

            mEditorTheme.putString("theme","red");
            mEditorTheme.apply();
            recreate();
        
    

在 style.xml 中

 <style name="OrangeTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">#FF5722</item>
        <item name="colorPrimaryDark">#B13C17</item>
        <item name="colorAccent">#8BC34A</item>
    </style>

    <style name="RedTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">#F44336</item>
        <item name="colorPrimaryDark">#A00B0B</item>
        <item name="colorAccent">#FF9800</item>
    </style>

希望对你有帮助。

【讨论】:

感谢您的快速回复。我试图阅读您链接的文档,但我只是觉得我缺乏太多的上下文,甚至无法理解所传达的内容。虽然我打算最终让自己熟悉这些事情的深度,但现在你能不能帮我看看方法。我会很感激的。谢谢。 如果可以的话,那将是理想的。谢谢。 嘿@LokikSoni setTheme(name) 方法看起来怎么样?

以上是关于可以给 recreate() 一个过渡动画吗?的主要内容,如果未能解决你的问题,请参考以下文章

同一个动画可以有不同的过渡吗? [复制]

我可以更改 Android startActivity() 过渡动画吗?

我可以在构建元素时暂时关闭所有 CSS3 过渡/动画吗?

我可以使用 CSS 过渡为绝对定位元素设置动画吗?

可以在 flex-direction 属性上使用 CSS 动画或过渡吗?

React系列十四 - React过渡动画