Android ViewPager滞后

时间:2013-04-02 11:52:52

标签: android android-viewpager

您好我有一个包含多个页面的viewpager(使用片段状态寻呼机),以及一些png作为这些页面的背景。我已经按照Ui中的显示位图(http://developer.android.com/training/displaying-bitmaps/display-bitmap.html)进行了操作,所以我已经在后台线程中缓存并设置了drawable图像。但是,当浏览页面的页面时,我仍然会遇到一些延迟。在每个片段上,我只在onCreateView()方法上膨胀视图,所以我不知道可能导致这种延迟的原因。我该怎么做才能消除这种滞后/波动效应?

11 个答案:

答案 0 :(得分:49)

我有类似的问题。

我正在展示类似教程的页面。每个页面都是全屏jpg。

首先,我将图片放在res/drawables文件夹中。刷卡时,viewpager非常迟钝。

  

然后我将这些jpgs移动到res/drawable-hdpi文件夹,滞后消失了。

我认为对基于文件夹的图片进行了不同的优化。所以我们不能把所有内容放在res/drawable文件夹

答案 1 :(得分:16)

您可能希望将viewPager.setOffScreenLimit(大小)尝试为您的页面数。这将加载所有碎片一次,并在滑动时不再重新加载它们。

答案 2 :(得分:5)

删除延迟:

1)如果图像是静态的,请将图像放在res / drawable-hdpi中。如果从URL下载,则使用后台线程加载图像。

2)通过此方法设置页面关闭屏幕限制 viewPager.setOffScreenLimit(size)。在该视图寻呼机缓存的帮助下,默认情况下,您在此方法中设置的最小屏幕数量为1。

3)您可以使用 FragmentPagerAdapter FragmentStatePagerAdapter 来获得更好的效果。

答案 3 :(得分:2)

我遵循了Coderek的回答,并将其移至了不同的

res / drawable-hdpi文件夹

drawable-xxxhdpi最适合我的项目。

答案 4 :(得分:1)

我在切换页面时避免这种延迟的解决方案是:预加载图像

final Drawable[] images = new Drawable[3];
for(int i=0; i<3; i++){
    int position = i+1;
    images[i] = getResources().getDrawable(getResources().getIdentifier("image"+position, "drawable", getPackageName()));
 }

然后:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            imageSwitcher.setImageDrawable(images[position]);
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });

答案 5 :(得分:1)

建立在@coderek上的答案我似乎通过获取位图而不是针对特定密度缩放它来解决这个问题:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resource, opts);

((ImageView) view).setImageBitmap(bitmap);

使用drawable设备中xxhdpi文件夹中的图片,可以分配多达8倍的内存!

P.S:

如果分辨率过大,您也可以对drawable进行下采样:

opts.inSampleSize = 2;

答案 6 :(得分:1)

我通过将图像移动到drawable-nodpi来解决这个问题,因为这会禁用所有DPI的缩放。如果用户位于具有该屏幕密度的设备上,则进入hdpi / xhdpi将仅禁用缩放。

答案 7 :(得分:1)

我知道这是一个老问题,但是我最近遇到了这个问题,发现了另一个问题。因此,只是分享一下,以防有人碰到这篇文章。

我的片段基本上都是Imageview的大持有者,并在UX / UI团队给我的图像中滚动。但是,无论何时下一张或上一张图片的大小都不同,例如(1200 x 1200)过渡到(1200 x 1300),滑动会滞后,但是其余的会很好。

解决方案位于正确的文件夹中。我进行了实验,发现如果将所有图像裁切为相同大小,则不会出现滞后问题。但是,这不符合我的需求,因为我想要不同尺寸的图像。

因此,我改用Glide将图像加载到适当位置,而不是直接设置可绘制对象,这很好地清理了它。因此,如果其他任何人遇到此问题,则可能只需要切换为使用glide异步加载,而不是直接设置图像即可。

答案 8 :(得分:0)

我也有类似的问题,在我的情况下,滞后是由布局的背景图片太大引起的。我刚刚调整了图片大小并且滑动延迟消失了

答案 9 :(得分:0)

上述解决方案都不适用于我的情况!

我找到了一个解决这个问题的库,并且还包含了一些更有趣的功能。 Take a look at it here!

试试这个:

Gradle

compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar'

<强>的onCreate

viewPager.setPageTransformer(true, new DefaultTransformer());

您可以通过更改第二个参数来获得一些非标准效果,但并非所有参数都能正常工作。

答案 10 :(得分:-1)

我没有将图像移动到res / drawable-hdpi,而是将图像移动到了res / drawable-xxxhdpi。 这立即解决了问题。