2

我有一個viewPager有4個圖像需要調整大小。我實現了不同的選項,但沒有選項運行。我寫了不同的選擇:滾動快速viewPager與圖像在LruCache

  1. 在getView地說:

    image.setImageBitmap(bitmap); 
    

    位圖獲得:

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(bitmapOriginal, null, options); 
    int sampleSize = 1; 
    while ((options.outHeight > 600 * sampleSize) &&(options.outWidth > 400 * sampleSize)) { 
        sampleSize *= 2; 
    } 
    options.inJustDecodeBounds = false; 
    options.inMutable = false; 
    options.inSampleSize = sampleSize; 
    Bitmap bm=BitmapFactory.decodeStream(bimapOriginal, null, options); 
    

但它是非常緩慢。

  1. 我把最後的代碼放在AsyncTask()中,但我無法快速滾動。

  2. 我重寫

    onPageScrollStateChange(int state) 
    

    我只顯示圖像時的狀態爲SCROLL_STATE_IDLE但效果是一樣的,在其他情況下。

  3. 我使用LruCache,我將圖像保存在Asynctask的LruCache中。
    在instantiateItem我把

    for(int i=position *4;i<(position +1)*4 +4;i++) { 
    //NameImage is an Array with the name of image. Every time that calling instantiateItem save 4 images in LruCache 
    new BitmapWorkerTask(nameImage[i).executorOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); 
    

但問題是一樣的最後的情況下,我不能快速滾動和應用程序是如此緩慢。
我的圖像質量和尺寸都很大。我怎樣才能在viewPager中快速滾動?

回答

2

問題是,即使您的工作是在AsyncTask中完成,但ViewPager正在等待您返回圖像(無論您使用的是getView(),instanciateItem(),newView()等)。你需要做的是創建ImageViews的幾個實例,並幾乎立即返回其中的一個(這加快了速度)。讓AsyncTask執行加載,並在返回時(對由位置標識的corrct實例),圖像被設置爲現在已經在ViewPager中的實例。

創建一個圖像視圖數組以用作緩衝區,並使用列表項的位置屬性標識它們。

ImageView[] bufferView=new ImageView[4]; //global 

//use Async task something like this 

@Override  
    protected void onPostExecute(Bitmap result) { 
    virtualPosition = position % 4; //Real position % (number of ImageViews) 
    bufferView[virtualPosition].setImageBitmap(result);   
    } 

回報這個bufferView[virtualPosition]作爲ImageView的此項目

編輯:不要忘了將它添加到父ViewGroup中太

container.addView(pageview[position]); 
1

我寫了一個Android的圖像管理,處理緩存透明地(內存和磁盤)。代碼在Github上。

它使用Handler而不是AsyncTasks。我一直在使用它來處理包含網格和全部列表的圖像大量應用程序,滾動和加載性能得到顯着提高。檢查出來:https://github.com/felipecsl/Android-ImageManager