【问题标题】:Sliding 4 images using view pager is very slow使用视图寻呼机滑动 4 张图像非常慢
【发布时间】:2016-10-14 09:50:03
【问题描述】:

我正在尝试使用 viewpager 为带有 4 张图片的应用程序创建介绍导览。 从上一张图片滑到下一张图片需要很长时间。

我在滑动时正在登录 logcat

I/Choreographer: Skipped 100 frames!  The application may be doing too much work on its main thread.
I/Choreographer: Skipped 94 frames!  The application may be doing too much work on its main thread.

我尝试了以下方法:

1 setImageResource() 在 UI 线程上进行位图读取和解码,这可能会导致延迟打嗝。如果这是一个问题,请考虑使用 2.setImageDrawable(android.graphics.drawable.Drawable) 或 3.setImageBitmap(android.graphics.Bitmap) 和 BitmapFactory。 图像的大小和分辨率也可能是滚动缓慢的原因, 尝试创建大图像的缩略图图像并使用。(我将可绘制的图像大小从 100kb 减小到 30-50kb)

还尝试了下面的堆栈溢出答案:

Memory leak with images in viewpager

静止图像在视图寻呼机中从前一个图像到下一个图像需要很长时间。 我在不同的设备上对其进行了测试。在 moto x 上播放速度最慢,而三星、moto E、联想等其他设备则稍快一些,但仍达不到标准。

我在 drawable 文件夹中有 4 张图片,并使用下面的代码尝试滑动图片。

 @Override
    public int getCount() {
        return mResources.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == (object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View itemView = LayoutInflater.from(mContext).inflate(R.layout.pager_item, container, false);
        ImageView imageView = (ImageView) itemView.findViewById(R.id.img_pager_item);
        imageView.setImageDrawable(mResources[position]);
        container.addView(itemView);
        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((LinearLayout) object);
    }

提前致谢!

【问题讨论】:

  • 尝试将 setImageDrawable 更改为 setImageResource。它对我有用。
  • 也试过了,还是一样的输出!
  • 1) 首先检查图像的大小和分辨率。 2) 在清单文件中设置 largeHeap="true"。 3) 使用 Glide 加载图片。
  • 图片大小分别为 34kb、30kb、50kb、40kb。我很在意。感谢您的快速响应!
  • 发布您的完整活动代码

标签: android image bitmap android-viewpager


【解决方案1】:

尝试将您的图像放在特定的 Drawable 文件夹中,以便以不同的密度查看!所以你没有任何渲染问题

默认情况下,Android 会缩放您的位图可绘制对象(.png、.jpg 和 .gif 文件),以便它们在每台设备上以适当的物理尺寸呈现。例如,如果您的应用程序仅为基线、中等屏幕密度 (mdpi) 提供位图可绘制对象,则系统在高密度屏幕上时会放大它们,而在低密度屏幕上时会缩小它们。这种缩放会导致位图中的伪影、缩小或放大。为确保您的位图看起来最好,您应该为不同的屏幕密度添加不同分辨率的替代版本。

【讨论】:

  • 为我工作。谢谢。
  • 谢谢你,普拉内斯。这是一个很好的答案。我的浏览器中有 5 页。每个页面都有一个带有一些大照片的recyclerview。 viewpager 很慢,recyclerview 很慢,drawerLayout 在打开时有延迟。有了这个答案,三个问题就解决了。
  • @Arash 很高兴知道这一点!
【解决方案2】:

我刚刚解决了这个问题,将所有 4 个图像放入可绘制的不同文件夹 xhdpi、xxhdpi、mdpi、xxxhdpi 以及。

我发现 moto x play 是 xxhpi,但 xxhdpi 中没有图像,所以它不起作用。

现在你可以以任何速度刷卡,可能是 FLASH 的速度:D

【讨论】:

    【解决方案3】:

    请使用 Glide 来加载 ViewPager 的图片。它将提高 ViewPager 分页性能,解决 OutOfMemoryError 等问题。

    例子:

        Glide.with(activity)
                .load(ContextCompat.getDrawable(context, R.drawable.ic_about_us))
                        .into(imageView);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多