`

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

 
阅读更多
之前项目中遇到打开Activity后黑屏的问题,网上找到解决办法是通过设置theme和style属性可以实现。

 

 

http://www.cnblogs.com/sunzn/p/3407078.html

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

<style name="AppTheme" parent="android:Theme.Light">

   </style>

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

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

   </style>

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

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

 

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

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

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

 

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

 

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

  • 为  Theme   置背景图        给人程序启动快的感觉,界面先显示背景图,然后再刷新其他界面控件,刷新不同步。
  • 为  Theme  设置透明属性     给人程序启动慢的感觉,界面会一次性刷出来,刷新同步。

但是问题有出现了,原先在配置了activity的切换动画效果,设置完android:windowIsTranslucent=true之后切换动画失效了。暂时我也不知道android系统的theme属性之间关系的错综复杂,继承来继承去的。。。为什么会出现这种问题,不过还好无意间找到了解决办法

<style name="AppTheme" parent="AppBaseTheme">

		<!-- <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">
		<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">
		<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">
        <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">

        <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">
        <item name="android:windowExitAnimation">@anim/slide_right_out</item>
    </style>

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

分享到:
评论

相关推荐

    Android界面切换出现短暂黑屏的解决方法

    这种问题一般是因为一个Activity启动之后在显示视图之间时间太长导致的。 1、优化方式可以通过精简layout文件、多线程处理数据载入等。 2、但是有些Activity的layout文件可能比较大,如果不能动态载入,在显示之前...

    Dragger-用ViewDragHelper实现的activity切换动画。.zip

    介绍:用ViewDragHelper实现的activity切换动画。运行效果:使用说明: 你可以将这个库当成view来用:将DraggerView添加到root layout,并且在里面加入两个layout。  android:layout_width="match_parent"  ...

    Android编程中activity启动时出现白屏、黑屏问题的解决方法

    本文实例讲述了Android编程中activity启动时出现白屏、黑屏问题的解决方法。分享给大家供大家参考,具体如下: 默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中...

    MyFileChooser.rar

    &lt;item name="android:windowIsTranslucent"&gt;true&lt;/item&gt;  &lt;item name="android:windowSoftInputMode"&gt;adjustNothing  &lt;item name="android:windowNoTitle"&gt;true&lt;/item&gt; &lt;/style&gt; -----------...

    滑动返回Activity(带阴影)

    和 Activity 的 theme 并无关系 不影响 activity 的生命周期 只需继承 BaseActivity isSupportSwipeBack 唯一 API 方法,简单实用 无需设置 &lt;item name="android:windowIsTranslucent"&gt;true 支持 Dialog 的滑动返回

    SwipBackLayoutLibrary

    android滑动返回效果,只能向左滑动、向右滑动、向下滑动返回 导入源码后需要拷入android-...3、在你的Activity的Theme中添加&lt;item name="android:windowIsTranslucent"&gt;true&lt;/item&gt; 相关事宜,源码跑下就知道了~

    可以滑动页面的项目

    Note: activity of manifest need to override the configured theme: android: windowIsTranslucent, otherwise slide open the background is black. &lt;style name="ActivityTheme" parent="Theme.AppCompat....

    Android 右滑返回资源

    使用方法:下载后解压,并在你的项目里导入module; 写一个 BaseActivity 继承 SwipeBackActivity: public class BaseActivity extends SwipeBackActivity {...&lt;item name="android:windowIsTranslucent"&gt;true&lt;/item&gt;

    AndroidSwipeBack滑动返回

    将app的主题设置加入 &lt;item name="android:windowIsTranslucent"&gt;true --这样主题就可以使透明的,不能用默认的主题;使用默认背景就是黑屏了,这个属性就是设置防止黑屏的。 关于阻止黑屏可查看:...

    swipeback-Android侧滑返回分析和实现(不高仿微信).zip

    SDK21及以上无需此属性 name="android:windowIsTranslucent"&gt;true&lt;/item&gt;Tips.2因状态栏透明,输入法的adjustPan模式不会生效,建议设置为adjustResizeTips.3因状态栏透明,布局会从屏幕顶端开始绘制,需自行调整...

    KugouLayout-.zip

    图片较大 加载会慢一些 耐心等待Demo Activity1Demo Activity2使用说明:Activity滑动返回&lt;!--设置主题属性--&gt; &lt;style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"&gt;   name=...

    Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法

    要原因是主体样式设置的问题:这里把appTheme设置一个style即可:  &lt;item name=android:windowBackground&gt;@color/white &lt;!--下面这个属性很重要,有时候会出现某些机型在调用系统相册的时候,短暂的出现手机...

    Activity透明/半透明效果的设置transparent(两种实现方法)

    ”android:windowBackground”&gt;@color/translucent_background&lt;/item&gt;&lt;item name=”android:windowIsTranslucent”&gt;true&lt;/item&gt;&lt;/style&gt; 在该文件夹下在创建文件colors.xml 代码如下:&lt;?xml version=“1.0″...

    SwipeBackLib依赖库

    该依赖库是用于Android开发中滑动返回使用,下载后,导入项目,...使用后,出现滑动时,背景为黑色,需要让该Activity的theme继承自自定义style,并在该style中添加&lt;item name="android:windowIsTranslucent"&gt;true即可

    Android 侧边滑动关闭Activity的示例代码

    1.设置Activity样式属性 &lt;style name=AppTheme parent=Theme.AppCompat.Light.NoActionBar&gt; &lt;item name=android:windowIsTranslucent&gt;true &lt;/style&gt; 2.自定义侧边阴影视图 class SlideBackView ...

Global site tag (gtag.js) - Google Analytics