安卓 基于viewpager的横幅广告,如何在播放过程中切换动画效果

        这可能是第一篇教你如何动态设置横幅广告的文章

        最近这几天,领导让给app的广告栏位加个动效,每切一张广告图,就换一次动画效果,我寻思这还不好整? 网上随便找个广告播放控件,然后再稍微改改,监听一下切换到最新page的事件,然后再重新设置下当前的动画效果,不就完结了吗?

        说干就干,之前用过banner,感觉可以,那就用它吧,于是下下来,两三行代码就整完了

        var list1 = arrayListOf<DataBean>(
            DataBean(R.mipmap.adv1,"",0),
            DataBean(R.mipmap.adv2,"",0),
            DataBean(R.mipmap.adv3,"",0)
        )

        activity_adv_02_banner.apply {
            addBannerLifecycleObserver(this@adv02Activity)
                .setIndicator(RoundLinesIndicator(this@adv02Activity))
                .setLoopTime(3000)
                .isAutoLoop(true)
                .setAdapter(ImageAdapter(list1))
        }

        好,接下来就是往里面添加监听了,banner设置监听 

addOnPageChangeListener

        这个接口就行, 可以在 

onPageSelected
onPageScrollStateChanged

        这两个方法里面做处理 

        前者的话 就像这样, 安卓 基于viewpager的横幅广告,如何在播放过程中切换动画效果获得下标后,再对banner设置随机动画效果。

        后者的话 需要对state = 0的情况做判断处理 也就是界面显示完全 并且动画也已经结束的情况下

        这个时候,有的朋友也许回想 这么简单的东西也值得发个帖子么?请继续往下看

        然后我们开始测试,你会惊讶的发现,切换一段时间后,图片显示全都不对,要不然大小不正确,要不然缩放又问题,又或者是透明度不对,总之一句话 一定是哪里出问题了


        接来下开始分析问题,一开始我猜测,问题出现的原因可能是由于

state == SCROLL_STATE_IDLE

也就是完全显示 并且动画显示完毕的这个状态不正确,导致动画效果没有显示完毕,又重新设置了新的动画效果,导致代码执行到新的 

PageTransformer

的实现类的  transformPage() 这个方法导致的,这么一想 好像确实有点道理, 那么接下来就来验证下,我给所有的 PageTransformer 打了TAG 然后再看看打印效果

安卓 基于viewpager的横幅广告,如何在播放过程中切换动画效果

可以看到 状态没有任何问题,它的确是等待动画全部执行完毕 才触发的 SCROLL_STATE_IDLE 

我们的猜想错了

        那问题到底出在哪里呢?有聪明的盆友一定想到了 出在这些view上面,就是因为在某个动画效果的实现上面 view对象被添加了 位移 旋转 缩放 透明度 中的某一个 或 多个属性 导致在设置新动效的时候 重叠了 所以会出现切花动效的时候, 看起来会非常非常怪的问题

        那么知道问题所在 修改起来也简单了, 我们切换时向左滑的,也就是只需要考虑 transformPage(@NonNull View view, float position) 方法 position值在 [-1, 1]的情况 只需要对当前动效不涉及的其他效果做恢复处理 就ok了,我修改后尝试了下,果然印证了我的判断。

        至此 这个问题就解决了,因为修改完毕测试也是件麻烦事,所以我把修改完毕的效果文件打包上来,有需要的朋友可以自取 

百度网盘:https://pan.baidu.com/s/112Y-xN-2mOWeBv5kelutPg 提取码: xm0d

上一篇:项目ITP(三) 玩玩 服务端 到 app端


下一篇:Hibernate 新增和更新 标准写法