对于每个目标平台而言(本章只讲述Android),启动类必须实现。这个类实现一个后端特定的应用接口,ApplicationListener实现应用逻辑。启动类对平台有一定的依赖性,接下来我们看看怎样实例化和配置android的后端。
本章假设你已经根据第四章(1)的内容配置好android项目。
Android应用不使用main()方法作为入口,而是通过一个Activity。打开my-gdx-game-android项目中的MainActivity.java类:
package com.me.mygdxgame; import android.os.Bundle; importcom.badlogic.gdx.backends.android.AndroidApplication; importcom.badlogic.gdx.backends.android.AndroidApplicationConfiguration; public class MainActivity extendsAndroidApplication { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidApplicationConfiguration cfg = newAndroidApplicationConfiguration(); cfg.useGL20 = false; initialize(new MyGdxGame(), cfg); } }
主入口方法是Activity的OnCreate()方法。注意MainActivity继承自AndroidApplication,AndroidApplication继承自Activity。一旦配置好,AndroidApplication.initialize()就会被调用,传递到ApplicationListener(MyGdxGame)。
Android可以有多个Activity。Libgdx游戏通常只有一个Activity组成。游戏的不同的屏幕在libgdx中实现,而不是分成多个Activity。这样做的原因是创建一个新的Activity同样需要创建一个新的OpenGL 环境,也就意味着所有的图像资源被重新加载。
AndroidManifest.xml文件
除了AndroidApplicationConfiguration,Android应用也通过AndroidManifest.xml进行配置,可以在Android项目的根目录下找到这个文件:
<?xml version="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.me.mygdxgame" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="5"android:targetSdkVersion="17" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> <intent-filter> <actionandroid:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
目标SDk版本
这是至关重要的,如果希望自己的应用运行在Android1.5以上的版本targetSdkVersion的值最小为6.如果这个值没有设置,应用将运行在传统模式。实际绘图区将小于屏幕实际分辨率,很难看。
屏幕方向和配置更改
除了targetSdkVersion,screenOrientation和 configChanges属性也需要也需要设置。
screenOrientation属性指明应用的方向。一旦省略这个属性,应用将可以同时在横屏或竖屏中运行。
configChanges属性至关重要,省略这个属性意味着每次键盘点击或方向变化时,应用将重新启动。如果省略screenOrientation,一个libgdx将获得一个ApplicationListener.resize()指示方向变化。可以根据情况布局你的应用。
权限
如果应用需要写入SD卡,需要上网,需要保持屏幕唤醒或者记录音频等,必须在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permissionandroid:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
用户经常怀疑这些权限的用处,所以要明智的进行选择。
对于工作后锁定,设置相应的AndroidApplicationConfiguration.useWakeLock为true。
如果一个游戏不需要加速度计和罗盘访问,通过设置AndroidApplicationConfiguration 中的useAccelerometer和useCompass设置为false。
LiveWallpapers
Libgdx可以通过较为简单的方式创建基于Android的LiveWallpapers。一个livewallpaper的启动类称为AndroidLiveWallpaperService,以下是示例:
package com.mypackage; // imports snipped for brevity public class LiveWallpaper extendsAndroidLiveWallpaperService { @Override public ApplicationListener createListener () { return newMyApplicationListener(); } @Override public AndroidApplicationConfiguration createConfig () { return newAndroidApplicationConfiguration(); } @Override public void offsetChange (ApplicationListener listener, float xOffset,float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, intyPixelOffset) { Gdx.app.log("LiveWallpaper", "offset changed: " +xOffset + ", " + yOffset); } }
createListener() 和createConfig()方法将在livepaper在主屏幕上创建时调用。
offsetChange()方法将被渲染线程调用,所以你不需要更改。
除了启动类,你也需要创建一个XML文件描述你的Wallpaper。我们可以定义它的名字为livewallpaper.xml。在你的res文件夹下创建一个xml文件夹,将文件放入其中。
<?xml version="1.0"encoding="UTF-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail="@drawable/ic_launcher" android:description="@string/description" android:settingsActivity="com.mypackage.LivewallpaperSettings"/>
这里定义一个thumbnail显示你的LWP中,当用户点击LWP中Setting时将显示一个Activity或者描述。通过Activity改变背景颜色,你也可以存储到SharedPreferences,将它们之后通过Gdx.app.getPreferences()载入到LWP中。
最后,你需要添加一些东西到AndroidManifest.xml中,以下是一个简单的示例:
<?xml version="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.mypackage" android:versionCode="1" android:versionName="1.0" android:installLocation="preferExternal"> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14"/> <uses-featureandroid:name="android.software.live_wallpaper" /> <application android:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".LivewallpaperSettings" android:label="Livewallpaper Settings"/> <serviceandroid:name=".LiveWallpaper" android:label="@string/app_name" android:icon="@drawable/icon" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <actionandroid:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/livewallpaper" /> </service> </application> </manifest>
Daydream
从Android4.2开始,用户可以设置Daydreams,会在设备闲置或停靠时显示。这些daydream类似屏保或者显示相册之类的东西。Libgdx可以让你轻松的编写Daydream.
Daydream的启动类为AndroidDaydream,以下是示例:
packagecom.badlogic.gdx.tests.android; importandroid.annotation.TargetApi; importandroid.util.Log; importcom.badlogic.gdx.ApplicationListener; importcom.badlogic.gdx.backends.android.AndroidApplicationConfiguration; importcom.badlogic.gdx.backends.android.AndroidDaydream; importcom.badlogic.gdx.tests.MeshShaderTest; @TargetApi(17) publicclass Daydream extends AndroidDaydream { @Override public void onAttachedToWindow(){ super.onAttachedToWindow(); setInteractive(false); AndroidApplicationConfiguration cfg = newAndroidApplicationConfiguration(); cfg.useGL20 = true; ApplicationListener app = newMeshShaderTest(); initialize(app, cfg); } }
简单的继承了AndroidDaydream,重写了onAttachedToWindow,设置你的配置和ApplicationListener并初始化你的daydream。
处理daydream本身你可以提供一个Activity来设置daydream。这可以是一个普通的Activity,或者一个libgdx的AndroidApplication(继承自Activity)。一个空的Activity作为例子:
packagecom.badlogic.gdx.tests.android; importandroid.app.Activity; publicclass DaydreamSettings extends Activity { }
这个Activity必须指明到daydream服务的元数据。在res/xml下创建xml文件,如下:
<dreamxmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.badlogic.gdx.tests.android/.DaydreamSettings"/>
最后,在AndroidManifest.xml中添加Activity的信息,一个daydream的服务描述。如下:
<serviceandroid:name=".Daydream" android:label="@string/app_name" android:icon="@drawable/icon" android:exported="true"> <intent-filter> <action android:name="android.service.dreams.DreamService"/> <categoryandroid:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-dataandroid:name="android.service.dream" android:resource="@xml/daydream" /> </service>