使用LruCache中的图像快速滚动viewPager

时间:2012-11-20 12:50:03

标签: android android-asynctask android-viewpager image-resizing android-lru-cache

我有一个viewPager,有4个图像需要调整大小。我实现了不同的选项但没有选项运行。我写了不同的选项:

  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);
    
  2. 但这很慢。

    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);
      
    4. 但问题与上一个案例相同,我无法快速滚动,应用程序也很慢 我的图像质量和尺寸都很大。如何在viewPager中快速滚动?

2 个答案:

答案 0 :(得分:2)

问题在于,即使您的工作是在AsyncTask中完成的,但ViewPager正在等待您返回图像(在getView(),instanciateItem(),newView()等中,无论您使用什么)。你需要做的是创建几个ImageViews实例并几乎立即返回其中一个(这会加快速度)。让AsyncTask进行加载,当它返回时(到由position定位的corrct实例),图像被设置为现在已经在ViewPager中的实例。

创建一个imageview数组以用作缓冲区,并使用list item的position属性识别它们。

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 :(得分:1)

我写了一个Android图像管理器,它透明地处理缓存(内存和磁盘)。代码在Github上。

它使用Handler而不是AsyncTasks。我一直在将它用于包含网格和列表的图像繁重的应用程序,滚动和加载性能已显着提高。看看:https://github.com/felipecsl/Android-ImageManager