您好,我有一个带有多个页面的视图分页器(使用片段状态分页器),还有一些 png 作为这些页面的背景。我已经遵循了 Ui 中的显示位图(http://developer.android.com/training/displaying-bitmaps/display-bitmap.html),所以我已经在后台线程中缓存和设置可绘制的图像。但是在切换寻呼机页面时我仍然会遇到一些滞后。在每个片段上,我只对 onCreateView() 方法的视图进行膨胀,所以我不知道是什么导致了这种滞后。我能做些什么来消除这种滞后/断断续续的影响?
11 回答
我有类似的问题。
我正在显示类似教程的页面。每页都是全屏jpg。
起初,我把图片放在res/drawables
文件夹里。浏览器在滑动时非常滞后。
然后我将这些 jpg文件移到
res/drawable-hdpi
文件夹中,延迟消失了。
我认为根据文件夹对图片进行了不同的优化。所以我们不能把所有东西都放在res/drawable
文件夹里
您可能想尝试将 viewPager.setOffScreenLimit(size) 设置为您的页面数。这将加载所有片段一次,并防止在滑动时重新加载它们。
为了消除滞后:
1)如果图像是静态的,则将图像放在 res/drawable-hdpi 中。如果是从 URL 下载的,则使用后台线程加载图像。
2) 通过此方法viewPager.setOffScreenLimit(size)设置页面关闭屏幕限制 。在该视图寻呼机缓存的帮助下,您在此方法中设置的最小屏幕数默认为 1。
3)您可以使用FragmentPagerAdapter和FragmentStatePagerAdapter以获得更好的性能。
我通过将图像移动到 drawable-nodpi 来解决这个问题,因为这会禁用所有 DPI 的缩放。只有当用户在具有该屏幕密度的设备上时,移动到 hdpi/xhdpi 才会禁用缩放。
我在切换页面时避免这种滞后的解决方案是:预加载图像
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) {
}
});
我知道这是一个老问题,但我最近遇到了这个问题并发现了一个不同的问题。所以只是分享,以防有人遇到这篇文章。
我的片段基本上都是大的 Imageview 持有者,并滚动浏览 UX/UI 团队给我的图像。然而,任何时候下一个或上一个图像的尺寸不同,例如,(1200 x 1200) 过渡到 (1200 x 1300),滑动就会滞后,但其余的都可以。
解决方案位于正确的文件夹中。我进行了实验,发现如果我将所有图像裁剪为相同大小,我就没有滞后问题。但是,这不符合我的需要,因为我想要不同尺寸的图像。
所以我改用 Glide 将图像加载到位,而不是直接设置可绘制对象,这样可以很好地清理它。因此,如果其他人遇到此问题,您可能只需要切换到使用 glide 异步加载,而不是直接设置图像。
在@coderek 回答的基础上,我似乎已经通过获取位图而不将它们缩放为特定密度来解决这个问题:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resource, opts);
((ImageView) view).setImageBitmap(bitmap);
使用设备中drawable
文件夹中的图像xxhdpi
可分配多达 8 倍的内存!
PS:
如果分辨率太大,您还可以对可绘制对象进行下采样:
opts.inSampleSize = 2;
我也有类似的问题,在我的情况下,滞后是由太大的布局背景图片引起的。我刚刚调整了图片的大小,滑动延迟消失了
以上解决方案均不适用于我的情况!
我找到了一个可以解决这个问题的库,并且还包含一些更有趣的功能。看看这里!
尝试这个:
在毕业
compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar'
创建
viewPager.setPageTransformer(true, new DefaultTransformer());
您可以通过更改第二个参数来获得一些非标准效果,但并非所有效果都能正常工作。
我没有移动到 res/drawable-hdpi,而是将图像移动到 res/drawable-xxxhdpi。这立即解决了问题。