赞 | 65 |
VIP | 231 |
好人卡 | 2 |
积分 | 19 |
经验 | 35171 |
最后登录 | 2024-9-15 |
在线时间 | 1554 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1912
- 在线时间
- 1554 小时
- 注册时间
- 2013-4-13
- 帖子
- 917
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
打算不用任何打包工具从头搞定安卓端移植
官方打包工具Crosswalk已经不再维护
所以我们使用安卓自带的Webview作为浏览器底层
目测很多国产手机定制的Webview版本较低
为了支持更多JS特性(包括WebGl)
需要从酷安等第三方商城安装高版本的Webview
我把我的2000元辣鸡Vivo Y79升级到了70版本
之前我是55版本, 虽然支持大部分比如箭头函数, class关键字, static关键字, getter/setter等特性
但是不支持...运算符, 所以如果要支持更广泛的设备的话还是不要使用解构运算符比较好
(不太清楚为啥国内系统不升级WebView...)
然后是下载安卓的开发工具Android Studio和SDK
选择一个5.1以上的版本的SDK(我选择了7.1版本)
创建一个新的工程, 选择 Empty Activity 就行
语言选择Kotlin就可以
然后Android Studio会自动帮你初始化, 不用管它
我们首先要把浏览器加入到视图当中
我们在左侧选择res/layout/activity_main.xml
修改布局文件, 我们删除了所有没用的东西,
添加了一个WebView进去, 并设置了它的大小和id
- <?xml version="1.0" encoding="utf-8"?>
- <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity">
- <WebView
- android:id="@+id/webView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
- </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
然后修改一下manifests\AndroidManifest.xml 文件
android:configChanges="orientation|screenSize"
android:screenOrientation="landscape"
就是在activity里增加强制横屏和切换不刷新的设定
这个是为了解除切出应用导致WebView重加在的问题
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.myapplication">
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:roundIcon="@mipmap/ic_launcher_round"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".MainActivity"
- android:configChanges="orientation|screenSize"
- android:screenOrientation="landscape">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
复制代码
下一步在工程浏览器里选择app, 右键new->Folder->AssetsFolder创建一个assets文件夹
用来存放我们的RM工程
右键新建的assets文件夹, 选择Show in Explorer就能进入该文件夹下
你可以把你部署打包后的网页版放在这里, index.html应该在assets文件夹下
接下来我们来写主Activity的逻辑, 选择MainActivity.kt
首先我们先在onCreate方法里继续添加代码
这段代码初始化了我们的应用的UI效果
比如隐藏导航栏, 状态栏, 全屏等等
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- window.decorView.systemUiVisibility =
- (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
- or View.SYSTEM_UI_FLAG_FULLSCREEN
- or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
- window.navigationBarColor = Color.TRANSPARENT;
- window.statusBarColor = Color.TRANSPARENT;
- supportActionBar?.hide();
- }
复制代码
如果出现提示缺少导入的包按下Alt+Enter就可以自动导入啦
然后下一步我们要让webView加载我们的html文件, 继续写onCreate方法
我们先选取id为webView的WebView组件并设置它的属性
我们允许JS运行, 这样会有安全警告, 但是我们不添加联网权限就可以了
允许使用网页版的存储, 这个可以让我们在手机端上存档读档
允许以url的方式读取文件, 这个可以解决本地资源文件读取的问题
最后让游戏跳转到index.html
- override fun onCreate(savedInstanceState: Bundle?) {
- ....
- val webView: WebView = findViewById(R.id.webView)
- val webSettings = webView.settings
- webView.webViewClient = WebViewClient()
- webSettings.javaScriptEnabled = true
- webSettings.domStorageEnabled = true
- webSettings.allowFileAccessFromFileURLs = true
- webView.loadUrl("file:///android_asset/index.html")
- }
复制代码
其实到这里功能已经差不多了, 不过还有几个可以改进的地方
在mainActivity下面重写一下几个类
如果我们按下了返回按钮, 就会导致网页后退, 所以我们要把它禁用
还有如果锁屏状态下, WebView会继续运行, 会导致播放声音
我们需要运行一段js代码来将bgm在暂停的时候停止, 在恢复的时候恢复
- override fun onResume() {
- super.onResume()
- val webView: WebView = findViewById(R.id.webView)
- webView.evaluateJavascript(
- "AudioManager.onResume()",
- null
- )
- }
- override fun onSaveInstanceState(bundle: Bundle) {
- super.onSaveInstanceState(bundle)
- val webView: WebView = findViewById(R.id.webView)
- webView.evaluateJavascript(
- "AudioManager.onPaused()",
- null
- )
- }
- override fun onBackPressed() {}
复制代码
在我们的工程里rpg_managers里添加两段js代码
这个只是随意添加的, 可以写成插件或者在初始化的时候由安卓端注入代码
- AudioManager.onPaused = function() {
- this._pausedBgm = AudioManager.saveBgm()
- this.stopBgm()
- };
- AudioManager.onResume = function() {
- AudioManager.replayBgm(this._pausedBgm);
- };
复制代码
这样这个问题算是勉强解决了,
不过注意安卓系统会自动管理手机内存, 清除不活跃的应用
如果锁屏一段时间, 应用就会被销毁, 未保存的记录也就丢失啦
接下来就是测试, 手机(需要开启开发者权限)连接到电脑上, 然后选择Run就可以了~
以上就是安卓移植踩坑的, 欢迎大家交流心得 |
评分
-
查看全部评分
|