zhpanvip / BannerViewPager

🚀 An awesome banner view for Android,Based on ViewPager2. 这可能是全网最好用的ViewPager轮播图。简单、高效,一行代码实现循环轮播,一屏三页任意变,指示器样式任你挑。
Apache License 2.0
3.57k stars 434 forks source link

能否提供获取原postion(未修正过)的方法 #272

Closed twirain closed 2 years ago

twirain commented 2 years ago

场景是这样的,我们有一个一屏三页的效果,中间的彩色显示,两边黑白显示,当banner滑动时,我需要改变中间banner的颜色显示。因为ViewPager#OnPageCallback获取的position是被修正过的,导致我无法去刷新中间的banner,现在我是通过反射来去处理的:

val originCb = ReflectUtils.reflect(binding.bannerSkin).field("mOnPageChangeCallback")
            .get<ViewPager2.OnPageChangeCallback>()
val vp = ReflectUtils.reflect(binding.bannerSkin).field("mViewPager").get<ViewPager2>()
vp.unregisterOnPageChangeCallback(originCb)
val callback = object : ViewPager2.OnPageChangeCallback() {
    override fun onPageScrolled(
        position: Int,
        positionOffset: Float,
        positionOffsetPixels: Int
    ) {
        originCb.onPageScrolled(position, positionOffset, positionOffsetPixels)
    }

    override fun onPageSelected(position: Int) {
        originCb.onPageSelected(position)
        binding.bannerSkin.adapter.notifyItemChanged(position)
    }

    override fun onPageScrollStateChanged(state: Int) {
        originCb.onPageScrollStateChanged(state)
    }
}
vp.registerOnPageChangeCallback(callback)

我也看到了类似的需求在issues47中提及