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目录下放上百度竖屏的闪屏图片,默认闪屏边缘使用白色填充

这些目录下放上闪屏图片各个尺寸的图片。像这样:

注意,所有目录里闪屏的图片名称必须为 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就可以了。

本文永久链接: http://www.uustory.com/?p=1483

更多文章欢迎访问小黑的博客:http://www.uustory.com

时间: 2024-07-30 03:42:26

U8SDK——统一闪屏解决方案的相关文章

WinForm Flicker闪屏解决方案

开发WinForm 程序时经常会遇到闪屏的问题,这会给用户造成很差的使用体验,所以必须妥善解决好这个问题. 首先,我们先要找出闪屏的原因,就我目前遇到的问题而言,其原因真是五花八门. 主要的原因有:使用了很多的组件导致加载缓慢,使用了性能差的组件(PictureBox.Button等). 所以,不论开发者的水平如何,微软给我们也挖了坑的. 对于控件太多造成的闪屏,其原因有两个: 1. 绘制控件时,Windows 会给控件发送两个消息.第一个是WM_ERASEBKGND消息,它会触发OnPaint

windows(10)用kms激活后,explorer导致花屏闪屏现象的解决方案

最近win10许可证过期了,想再激活一遍,去掉右下角那个烦人的水印 类似这样:(水印图片来源) 每次撸啊撸的时候都会挡在小地图上面,导致我从黄金五掉到了白银一 这一定是微软的责任(在这里我强烈谴责微软)所以我决定用kms激活,然后悲剧就发生了. 屏幕一闪一闪的,像挂在天空的小星星,鼠标键盘能起作用,但是起作用以后半秒左右会闪屏,导致原有的操作全部无效. 类似于这样:(有股无良国产游戏广告的味道) 视频中的那位仁兄似乎回滚了..但是因为我有着坚韧不拔(懒得重装)的意志,所以我先尝试了一下以下几个步

直播疑难杂症排查(7)— 黑屏、花屏、闪屏问题

本文是 <直播疑难杂症排查>系列的第七篇文章,我们来重点看看直播中常见的各种黑屏.花屏.闪屏问题. 首先我们要明白,黑屏.花屏.闪屏等问题,可能是推流端的问题,也可能是播放器的问题,遇到这些现象,我们要第一时间用别的播放器(如 VLC,ffplay)试试,如果都出现同样的问题,那么多半是流本身的问题了,反之,则很可能是播放器的问题. 1.  播放黑屏 现象:画面是黑的,没有图像,但是有声音. 1.1 主播端摄像头权限问题 无论 Android 还是 iOS,App 使用摄像头都是需要申请授权的

关于VC画图闪屏的问题 - VC/MFC / 基础类

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题. 而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案. MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单, 只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序. 我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈 我的一些观点. 1.显示的图形为什么会闪烁? 我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏 幕显示时是由OnPaint进行调用的.当窗口

[android]切换activity闪屏问题

游戏登陆切换activity时,总是出现闪屏现象,解决方案,暂停线程100毫秒调用startActivity,闪屏解决,代码: @Override public void startActivity(final Intent intent) { new Thread() { @SuppressWarnings("static-access") public void run() { try { Thread.currentThread().sleep(100); } catch (In

win32 窗口缩放时出现闪屏

今天无意发现之前写的一个小工具在缩放窗口的时候,出现闪屏,主要有两个位置: 工具栏出一闪屏 右侧的控制面板出现闪屏 (这个控制面板与多层元件组合而成) 之前真没注意到这个问题,平时都是最大化/恢复窗口,没缩放窗口,所以没发现这样的问题. 网上搜索了一下,找到一些解决方案: [百度文库] VC窗口闪烁问题的解决 - http://wenku.baidu.com/view/3c7e747931b765ce0508146a.html 我遇到的问题属于第2种情况: 原因二:  复杂的界面有多层窗口组成,

【iOS开发】解决“点击MPMoviePlayerController播放视频时,出现一个黑屏闪屏问题”

当点击某按钮播放视频时,如果在按钮触发函数时alloc MPMoviePlayerController对象,同时加载资源文件,因为加载资源文件也需要时间,这时会有一个短暂的黑色闪屏,这点体验很不好,有一个好的解决方案是,提前alloc预加载好该MoviePlayer对象,点击按钮时直接调用play. 预加载相关代码: //预加载视频,避免出现黑屏 NSString *videoPath=[[NSBundle mainBundle]pathForResource:@"startVideo"

双缓冲解决控制台应用程序输出“闪屏”(C/C++,Windows)

使用 C 语言编写游戏的小伙伴们想必起初都要遇到这样的问题,在不断清屏输出数据的过程中,控制台中的输出内容会不断地闪屏.出现这个问题的原因是程序对数据处理花掉的时间影响到了数据显示,或许你可以使用局部覆盖更新方法(减少更新数据量)来缓解闪屏,但是这种方法并不适用于所有场合,尤其是更新数据本身就非常大的场合. 本文将讲述解决控制台应用程序输出闪屏的终级解决方法——双缓冲. 问题呈现 下面的代码演示了在高速不断清屏输出数据的过程的闪屏问题,特邀您一试: 1 2 3 4 5 6 7 8 9 10 11

React Router 按需加载+服务器渲染的闪屏问题

伴随着React协议的『妥协』(v16采用MIT),React为项目的主体,这个在短期内是不会改变的了,在平时使用过程中发现了如下这个问题: 在服务器渲染的时候,刷新页面会出现闪屏的现象(白屏一闪而过) 作为努力最求极致的我,是不能容忍的,而这一现象是半道出现的,也就是在添加按需加载之后.要说清楚这个问题,得从React的服务器渲染开始说起,(急于寻求问题解决方案的,可以直接去文章后半部分) 服务器渲染(SSR)基础原理 React的虚拟DOM是其可被用于服务端渲染的关键.其原理简单的来说就是首