ViewPager 设置滑动翻页距离(亲测有效!)

前言:老板说,android项目的这个viewpager不灵敏,需要滑动较长的距离才可以翻页。要求缩短滑动距离,实现较短距离翻页。

这个东西,确实不好弄,网上查了很多资料,试验了很多方法,直到下面转载的文章,解决了我的问题。注意,要修改viewpager的源码,也就是说,要把Viewpager源码copy到项目,进行修改。(包括PageAdapter的源码也要copy)。

亲测,有效!!

转自:http://blog.csdn.net/focuman/article/details/37528039

之前使用ViewPager,从来没有遇到过什么大的问题,用的都挺好的。最近在公司的新一代产品(硬件产品,分辨率2560*1440),针对高分辨率以及横屏应用开发,大量使用到ViewPager控件,但是问题来了,翻页的过程中,需要滑动屏幕一半的分辨率以上(2560/2=1280)才能够翻页,这样非常影响用户体验。

先简单介绍下应用场景:

1.硬件:公司自主研发,触摸屏采用红外(因此触摸效果没有电容屏流畅),显示屏采用高清2K显示屏

2.软件系统:android4.2.2

公司需要自己定制软件提供用户使用。对于ViewPager这个控件,Android工程师一直不知道怎么去处理这个问题,无非两种:1.自定义控件,2.修改ViewPager。今天特意的去看了下ViewPager的源码,终于找到了改问题所在点,如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) {  
  2.         int targetPage;  
  3.         if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {  
  4.             targetPage = velocity > 0 ? currentPage : currentPage + 1;  
  5.         } else {  
  6.             final float truncator = currentPage >= mCurItem ? 0.4f : 0.6f;  
  7.             targetPage = (int) (currentPage + pageOffset + truncator);  
  8.         }  
  9.   
  10.         if (mItems.size() > 0) {  
  11.             final ItemInfo firstItem = mItems.get(0);  
  12.             final ItemInfo lastItem = mItems.get(mItems.size() - 1);  
  13.   
  14.             // Only let the user target pages we have items for  
  15.             targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));  
  16.         }  
  17.   
  18.         return targetPage;  
  19.     }  

determineTargetPage这个方法就是计算接下来要滑到哪一页。这个方法调用是在MotionEvent.ACTION_UP这个事件下,先说下参数意思:

currentPage:当前ViewPager显示的页面

pageOffset:用户滑动的页面偏移量
velocity: 滑动速率

deltaX: X方向移动的距离

对这个发放进行debug调试之后,发现问题就在0.4f和0.6f这个参数上。分析得出:0.6f表示用户滑动能够翻页的偏移量,所以不难理解,为啥要滑动半屏或者以上了。

修改方法如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 最小可切换Page的偏移量**/  
  2.     private float minPageOffset = 0.6f;  
  3.       
  4.     public void setMinPageOffset(float pageOffset){  
  5.         minPageOffset = pageOffset;  
  6.     }  
  7.     private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) {  
  8.         int targetPage;  
  9.         if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {  
  10.             targetPage = velocity > 0 ? currentPage : currentPage + 1;  
  11.         } else {  
  12.             final float truncator = currentPage >= mCurItem ? 1.0f - minPageOffset : minPageOffset;  
  13.             targetPage = (int) (currentPage + pageOffset + truncator);  
  14.         }  
  15.   
  16.         if (mItems.size() > 0) {  
  17.             final ItemInfo firstItem = mItems.get(0);  
  18.             final ItemInfo lastItem = mItems.get(mItems.size() - 1);  
  19.   
  20.             // Only let the user target pages we have items for  
  21.             targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));  
  22.         }  
  23.   
  24.         return targetPage;  
  25.     }  
这样就可以设置用户滑动偏移量而切换page了,从而解决针对大屏幕分辨率滑动不顺畅的问题。

以上如有疑问,还请提出,谢谢。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值