我使用带有许多WebView的ViewPager,用于显示ePub。我的问题是WebViews只是渲染/加载(我不太确定),因为它们的相应页面变得可见。在此之后,页面不需要重新呈现,直到它从ViewPagerAdapter中销毁。 结果是,有一段时间总是有一个白页。如何将其滚动的页面预渲染到下一个webView(之前未呈现)。
这是我的PagerAdapter:
public class MagazineReaderPagerAdapter extends PagerAdapter {
private MagazineReaderActivity activity;
private EpubDocument epub;
public MagazineReaderPagerAdapter(Context ctx, EpubDocument epub)
{
activity = (MagazineReaderActivity) ctx;
this.epub = epub;
}
@Override
public int getCount() {
return epub.getContentDocuments().size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ReaderWebViewMulti view = new ReaderWebViewMulti(activity);
view.loadContentDocument(epub.getContentDocuments().get(position), epub);
((ViewPager) container).addView(view, 0);
return view;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
}
ReaderWebViewMulti从WebView ind扩展实现了一个方法loadContentDocument,它通过loadDataWithBaseURL加载内容。
修改 在activity-oncreate中,setOffscreenPageLimit设置为3
viewPager.setOffscreenPageLimit(3);
要指出问题所在,我在YouTube
上制作了一个小视频从第二个4开始,您可以看到每个页面在已经可见时才会被渲染。当我回去的时候一切都很好。
答案 0 :(得分:5)
我遇到了同样的问题并通过禁用Web视图的硬件加速来修复它:
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
请参阅WebView inside ViewPager or ScrollView - weird rendering bug on Android 3.0+
答案 1 :(得分:0)
我对此有所了解。滚动屏幕1像素将呈现正确的页面:
class SomeClass implements OnPageChangeListener {
private ViewPager viewPager;
...
viewPager = ...
viewPager.setOnPageChangeListener(this);
...
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
// viewpager finished scrolling to a page
viewPager.scrollBy(1, 0);
}
}
}
你需要检查你是来自右边还是左边,并根据这个滚动-1或1像素(你来自的页面将保留在内存中,所以你不需要重新加载那个)。只有在第一个滚动(打开应用程序后),上述问题仍然存在。
缺点:如果你仔细观察,你可以看到页面滚动1个像素。
有一个比我更多时间的人可以深入研究android代码,看看当1个像素进入屏幕时究竟发生了什么,并模仿了这种行为。
答案 2 :(得分:0)
在清单文件
中为您的应用程序设置此属性机器人:硬件加速= “假”