这可能是第一篇教你如何动态设置横幅广告的文章
最近这几天,领导让给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
这两个方法里面做处理
前者的话 就像这样, 获得下标后,再对banner设置随机动画效果。
后者的话 需要对state = 0的情况做判断处理 也就是界面显示完全 并且动画也已经结束的情况下
这个时候,有的朋友也许回想 这么简单的东西也值得发个帖子么?请继续往下看
然后我们开始测试,你会惊讶的发现,切换一段时间后,图片显示全都不对,要不然大小不正确,要不然缩放又问题,又或者是透明度不对,总之一句话 一定是哪里出问题了
接来下开始分析问题,一开始我猜测,问题出现的原因可能是由于
state == SCROLL_STATE_IDLE
也就是完全显示 并且动画显示完毕的这个状态不正确,导致动画效果没有显示完毕,又重新设置了新的动画效果,导致代码执行到新的
PageTransformer
的实现类的 transformPage() 这个方法导致的,这么一想 好像确实有点道理, 那么接下来就来验证下,我给所有的 PageTransformer 打了TAG 然后再看看打印效果
可以看到 状态没有任何问题,它的确是等待动画全部执行完毕 才触发的 SCROLL_STATE_IDLE
我们的猜想错了
那问题到底出在哪里呢?有聪明的盆友一定想到了 出在这些view上面,就是因为在某个动画效果的实现上面 view对象被添加了 位移 旋转 缩放 透明度 中的某一个 或 多个属性 导致在设置新动效的时候 重叠了 所以会出现切花动效的时候, 看起来会非常非常怪的问题
那么知道问题所在 修改起来也简单了, 我们切换时向左滑的,也就是只需要考虑 transformPage(@NonNull View view, float position) 方法 position值在 [-1, 1]的情况 只需要对当前动效不涉及的其他效果做恢复处理 就ok了,我修改后尝试了下,果然印证了我的判断。
至此 这个问题就解决了,因为修改完毕测试也是件麻烦事,所以我把修改完毕的效果文件打包上来,有需要的朋友可以自取
百度网盘:https://pan.baidu.com/s/112Y-xN-2mOWeBv5kelutPg 提取码: xm0d