U8SDK——统一闪屏解决方案

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文件喝需要的资源文件,合并到渠道包中。整个配置目录如下:
 
splash_demo
这里,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目录下放上百度竖屏的闪屏图片,默认闪屏边缘使用白色填充
这些目录下放上闪屏图片各个尺寸的图片。像这样:
 
splash_demo2

注意,所有目录里闪屏的图片名称必须为 u8_splash.png

最后,对于需要闪屏的渠道SDK,在sdks目录下的config.xml中配置的时候,比如,当乐,如果游戏是横屏,那么就这样配置:
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就可以了。
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值