2014-09-04 115 views
1

我正在研究循環ViewPager,並且我實現了這個完全解決方案(https://stackoverflow.com/a/12965787/1083564)。如何在ViewPager上手動smoothScrollTo()片段視圖

唯一缺失的是,當我使用setCurrentItem(int i,bol b)方法時,我需要smoothScroll,它立即轉到像素限制,而不使用smoothScroll。

我已經有訪問使用此方法,使用下面的代碼:

package android.support.v4.view; 

import android.content.Context; 
import android.util.AttributeSet; 

public class MyViewPager extends ViewPager { 

    public MyViewPager(Context context) { 
     super(context); 
    } 

    public MyViewPager(Context context, AttributeSet attr) { 
     super(context, attr); 
    } 

    public void smoothScrollTo(int x, int y, int velocity) { 
     super.smoothScrollTo(x, y, velocity); 
    } 

} 

,但我無法弄清楚在何處以及如何使用它。我有我需要用我的ViewPager的setOnPageChangeListener這裏面的代碼運行平穩像素數:

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    Log.d("viewpager", positionOffsetPixels+""); 
} 

它去之前爲0,瞬間,因爲setCurrentItem的,我有個像素的左值達到0(向左)或x(向右,取決於屏幕)。我不知道我怎麼能得到這個x號碼。

PS:我認爲這個解決方案是IMDB應用程序使用的一個非常好的解決方案。你可以看到這個滾動從第一個到最後一個,但沒有刪除你的手指(用2個手指來做)。您會看到ViewPager左側顯示「白色限制」。唯一的區別是他們知道如何在使用setCurrentItem之後平滑滾動。

如果您需要更多的信息,請提問!謝謝!

+0

你能張貼一些數字來幫助我們理解你想要的嗎? – VinceStyling 2014-09-11 03:56:36

回答

3

問題:當你發現循環滾動,必須perfomed,呼籲setCurrentItem立即將導致ViewPager滾動到真正的片段立即沒有平滑滾動,因爲它設置爲false。

解決方案:而是讓ViewPager爲它對於其他片段滾動到假冒片段順利,然後滾動到真正的片段一些延遲與平滑滾動設置爲false後。用戶不會注意到更改。

當我們正在執行循環滾動時,請在可延遲運行時調用setCurrentItem。使用onPageSelected來知道所選頁面的索引。

public void onPageSelected(int position) { 

    // Consider eg. : C' A B C A' 

    boolean circularScroll = false; 
    if(position == 0) { 
     // Position 0 is C', we need to scroll to real C which is at index 3. 
     position = mPager.getAdapter().getCount() - 2; 
     circularScroll = true; 
    } 

    int lastIndex = mPager.getAdapter().getCount() - 1; 
    if(position == lastIndex) { 
     // Last index is A', we need to scroll to real A, which is at index 1. 
     position = 1; 
     circularScroll = true; 
    } 

    if(circularScroll) { 
     final int realPosition = position; 
     mPager.postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       mPager.setCurrentItem(realPosition, false); 
      } 

     }, 500L); 
    } 
} 
+0

絕對完美!你能解釋一下這個答案嗎?我相信很多人會使用這個解決方案!非常感謝! – Otuyh 2014-09-11 18:17:37

0

當你setCurrentItem的第二個參數設置爲true,它應該平滑滾動

@Override 
public void onPageScrollStateChanged (int state) { 
    if (state == ViewPager.SCROLL_STATE_IDLE) { 
     int curr = viewPager.getCurrentItem(); 
     int lastReal = viewPager.getAdapter().getCount() - 2; 
     if (curr == 0) { 
      viewPager.setCurrentItem(lastReal, true); 
     } else if (curr > lastReal) { 
      viewPager.setCurrentItem(1, true); 
     } 
    } 
} 
+0

這是真的,但我不能在這種情況下使用。我需要手動使用smoothScroll滾動剩下的像素來完成幻燈片。如果我使用你的解決方案,當我從1滑動到0時,它會顯示我要進入ViewPager的第三頁,而我不想要這個。我鏈接的URL內的更多細節。不管怎麼說,還是要謝謝你! – Otuyh 2014-09-09 13:41:22