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了,從而解決針對大屏幕分辨率滑動不順暢的問題。

以上如有疑問,還請提出,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章