[译]:Xamarin.Android用户界面——创建启动界面

标签: Xamarin.Android, 官方教程, 中文翻译

博客分类: 官方教程

返回索引目录
原文链接:Creating a Splash Screen
译文链接:Xamarin.Android用户界面——创建启动界面

创建启动界面

Android应用有时会需要花些时间才能启动完,尤其是在应用在设备上首次启动时。此时,启动屏幕就可以向用户显示启动进度,或者品牌信息。

概览

Android应用在启动时,需要耗费一些时间,特别是在设备上首次启动时(别名:冷启动)。启动屏幕可以向用户显示启动进度,或者显示品牌信息,并以此区分并推广应用。

本文将讨论在Android应用中实现启动屏幕的一种技术。其中主要包括以下几个步骤:

  1. 为启动屏幕创建drawable资源。
  2. 定义一个新的主题,并用其显示drawable资源
  3. 向应用中添加一个新的Activity(作为启动屏幕) —— 用于处理上一步中创建的主题。

环境要求

本文假设应用平台为:Android API level 15(Android 4.0.3)或更高。应用程序还必须为项目添加Xamarin.Android.Support.v4Xamarin.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

相关资源


译:奇葩史

没有评论