7

我有一個ViewPager與3頁與listView在每頁。 我想動畫listView的方式是,當用戶爲下一頁水平滑動時,listView的項目應該根據下一頁的寬度來。如何從另一頁控制viewPages頁面

即第一個項目應該完全推入,第二個應該是可見的一半,第二個應該是可見的一半,第二個等等。

這種類型的動畫已經在mi3 xiamo中用於聯繫人列表。

enter image description here

在上面像我在正確的direction.Note我刷卡「最近」列表項的知名度。

如果有人能幫我做這個動畫會有很大幫助。請根據ViewPager中的頁面更改,分享一些ListView動畫的鏈接或提示。

回答

3

你有沒有研究OnPageChangeListener.onPageScrolled(int position, float positionOffset)方法,用作ViewPager的滑動監聽器?您可以使用positionOffset的值,它的一個百分比值(從0到1或反轉)告訴我們即將顯示的頁面的主體數量,通過該值處理「最近呼叫」列表項目,設置它們的值left getView()方法中的軸。

------------------更新1於2014-10-03 ------------------

我一直在嘗試完成這個效果,但是我無法在這段時間獲得動畫效果。我已經讓ListView瞭解了滑動偏移量(delta)並盡我所能爲他們的項目做出了貢獻,它看起來將會關閉我們想要的效果。但是,非常複雜的部分是我們必須弄清楚如何兼容手指滑動或者手指滑動以及通過方法直接切換。

我嘗試三天尋求ViewPager的規則,檢查ViewPager和ListView的源,但不從正面返回。所以我把我的project推到GitHub。

------------------ Update 2於2014-10-04 ------------------

以下GIF會完全解釋動畫。

gif

------------------更新3在2014年10月7日--------------- ---

好吧,看來我沒能完全再現這個動畫。要成爲一個有價值的結局,我至少讓我的項目工作,也盡我所能地接近原來的效果。檢查我的第一個更新的GitHub項目以完成整個工作。

+0

是的我已經研究過關於OnPageChangeListner。但我不知道如何處理下一頁的視圖。如果你能給我一些鏈接或關於這個的例子,這將是一個很大的幫助。至於我如何設置項目值從OnPageScrolled.Thanks – Manishika 2014-09-22 07:21:46

+0

是的,很難將** positionOffset **的值與該ListView同步,因爲它在一個片段內,對不起,我不知道如何實現這一點。但是我之前已經完成了一個增強的[ViewPager](https://github.com/vince-styling/traversaless-viewpager-android),你可以在「Indicator Test」片段中找到如何處理positionOffset,只需下載我的示例apk然後檢查。 – VinceStyling 2014-09-22 07:40:37

+0

目前還不清楚你想要做的動畫的確切行爲(比圖片更好的解釋會更好)。無論如何看看這個代碼https://github.com/luksprog/DroidPlayground/blob/1ea55a42d9f1df1de0ee4fa631abc08dcdff1e5c/src/com/luksprog/playground/fragment/ListPagerOffset.java(我從這個問題中瞭解到)。 – Luksprog 2014-10-03 17:36:32

1

在滑動時,您應該使用PageTransformer將轉換應用於ViewPager的每個頁面。基本知識涵蓋在Android Developer Training中。

下面實現你在一個非常簡單的方法所需要的一些代碼:

public class SwipeAnimationActivity extends Activity { 

    private static final String[] COUNTRIES = new String[]{ 
      "Belgium", "France", "Italy", "Germany", "Spain", 
      "Austria", "Russia", "Poland", "Croatia", "Greece", 
      "Ukraine", 
    }; 

    private ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_swipe_animation); 
     viewPager = (ViewPager) findViewById(R.id.view_pager); 
     viewPager.setAdapter(createPagerAdapter()); 
     viewPager.setPageTransformer(false, createPageTransformer()); 
    } 

    private FragmentPagerAdapter createPagerAdapter() { 
     return new FragmentPagerAdapter(getFragmentManager()) { 
      @Override 
      public Fragment getItem(int position) { 
       ListFragment listFragment = new ListFragment(); 
       listFragment.setListAdapter(createListAdapter()); 
       return listFragment; 
      } 

      @Override 
      public int getCount() { 
       return 3; 
      } 
     }; 
    } 

    private ArrayAdapter<String> createListAdapter() { 
     return new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, COUNTRIES); 
    } 

    private ViewPager.PageTransformer createPageTransformer() { 
     return new ViewPager.PageTransformer() { 
      @Override 
      public void transformPage(View page, float position) { 
       ListView listView = (ListView) page.findViewById(android.R.id.list); 
       int childCount = listView.getChildCount(); 
       float offset = .5f * listView.getWidth(); 
       for (int i = 0; i < childCount; i++) { 
        View childView = listView.getChildAt(i); 
        childView.setTranslationX(i * offset * position); 
       } 
      } 
     }; 
    } 

} 

您可以輕鬆地調整了transformPage(View page, float position)達到你需要的效果(可能使用插值來執行某種緩和的動畫)。

+0

很高興告訴那裏有我們可以使用的PageTransformer,我相信這是實現這個動畫的關鍵。根據原始動畫,它只會在即將到來的頁面發生,無論方向如何改變,起始頁面都不會感覺到。我已經在transformPage()中進行了相當多的測試,但是我無法弄清楚如何識別哪個頁面正在啓動頁面以及哪個頁面正在進入頁面,尤其是頻繁刷新方向的變化。請幫助我,非常感謝。 – VinceStyling 2014-10-06 10:08:43