完美解决Android 4.1+版本 ViewPager.setPageTransformer()切换动画点击事件失效

在Android 4.1及更高版本中,使用ViewPager.setPageTransformer()可能导致子页面点击事件失效。这是因为隐藏的子页面在动画过程中消费了触摸事件。解决方案是自定义ViewPager子类,结合setPageTransformer(),在onPageScrolled()中手动调用动画。同时,需要重写onInterceptTouchEvent()和onTouchEvent()来避免滑动事件冲突,确保点击事件正常处理。
摘要由CSDN通过智能技术生成

资料参考http://blog.csdn.net/u012964944/article/details/51065133,谢谢大神提供灵感。

通过阅读源码发现,ViewPager.setPageTransformer()方法可以设置切换动画,但是如果ViewPager的子页中要处理触摸事件,如浏览图片时对图片放大缩小,FragmentStateAdpter中要处理item的点击事件,ViewPager切换子页后,不能处理触摸事件,或者触摸事件只有在切换后才响应,似乎子页里面的变的不可点击。尝试了很多中Google上的方法,包括修改setPageTransformer仍不能解决问题。

其实这个是android4.1+版本上的bug,在调用了setPageTransformer()方法后,切换子页后,当前最上面的View并不是眼睛所看的,而是另一个隐藏的子页,该隐藏的子页消费了触摸事件。尝试了把当前子页“放到最上面”,view.bringToFornt(),甚至把其他看不见的子页都设置为隐藏,otherView.setVisibility(View.GONE),当前子页仍然不能处理触摸事件。


最后查看了viewPager的源码,发现执行切换动画的代码在onPageScrolled()方法内:


  1. if(this.mPageTransformer != null) {  
  2.             scrollX = this.getScrollX();  
  3.             childCount = this.getChildCount();  
  4.   
  5.             for(i = 0; i < childCount; ++i) {  
  6.                 View var15 = this.getChildAt(i);  
  7.                 ViewPager.LayoutParams var16 = (ViewPager.LayoutParams)var15.getLayoutParams();  
  8.                 if(!var16.isDecor) {  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值