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的原始碼,終於找到了改問題所在點,如下:
-
privateint determineTargetPage(int currentPage, float pageOffset, int velocity,
- int targetPage;
- if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {
- targetPage = velocity > 0 ? currentPage : currentPage + 1;
- } else {
-
finalfloat truncator = currentPage >= mCurItem ?
- targetPage = (int) (currentPage + pageOffset + truncator);
- }
- if (mItems.size() > 0) {
- final ItemInfo firstItem = mItems.get(0);
- final ItemInfo lastItem = mItems.get(mItems.size() - 1);
- // Only let the user target pages we have items for
- targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));
- }
- return targetPage;
- }
determineTargetPage這個方法就是計算接下來要滑到哪一頁。這個方法呼叫是在MotionEvent.ACTION_UP這個事件下,先說下引數意思:
currentPage:當前ViewPager顯示的頁面
pageOffset:使用者滑動的頁面偏移量
velocity: 滑動速率
deltaX: X方向移動的距離
對這個發放進行debug除錯之後,發現問題就在0.4f和0.6f這個引數上。分析得出:0.6f表示使用者滑動能夠翻頁的偏移量,所以不難理解,為啥要滑動半屏或者以上了。
修改方法如下:
- /** 最小可切換Page的偏移量**/
- privatefloat minPageOffset = 0.6f;
- publicvoid setMinPageOffset(float pageOffset){
- minPageOffset = pageOffset;
- }
- privateint determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) {
- int targetPage;
- if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {
- targetPage = velocity > 0 ? currentPage : currentPage + 1;
- } else {
- finalfloat truncator = currentPage >= mCurItem ? 1.0f - minPageOffset : minPageOffset;
- targetPage = (int) (currentPage + pageOffset + truncator);
- }
- if (mItems.size() > 0) {
- final ItemInfo firstItem = mItems.get(0);
- final ItemInfo lastItem = mItems.get(mItems.size() - 1);
- // Only let the user target pages we have items for
- targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));
- }
- return targetPage;
- }
以上如有疑問,還請提出,謝謝。