U8SDK技术博客:http://www.uustory.com,欢迎来坐坐。
百度传课已经停运,最新U8SDK视频教程已经转移至B站:U8SDK视频教程
很多SDK都明确要求在游戏启动的时候,显示一张含有渠道SDK Logo的一张全屏图片,大概需要显示2至3秒的时间。像UC,百度SDK是在自己的SDK里已经自带了闪屏的功能(一般是在SDK初始化的时候)。但是,还有很多其他渠道需要游戏在接入他们的SDK时,自己去实现这个闪屏功能。他们仅仅提供一张闪屏图片。
那么,在U8SDK中,我们如何去处理这个闪屏功能呢?因为U8SDK采用反编译动态打包方式,那么我们最好是选择在打渠道包的时候动态地将该渠道对应的闪屏添加到该渠道包中,同时,这套方案还必须能够适配多个渠道SDK。
那么,如何做到游戏启动的时候,先启动闪屏图片,显示两三秒再切换到游戏画面呢?我们的做法是定义一个SplashActivity。作为主启动Activity。这个Activity就是显示指定的闪屏图片,两三秒之后启动游戏的主Activity。
那么,现在要解决的是,因为我们不能再SplashActivity里写死,启动哪个游戏的Activity.因为,U8SDK是针对所有游戏的,每个游戏的启动Activity都不一样,所以,我们需要在打包的时候,动态地来从游戏母包的AndroidManifest.xml中来获取到游戏的启动activity。然后,将我们事先写好的SplashActivity写入到AndroidManifest.xml中,作为启动Activity。同时,在SplashActivity中,启动的游戏Activity,用一个特殊的标识符。这样,打包的时候,我们动态地将该特殊标识符替换为游戏的启动Activity。这样,就做到了将闪屏动态地添加到游戏中。
首先,我们看下,这个SplashActivity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
package
com.u8.sdk;
import
android.os.Bundle;
import
android.app.Activity;
import
android.content.Intent;
import
android.view.LayoutInflater;
import
android.view.animation.AlphaAnimation;
import
android.view.animation.Animation;
import
android.view.animation.Animation.AnimationListener;
import
android.widget.ImageView;
import
android.widget.RelativeLayout;
/***
* 闪屏界面
*
*/
public
class
SplashActivity
extends
Activity {
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
int
layoutID = getResources().getIdentifier(
"u8_splash"
,
"layout"
, getPackageName());
setContentView(layoutID);
this
.appendAnimation();
}
private
void
appendAnimation(){
AlphaAnimation ani =
new
AlphaAnimation(
0
.0f,
1
.0f);
ani.setRepeatMode(Animation.REVERSE);
ani.setRepeatCount(
0
);
ani.setDuration(
2000
);
//2s
ImageView image = (ImageView)findViewById(getResources().getIdentifier(
"u8_splash_img"
,
"id"
, getPackageName()));
if
(image ==
null
){
int
defaultID = getResources().getIdentifier(
"u8_splash_layout"
,
"id"
, getPackageName());
RelativeLayout layout = (RelativeLayout)LayoutInflater.from(
this
).inflate(defaultID,
null
);
image = (ImageView)layout.getChildAt(
0
);
}
image.setAnimation(ani);
ani.setAnimationListener(
new
AnimationListener() {
@Override
public
void
onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public
void
onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public
void
onAnimationEnd(Animation animation) {
SplashActivity.
this
.startGameActivity();
}
});
}
private
void
startGameActivity() {
try
{
Class<?> mainClass = Class.forName(
"{U8SDK_Game_Activity}"
);
Intent intent =
new
Intent(
this
, mainClass);
startActivity(intent);
finish();
return
;
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
|
在SplashActivity中,我们首先获取到u8_splash.xml这个layout文件,这个layout文件就是显示一张全屏的闪屏图片而已。然后我们定义一个渐变动画,淡入淡出地显示这张闪屏图片。最后,闪屏结束的时候,通过Class.forName来获取{U8SDK_Game_Activity}特殊符号指定的游戏主启动Activity。
这里,我们不能写死是启动哪个游戏的Activity。因为只有在打包的时候,我们才能从AndroidManifest.xml中解析中主启动Activity。然后在打包工具中将{U8SDK_Game_Activity}替换为游戏的启动Activity。这样就相当于做了一次移花接木的工作。
由于u8sdk是利用apktool反编译进行打包的。在apktool反编译之后,代码的格式是smali格式。所以,这里我们预先见SplashActivity反编译成smali格式,然后和u8_splash.xml一起放到打包工具的配置目录中,这样打包工具在打包的时候,从该目录中,将SplashActivity的smali文件喝需要的资源文件,合并到渠道包中。整个配置目录如下:
这里,smali目录下,就是SplashActivity的smali格式的代码。u8_splash.xml就是闪屏启动时的布局文件。
那么,channels目录下,是什么呢?channels目录下放的就是各个需要闪屏的SDK的闪屏图片。
在channels目录下,对应的渠道号目录下面,建立文件夹,文件夹格式为[横屏竖屏][填充颜色(黑/白)]。
分为以下几种
11 : 横屏白色
12 : 横屏黑色
21 : 竖屏白色
22 : 竖屏黑色
比如当乐渠道号为45,那么在channels/45/11目录下放上当乐横屏的闪屏图片,默认闪屏边缘使用白色填充
那么在channels/45/21目录下放上当乐竖屏的闪屏图片,默认闪屏边缘使用白色填充
再比如百度的渠道号为90,那么在channels/90/11目录下放上百度横屏的闪屏图片,默认闪屏边缘使用白色填充
那么在channels/90/21目录下放上百度竖屏的闪屏图片,默认闪屏边缘使用白色填充
这些目录下放上闪屏图片各个尺寸的图片。像这样:
1
2
3
4
5
6
7
8
|
<
channel
>
<
param
name
=
"id"
value
=
"45"
/>
<
param
name
=
"sdk"
value
=
"dl"
/>
<
param
name
=
"name"
value
=
"dl"
/>
<
param
name
=
"suffix"
value
=
".dl"
/>
<
param
name
=
"splash"
value
=
"11"
/>
<
param
name
=
"splash_copy_to_unity"
value
=
"0"
/>
</
channel
>
|
如果游戏是竖屏,那么久这样配置:
1
2
3
4
5
6
7
8
|
<
channel
>
<
param
name
=
"id"
value
=
"45"
/>
<
param
name
=
"sdk"
value
=
"dl"
/>
<
param
name
=
"name"
value
=
"dl"
/>
<
param
name
=
"suffix"
value
=
".dl"
/>
<
param
name
=
"splash"
value
=
"21"
/>
<
param
name
=
"splash_copy_to_unity"
value
=
"0"
/>
</
channel
>
|
如果游戏采用unity开发,unity启动的时候,有一个Unity自己的闪屏图片,对于需要闪屏的SDK来说,可以直接将闪屏的图片替换为Unity的闪屏图片,那么可以将splash_copy_to_unity设置为1就可以了。