使用视图翻页器滑动4张图片非常缓慢

4

我正在尝试使用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)
我还尝试了下面的stackoverflow答案: Viewpager中的图片内存泄漏 在view pager中,仍然需要花费很长时间从前一张图片切换到下一张图片。我在不同设备上测试过。在moto x play上最慢,而其他设备像三星、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);
    }

Thanks in advance !


尝试将setImageDrawable更改为setImageResource。这对我有效。 - D.J
1
  1. 首先检查您的图像大小和分辨率。2) 在清单文件中设置 _largeHeap="true"_。3) 使用 Glide 加载您的图像。
- Piyush
图片的大小分别为34kb、30kb、50kb、40kb。我正在处理中。谢谢您的快速回复! - iamabhaykmr
请将您的完整活动代码发布。 - Rissmon Suresh
@Piyush 谢谢。2)在清单文件中设置largeHeap="true"。3)使用Glide加载您的图像。有帮助! - Svitlana
显示剩余5条评论
3个回答

5
尝试将图像放置在特定的Drawable文件夹中,以便在不同密度下查看!这样就不会出现任何渲染问题。
默认情况下,Android会缩放您的位图可绘制对象(.png、.jpg和.gif文件),以便在每个设备上以适当的物理大小呈现它们。例如,如果您的应用程序仅为基准中等屏幕密度(mdpi)提供位图可绘制对象,则系统会在高密度屏幕上将它们放大,并在低密度屏幕上将它们缩小。这种缩放可能会导致位图出现伪影、缩小或放大。为确保您的位图效果最佳,您应该为不同屏幕密度包含不同分辨率的替代版本。

对我有用。谢谢。 - TechBee
1
谢谢,Praneeth。这是一个很好的答案。我有5页在我的viewpager中。每一页都有一个recyclerview和一些大照片。viewpager很慢,recyclerview也很慢,drawerLayout打开时有延迟。有了这个答案,三个问题都解决了。 - Arash
@Arash 很高兴知道这个消息! - Praneeth

3

我把这四张图片都放到了不同的文件夹中,分别是xhdpi、xxhdpi、mdpi和xxxhdpi。这样,问题就解决了。

我发现moto x play属于xxhpi,但 xxhpi 文件夹中没有相应的图片,这就是为什么它无法正常工作的原因。

现在,你可以使用任何速度来滑动,甚至可以像闪电侠一样快!:D


1
请使用Glide来加载ViewPager中的图片。它可以提高ViewPager的分页性能,解决OutOfMemoryError等问题。
示例:
    Glide.with(activity)
            .load(ContextCompat.getDrawable(context, R.drawable.ic_about_us))
                    .into(imageView);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接