首页 > 其他分享 >解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题

解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题

时间:2023-09-01 12:33:27浏览次数:44  
标签:Theme anim slide windowIsTranslucent right base activity style 黑屏


注:如果设置和取消会造成不同bug,冲突的解决设置不同的style,具体另行百度。。。。。。。

之前在做 APP 的时候不太关注这个问题,因为自己在使用其他 APP 的时候也会在应用启动的初始有一个黑屏闪过后才会出现应用的欢迎页。直到最近开发过程中发现自己在欢迎页启动的线程由于请求和处理的数据量过大而,导致欢迎页在出现之前界面上会有一个短暂的白色闪屏停留,当然白色闪屏的停留是因为 application 的主题样式android:theme=@style/AppTheme 使用了 Theme.Light 题导致的,Light 样式的 windowBackground、colorBackground、colorForeground 等属性的值均为 light 也就是白色偏亮,所以才会出现白色闪屏。下面是我的 APP 出现白色闪屏时样式引用的代码:

<style name=        "AppTheme"        parent=        "android:Theme.Light"        type=        "text/css"        ><br><br>  </style>


简单的修改后,闪屏颜色为黑色,代码如下:


<style name=        "AppTheme"        parent=        "android:style/Theme.Black.NoTitleBar.Fullscreen"        type=        "text/css"        >  </style>


代码修改后引用的样式为黑色主题,但欢迎页仍然会有黑色闪屏短暂的停留。继续进行修改,设置透明属性为 true,代码如下:


<style name=        "AppTheme"        parent=        "android:style/Theme.Black.NoTitleBar.Fullscreen"        type=        "text/css"        ><item name=android:windowIsTranslucent>        true        </item></style>


经过这次的修改之后黑色闪屏现象消失了,最终达到了自己理想的效果。最后,经过查阅资料发现已经有人总结和处理过这类问题了,并且给出了优缺点的分析,我在这里以我的理解对其进行引用。

原来避免黑色闪屏有2种方法,分别为:1.为 Theme 设置背景图;2.为 Theme 设置透明属性。显然我采用的是第二种方式,先分别看看这2种方式所引用的代码:

<!-- 为 Theme 设置背景图 --><style name=        "AppTheme"        parent=        "android:style/Theme.Black.NoTitleBar.Fullscreen"        type=        "text/css"        ><item name=android:windowBackground>        @drawable        /splash_bg</item></style>


<!-- 为 Theme 设置透明属性 --><style name=        "AppTheme"        parent=        "android:style/Theme.Black.NoTitleBar.Fullscreen"        type=        "text/css"        ><item name=android:windowIsTranslucent>        true        </item></style>


上面的2种 Theme 中,为 Theme 设置背景图后程序在启动的时候,会首先显示这张图,避免发生黑屏;为 Theme 设置透明属性,程序启动后不会黑屏而是透明,等到界面初始化完成后才一次性显示出来。下面是两种方式的优缺点:

  • 为 Theme 设置背景图 给人程序启动快的感觉,界面先显示背景图,然后再刷新其他界面控件,刷新不同步。
  • 为 Theme 设置透明属性 给人程序启动慢的感觉,界面会一次性刷出来,刷新同步。 但是问题有出现了,原先在配置了activity的切换动画效果,设置完android:windowIsTranslucent=true之后切换动画失效了。暂时我也不知道android系统的theme属性之间关系的错综复杂,继承来继承去的。。。为什么会出现这种问题,不过还好无意间找到了解决办法
<style name=          "AppTheme"          parent=          "AppBaseTheme"          type=          "text/css"          ><!-- <item name=android:windowAnimationStyle>          @style          /Animation.Activity.Style</item> -->         


                     <item name=android:windowAnimationStyle>          @style          /Animation.Activity.Translucent.Style</item>         


                     <item name=android:windowBackground>          @android          :color/transparent</item>         


                     <item name=android:windowIsTranslucent>          true          </item></style><style name=          "Animation.Activity.Style"          parent=          "@android:style/Animation.Activity"          type=          "text/css"          ><item name=android:activityOpenEnterAnimation>          @anim          /base_slide_right_in</item>         


                     <item name=android:activityOpenExitAnimation>          @anim          /base_stay_orig</item>         


                     <item name=android:activityCloseEnterAnimation>          @anim          /base_stay_orig</item>         


                     <item name=android:activityCloseExitAnimation>          @anim          /base_slide_right_out</item>         


                     <item name=android:taskOpenEnterAnimation>          @anim          /base_slide_right_in</item>         


                     <item name=android:taskOpenExitAnimation>          @anim          /base_stay_orig</item>         


                     <item name=android:taskCloseEnterAnimation>          @anim          /base_stay_orig</item>         


                     <item name=android:taskCloseExitAnimation>          @anim          /base_slide_right_out</item>         


                     <item name=android:taskToFrontEnterAnimation>          @anim          /base_slide_right_in</item>         


                     <item name=android:taskToFrontExitAnimation>          @anim          /base_stay_orig</item>         


                     <item name=android:taskToBackEnterAnimation>          @anim          /base_stay_orig</item>         


                     <item name=android:taskToBackExitAnimation>          @anim          /base_slide_right_out</item></style><style name=          "Animation.Activity.Translucent.Style"          parent=          "@android:style/Animation.Translucent"          type=          "text/css"          ><item name=android:windowEnterAnimation>          @anim          /base_slide_right_in</item>         


                     <item name=android:windowExitAnimation>          @anim          /base_slide_right_out</item></style>
  • 配置style继承的parent为

