使用视图寻呼机滑动4个图像非常慢

时间:2016-10-14 09:50:04

标签: android image bitmap android-viewpager

我正在尝试使用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上播放其最慢和其他设备,如三星,摩托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);
    }

提前致谢!

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

我刚刚解决了它,将所有4张图片放入drawable到不同的文件夹xhdpi,xxhdpi,mdpi,xxxhdpi。

我发现moto x play是xxhpi,但xxhdpi中没有图像,这就是为什么它没有用。

现在你可以用任何速度滑动,可能与FLASH的速度:D

答案 2 :(得分:0)

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

示例:

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