2013-04-02 116 views
9

你好,我有一個viewpager與幾個頁面(使用片段狀態尋呼機)和一些PNG作爲背景到這些頁面。我已經在Ui中顯示位圖(http://developer.android.com/training/displaying-bitmaps/display-bitmap.html),所以我已經緩存並將圖像設置爲在後臺線程中繪製。但是當打開尋呼機的頁面時,我仍然有些滯後。在每個片段上,我只是誇大了onCreateView()方法的視圖,所以我不知道可能會導致這種滯後。我能做些什麼來消除這種滯後/波浪效應?Android ViewPager滯後

回答

12

您可能想嘗試viewPager.setOffScreenLimit(size)爲您的頁面數量。這將加載所有的片段一次,並保持在刷卡時重新加載它們。

+0

只是一個小的更正,它是'viewPager.setOffscreenLimit(size)'。儘管如此,謝謝! –

42

我有類似的問題。

我正在顯示類似教程的頁面。每個頁面都是全屏jpg。

起初我把圖片放在res/drawables的文件夾裏。刷視圖時,viewpager非常滯後。

然後我把那些jpgs移動到res/drawable-hdpi文件夾,滯後就沒了。

我認爲根據文件夾對圖片進行不同的優化。所以我們不能把一切都放在res/drawable文件夾中

+0

這正是我的問題,你的回答爲我解決了。我把所有全尺寸的背景圖像放在xhdpi文件夾中,現在它像黃油一樣平滑。 :) – Amyth

+0

如何你甚至可以弄明白這一點。我幾乎開始認爲「哦,它可能需要太多的內存巨大的形象」,然後我只是做了你所說的。它只是工作。我把它放在xhdpi中。這是與hdpi/mdpi/xxhdpi/xxxhdpi意味着手機也會顯示我的背景。 – Alex

0

我也有類似的問題,在我的情況下,滯後是由佈局的背景圖片太大造成的。我只是調整了圖片和刷卡滯後不見了

0

我的解決辦法,以避免這種滯後時切換頁面爲:預載圖片

final Drawable[] images = new Drawable[3]; 
for(int i=0; i<3; i++){ 
    int position = i+1; 
    images[i] = getResources().getDrawable(getResources().getIdentifier("image"+position, "drawable", getPackageName())); 
} 

然後:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      imageSwitcher.setImageDrawable(images[position]); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 
    }); 
+0

雖然代碼是讚賞,它應該總是有一個附帶的解釋。這並不需要很長時間,但它是可以預料的。 – peterh

1

上@coderek構建回答我似乎已經通過獲取位圖解決了這個問題,但沒有針對特定的密度對它們進行縮放:

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inScaled = false; 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resource, opts); 

((ImageView) view).setImageBitmap(bitmap); 

xxhdpi設備中使用來自drawable文件夾的圖像導致分配的內存多達8倍!

PS:

您也可以往下品嚐繪製如果分辨率過大:

opts.inSampleSize = 2; 
2

對於去除滯後:

1)把在res圖像/ drawable- hdpi如果圖像是靜態的。如果它是從URL下載的,那麼使用後臺線程來加載圖像。

2)通過此方法設置頁面關閉屏幕限制viewPager.setOffScreenLimit(size)。在該視圖頁面緩存器的幫助下,默認情況下,您在此方法中設置的最小屏幕數量爲1。

3)您可以使用FragmentPagerAdapter和更好的性能FragmentStatePagerAdapter

0

上述解決方案都不適用於我的案例!

我發現了一個解決該問題的庫,並且還包含了一些更有趣的功能。 Take a look at it here!

試試這個:

在gradle這個

compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:[email protected]' 

的onCreate

viewPager.setPageTransformer(true, new DefaultTransformer()); 

您可以通過更改第二個參數得到一些非標準efects,雖然不是所有的人好好工作。