0

我的应用程序的主要活动在具有以下属性的 Android 清单文件中定义:

android:theme="@style/Theme.Translucent.NoTitleBar"

这使活动变得透明,从而可以通过操作主视图对象(例如,通过调用setVisibility(View.INVISIBLE)主视图)在代码中控制我的应用程序的透明度。这工作正常。

但是,这种方法的一个不良后果是,当应用程序启动时,在显示我的主视图之前没有可见的响应。通常,应用程序的主要活动的默认黑色背景在应用程序启动时立即可见,这提供了应用程序开始运行的即时确认,以响应用户在启动器中点击其图标。但是对于透明背景,用户会继续在启动应用程序的显示器上查看背景,直到显示主视图,因此它(在该间隔期间)看起来好像什么也没发生。

即使在性能一般的设备(例如,摩托罗拉 Droid)上,我的视图也会在大约一秒钟内出现,这还不错。然而,在一个非常慢的设备(例如,G1)上,它可能需要将近四秒钟。虽然这不是一场灾难,但我更喜欢立即响应,这样用户就不会怀疑应用程序是否真的被触发了。

我尝试删除透明主题,这会像往常一样通过黑色背景立即确认。但是,一旦应用程序初始化,我就无法在代码中将活动背景设置为透明。

我在第一次setTheme()调用之前调用了活动setContentView(),并传递给它一个透明的主题,但这不会使活动透明。

我也试过这个onCreate()(再次,就在调用之前setContentView()):

ColorDrawable transparentDrawable = new ColorDrawable(Color.TRANSPARENT);
getWindow().setBackgroundDrawable(transparentDrawable);

这似乎也没有效果。

我还尝试在我的清单中使用一个主题,该主题已android:windowBackground设置为一个主要是透明 PNG 的可绘制对象,但在透明背景上叠加了一些文本(例如,应用程序的名称),这将为用户提供一个提示:应用程序正在加载。不幸的是,当我将可绘制对象用作主题的一部分时,在初始化主视图之前,背景根本无法显示。

所有耗时的初始化都已经在一个工作线程中完成,所以我不是在寻找关于如何完成它的建议。视图本身只需要一定的时间来显示,虽然它相当快,但没有什么能比应用程序启动时看到主要活动背景的即时响应更好。

4

2 回答 2

1

即使在性能一般的设备(例如,摩托罗拉 Droid)上,我的视图也会在大约一秒钟内出现,这还不错。然而,在一个非常慢的设备(例如,G1)上,它可能需要将近四秒钟。

它应该在几毫秒内出现。确保您没有在主应用程序线程上做过多的工作。

视图本身只需要一定的时间来显示,虽然它相当快,但没有什么能比应用程序启动时看到主要活动背景的即时响应更好。

然后首先显示其他更便宜的东西(例如,ProgressBar),当它准备好时用你的常规 UI 替换它。

于 2012-04-10T15:30:18.897 回答
0

我赞成 CommonsWare 的回答,因为他为我指出了正确的方向,这与尝试在启动后更改主要活动的透明度相去甚远(我开始怀疑这是不容易做到的)。

但是,该建议本身并不能成为公认的答案,因为它只是指向正确方向的指针。

鉴于此指导,我决定的答案是创建一个启动画面。但是,我在任何地方都找不到真正好的 android splash 示例。所以,我设计了一个,它对我来说效果很好,完全解决了我的问题。

因为创建一个启动画面是一个比我开始的问题更普遍的问题,所以我已经将我的详细描述作为关于如何实现启动画面的问题的答案,并链接到该答案以下:

创建一个真正的闪屏

于 2012-04-18T03:28:24.160 回答