【问题标题】:Scroll fast viewPager with images in LruCache使用 LruCache 中的图像滚动快速 viewPager
【发布时间】:2019-02-14 12:21:48
【问题描述】:

我有一个 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);
    

但是速度很慢。

  1. 我把最后一段代码放在了 AsyncTask() 中,但是我不能快速滚动。

  2. 我覆盖了

    onPageScrollStateChange(int state)
    

    我只在状态为SCROLL_STATE_IDLE时显示图像,但效果与其他情况相同。

  3. 我使用 LruCache,我将图像保存在 Asynctask 中的 LruCache 中。
    我在instanceiteItem中放了

    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 中快速滚动?

【问题讨论】:

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


    【解决方案1】:

    问题是,即使您的工作是在 AsyncTask 中完成,但 ViewPager 正在等待您返回图像(在 getView()、instanciateItem()、newView() 等中,无论您使用什么)。您需要做的是创建几个 ImageViews 实例并几乎立即返回其中一个(这会加快速度)。让 AsyncTask 进行加载,当它返回时(到由位置标识的正确实例),图像被设置为现在已经在 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]);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        相关资源
        最近更新 更多