<style name=          "Animation.Activity.Translucent.Style"          parent=          "@android:style/Animation.Translucent"          type=          "text/css"          ><item name=android:windowEnterAnimation>          @anim          /base_slide_right_in</item>         


                             <item name=android:windowExitAnimation>          @anim          /base_slide_right_out</item></style>

  • 然后让apptheme的
android:windowAnimationStyle为上面的style
<style name=          "AppTheme"          parent=          "AppBaseTheme"          type=          "text/css"          ><item name=android:windowAnimationStyle>          @style          /Animation.Activity.Translucent.Style</item>         


                             <item name=android:windowBackground>          @android          :color/transparent</item>         


                             <item name=android:windowIsTranslucent>          true          </item></style>

  • 如果想在所有的activity切换时候使用该theme,可以配置application,也可以单个单个配置在activity里面。

当然首页退出的时候可以单独配置MainActivity的退出动画和进入动画

<style name=          "Animation.Activity.Translucent.Style.Main"          parent=          "@android:style/Animation.Translucent"          type=          "text/css"          ><item name=android:windowExitAnimation>          @anim          /slide_right_out</item></style>

MainActivity的退出和进入动画可以引用系统提供的,但是好像在style里面配置引用不了有些系统的anim,

在文件夹sdkplatformsandroid-20data es下面,activity_open_enter.xml,activity_close_exit.xml可以直接拷贝到项目中,修改

  • 单独写一个进入或者退出,然后其它默认。。。。。。。

多动手,测试,如果有错误的地方麻烦留言一起交流,谢谢


标签:Theme,anim,slide,windowIsTranslucent,right,base,activity,style,黑屏
From: https://blog.51cto.com/u_15760318/7320858

相关文章

  • 无涯教程-Android - Activity
    Activity代表具有用户界面的单个屏幕,就像Java的窗口或框架一样。AndroidActivity是ContextThemeWrapper类的子类。如果您使用过C,C++或Java编程语言,那么您一定已经看到您的程序从main()函数开始。与之非常相似,Android系统以Activity来启动其程序,该程序以对onCreate()回调方......
  • Android入门教程之Activity(生命周期,启动...)
    Activity是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个Activity都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。Activity1.Activity的使用我们新建的工程中带有......
  • Virtualbox安装Linux使用2560以上高分辨率黑屏
    Virtualbox安装Linux后,通过VirtualBox的视图菜单默认只有1920的分辨率可供选择,想要使用更高分辨率(比如4K)需要在Linux系统的设置里选择。但是,通过Linux系统菜单设置分辨率达到2560时,虚拟机就会黑屏,只有鼠标。此时系统仍然正常运行,按esc可取消当前设置,按回车会确认当前设置,然后就黑......
  • Activity对话框主题样式
    <stylename="DialogTheme"parent="@style/Theme.AppCompat.Dialog"><itemname="windowNoTitle">true</item><itemname="android:windowIsFloating">true</item><......
  • Unable to start activity Comandroid.content.res.Resources$NotFoundException: Str
    UnabletostartactivityComandroid.content.res.Resources$NotFoundException:StringresourceID#0x0 打开app->res->values->strings.xml文件添加<stringname="game_view_content_description">Gameview</string>......
  • ActivityManagerService启动过程-1
    基于Android6.0的源码frameworks/base/core/java/android/app/-ActivityThread.java-LoadedApk.java-ContextImpl.javaframeworks/base/services/java/com/android/server/-SystemServer.javaframeworks/base/services/core/java/com/android/server/-......
  • Android的onAttach方法是在 Fragment 与其宿主 Activity 关联时调用的,用于建立 Fragme
    在Android中,Fragment的初始化数据通常不应该放在onAttach方法中。onAttach方法是在Fragment与其宿主Activity关联时调用的,用于建立Fragment与Activity之间的关联。这个方法主要用于执行与宿主Activity相关的操作,例如获取Activity的引用或初始化一些与Activity......
  • 使用LiveData、ViewModel在Activity和Fragment,Fragment和Fragment之间共享数据
    一、概述传统的Activity与Fragment之间共享数据,Fragment与Fragment之间共享数据,我一般会采用EventBus事件总线来实现。不过现在可以借助另外一种简单的方式LiveData+ViewModel也可以实现这种共享二、代码示例示例描述:要求FragmentA发送出数据,FragmentB和Activity都能接......
  • 传奇架设测试教程传奇角色进入游戏后黑屏如何解决
    点击传奇角色进入游戏后黑屏的问题,这个问题主要是端口不对应所造成的黑屏问题,下面我们来看看如何处理点击传奇角色后进入游戏黑屏的问题:首先我们要明确我们的传奇服务端配置器上的端口,重点的端口是7000端口,7000端口必须和你的传奇登录器上添加的游戏端口一致,其次是大家要注意......
  • 架设传奇私服进游戏不开门或进入黑屏解决方法
    进入游戏的时候屏幕变黑而无法正常进入游戏,相信不少人已经遇到这样的问题了.原因是因为你在启动服务器的时候输入IP错误或在关闭服务器的时候系统蓝屏.导致服务器记录IP的.TXT和.INI文件内的IP记录错误.由于可能是系统的漏洞,导致下次进入时即使输入正常IP而不能正确修改上面两中......