[译]:Xamarin.Android用户界面——创建启动界面
博客分类: 官方教程
返回索引目录
原文链接:Creating a Splash Screen
译文链接:Xamarin.Android用户界面——创建启动界面
创建启动界面
Android应用有时会需要花些时间才能启动完,尤其是在应用在设备上首次启动时。此时,启动屏幕就可以向用户显示启动进度,或者品牌信息。
概览
Android应用在启动时,需要耗费一些时间,特别是在设备上首次启动时(别名:冷启动)。启动屏幕可以向用户显示启动进度,或者显示品牌信息,并以此区分并推广应用。
本文将讨论在Android应用中实现启动屏幕的一种技术。其中主要包括以下几个步骤:
- 为启动屏幕创建drawable资源。
- 定义一个新的主题,并用其显示drawable资源
- 向应用中添加一个新的Activity(作为启动屏幕) —— 用于处理上一步中创建的主题。
环境要求
本文假设应用平台为:Android API level 15(Android 4.0.3)或更高。应用程序还必须为项目添加Xamarin.Android.Support.v4和Xamarin.Android.Support.v7.AppCompat引用 —— 可以通过NuGet添加。
本文所有代码和XML均可以在SplashScreen示例项目中找到 —— 项目地址见文末。
注意[很重要],由于用到以上两个引用,其生成期间需要连接google,故在此:生成时需要开 代理 下载引用相关内容。 —— 版本没改变的情况下,只需第一次开代理下。
关于离线处理见:关于使用到Xamarin.Android.Support相关dll无法生成问题解决。
实现启动屏幕
渲染和展示启动屏幕最快的方法是创建自定义的主题,并将其应用到Activity,以此显示启动屏幕。当渲染Activity时,它会加载主题,并将drawable资源(由主题引用)作为activity的背景。使用这种方法,可以不必创建布局文件。
启动屏幕是以一个Activity来实现,它可以显示品牌drawable,执行任意初始化和启动任何任务。一旦应用启动完成后,启动屏幕会启动主Activity,然后将自己从应用栈里移除。
为启动屏幕创建Drawable资源
启动屏幕会在启动屏幕的Activity的背景中显示一个XML的绘图。显示的图像必须使用位图图像(如PNG或JPG)。
在本文中,我们使用Layer List来将应用中的启动屏幕图片居中。以下代码段为使用Layer List处理drawable资源的示例:
关于Layer List见:图层列表 —— Google Android资源,墙外
说明:需要在drawable中创建名为splash_screen.xml的文件,内容为下面示例。—— 官网未明确说明
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="@color/splash_background"/>
</item>
<item>
<bitmap
android:src="@drawable/splash"
android:tileMode="disabled"
android:gravity="center"/>
</item>
</layer-list>
此layer-list
将使用由@color/splash_background
指定的资源来作为背景,并将启动屏幕图片splash.png居中放置。
关于上述用到的color资源,需要添加相关的文件,具体可以参考文末示例。
创建好启动屏幕的drawable后,下一步就是创建启动屏幕的主题了。
实现主题
要为启动屏幕Activity创建自定义主题,首先编辑(或添加)values/styles.xml文件,并为启动屏幕创建一个新的style
元素。下面为一个values/style.xml的示例文件,其中包含了一个名为MyTheme.Splash的样式:
<resources>
<style name="MyTheme.Base" parent="Theme.AppCompat.Light">
</style>
<style name="MyTheme" parent="MyTheme.Base">
</style>
<style name="MyTheme.Splash" parent ="Theme.AppCompat.Light">
<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
MyTheme.Splash非常简单 —— 它只声明了窗口背景和不显示标题栏。如果你创建的启动屏幕是用于在activity填充完第一个布局之前来模拟应用界面的,你可以在style定义中,使用windowContentOverlay
来替代windowBackground
。在这种情况下,你必须同时修改splash_screen.xml文件,以便于它模拟显示你的界面。
创建启动Activity
现在,我们需要一个新的Activity来启动含有我们的启动图片的启动屏幕,并执行任何的启动任务。以下代码是完整的启动屏幕实现示例:
[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : AppCompatActivity
{
static readonly string TAG = "X:" + typeof(SplashActivity).Name;
public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
{
base.OnCreate(savedInstanceState, persistentState);
Log.Debug(TAG, "SplashActivity.OnCreate");
}
protected override void OnResume()
{
base.OnResume();
Task startupWork = new Task(() => {
Log.Debug(TAG, "Performing some startup work that takes a bit of time.");
Task.Delay(5000); // Simulate a bit of startup work.
Log.Debug(TAG, "Working in the background - important stuff.");
});
startupWork.ContinueWith(t => {
Log.Debug(TAG, "Work is finished - start Activity1.");
StartActivity(new Intent(Application.Context, typeof(Activity1)));
}, TaskScheduler.FromCurrentSynchronizationContext());
startupWork.Start();
}
}
此Activity被设置为应用程序的启动Activity。它指定了我们使用上一节创建的主题来覆盖应用的默认主题。其中NoHistory=true
属性的设置是重要的,这以便于从栈中删除此活动。当我们在主题声明中将drawable作为背景时,不需要再OnCreate中加载布局。
启动工作将会在OnResume中异步执行。这是必要的,以此保证启动工作不会减慢或延迟启动屏幕的外观。当工作完成后,SplashActivity
会启动Activity
,然后用户就可以与应用进行交互了。
最后一步就是修改Activity.cs
文件,移除其MainLauncher
特性:
[Activity(Label = "@string/ApplicationName")]
public class Activity1 : AppCompatActivity
{
// Code omitted for brevity
}
总结
本指南讨论了在Xamarin.Android应用程序中实现启动屏幕的一种方法 —— 将自定义主题应用于启动Activity
相关资源
- 官方示例地址:SplashScreen
- 个人练习示例地址:SplashScreen
译:奇葩史