一行代码解决闪屏页(广告页) - Android 篇

闪屏页或者广告页 (SplashView) 在众多 App 里是比较常见的。一般来说 SplashView 有以下职责:

  • 在合适的时机显示 SplashView - 可控性
  • 下载、缓存、更新图片
  • 回调响应图片点击事件
  • 倒计时 Dismiss View,主动跳过 Dissmiss View
  • 本地没有缓存时,显示默认图片或者不显示 SplashView

好了,先看看效果:

Default SplashView Demo
Normal SplashView Demo

在 Activity 上显示 SplashView, 需要注意的是要在 Activity setContentView(int viewId) 之后调用:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        // call after setContentView(R.layout.activity_sample);
        SplashView.simpleShowSplashView(this);
}

也可以自定义超时时间、默认图片、回调方法等:

/**
     * static method, show splashView on above of the activity
     * you should called after setContentView()
     * @param activity  activity instance
     * @param durationTime  time to countDown
     * @param defaultBitmapRes  if there's no cached bitmap, show this default bitmap;
     *                          if null == defaultBitmapRes, then will not show the splashView
     * @param listener  splash view listener contains onImageClick and onDismiss
     */
SplashView.showSplashView(this, 3, R.drawable.default_img, new SplashView.OnSplashViewActionListener() {
            @Override
            public void onSplashImageClick(String actionUrl) {
                Log.d("SplashView", "img clicked. actionUrl: " + actionUrl);
                Toast.makeText(SampleActivity.this, "img clicked.", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onSplashViewDismiss(boolean initiativeDismiss) {
                Log.d("SplashView", "dismissed, initiativeDismiss: " + initiativeDismiss);
            }
        });

更新 SplashView 数据方法 updateSplashData 可以在任何时候任何地方调用:

// call this method anywhere to update splash view data
SplashView.updateSplashData(this, "http://ww2.sinaimg.cn/large/72f96cbagw1f5mxjtl6htj20g00sg0vn.jpg", "http://jkyeo.com");

说说原理,其实很简单。如图选中 FrameLayout 下唯一的 ChildView 是我们自定义的通过 setContentView 设置的 View。那么我们只需要讲 SplashView 作为这个 FrameLayout 的 ChildView 覆盖在最上层即可。合适的时候 remove 实现 Dismiss。

View Hierarchy

核心代码:

ViewGroup contentView = (ViewGroup) activity.getWindow().getDecorView().findViewById(android.R.id.content);
...
contentView.addView(splashView, param);

剩下的就是处理缓存、定时器、Dismiss 动画、显示隐藏状态栏,ActionBar 的问题了。

对应 iOS(Swift) 版本在这里: SplashView-一行代码解决闪屏页-广告页-iOS-Swift-篇

完整示例代码参见: https://github.com/jkyeo/Android-SplashView

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,481评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,251评论 4 61
  • 我知道,初恋,总是能带给人甜蜜感,但是,每种东西都是矛盾存在的,既然有甜,那么就会有苦。无可否认,初恋...
    double_小姐阅读 400评论 0 3
  • 那是刚当上大学生的第一年。从县里头到大城市,什么都觉得新奇。进校门又认识了几个和自己一样的女孩子。自然话就多,怀着...
    幻梦幻醒阅读 521评论 0 0