7

我使用带有许多 WebView 的 ViewPager,它用于显示 ePub。我的问题是 WebViews 只是被渲染/加载(我不太确定)他们相应的页面变得可见。在此之后页面不需要重新渲染,直到它从 ViewPagerAdapter 中销毁。其后果是总有一小会儿的白页。如何将它平滑滚动到下一个 webView 的页面预渲染(之前未渲染)。

这是我的寻呼机适配器:

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 扩展而来,实现了一个 loadContentDocument 方法,该方法通过 loadDataWithBaseURL 加载内容。

编辑: 在activity-oncreate setOffscreenPageLimit 设置为3

 viewPager.setOffscreenPageLimit(3);

为了指出问题所在,我在YouTube 上制作了一个小视频

从第 4 秒开始,您可以看到每个页面在已经可见时才被渲染。当我回去时,一切都很好。

4

3 回答 3

4

我遇到了同样的问题,并通过禁用 Web 视图的硬件加速来修复它:

webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

查看ViewPager 或 ScrollView 中的 WebView - Android 3.0+ 上的奇怪渲染错误

于 2014-02-19T19:48:28.340 回答
0

在清单文件中为您的应用程序设置此属性

安卓:硬件加速=“假”

于 2015-04-29T09:15:44.540 回答
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 个像素进入屏幕时到底发生了什么,并模仿其中的一些行为。

于 2013-08-12T10:27:05.757 回答