Android webview在硬件加速后界面闪烁解决方法

我遇到的问题是从一个存在webview界面中跳转到另一个新的界面,在回退回来的时候webview加载的界面会有明显的闪烁,经过多方了解是因为webview设置了硬件加速,硬件加速可以提高网页的加载速度和,滑动时界面的流畅度,为了优化网页的速度,开启硬件加速是必要的,所以要解决上面界面闪烁问题。

解决方法:

就是在界面跳转时,通过设置webview的setLayerType 设置成LAYER_TYPE_SOFTWARE 来关掉硬件加速

public void onPause() {
        super.onPause();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
               webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            ishareware=true;
        }
}
正常的onpause关闭,在onresume中再打开就行,但是经过我的尝试发现这样没有办法解决闪烁问题。

所以我想到在网页界面滑动时重新开启硬件加速就可以了,不光可以解决掉界面闪烁问题,还可以通过硬件加速优化网页的速度;

接下来就是监听网页滑动:

重新webview加上下面的内容:
@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (this.getHeight() + this.getScrollY() == getHeight()) {
            _calCount++;
            if (_calCount == 1) {
                if (_listener != null) {
                    _listener.srollToBottom();
                }
            }
        } else {
            _calCount = 0;
        }
        if (listener != null) {
            float webcontent = getContentHeight() * getScale();// webview的高度
            float webnow = getHeight() + getScrollY();// 当前webview的高度
            if (Math.abs(webcontent - webnow) < 5) {
                listener.onPageEnd(l, t, oldl, oldt);
            } else if (getScrollY() == 0) {
                listener.onPageTop(l, t, oldl, oldt);
            } else {
                listener.onScrollChanged(l, t, oldl, oldt);
            }
        }
    }
 public void setOnScrollChangeListener(OnScrollChangeListener listener) {
        this.listener = listener;
    }

    public interface OnScrollChangeListener {
        public void onPageEnd(int l, int t, int oldl, int oldt);

        public void onPageTop(int l, int t, int oldl, int oldt);

        public void onScrollChanged(int l, int t, int oldl, int oldt);
    }


在监听webview后在onScrollChanged中重新开启硬件加速

@Override
                public void onScrollChanged(int l, int t, int oldl, int oldt) {
                    if(ishareware) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                            // chromium, enable hardware acceleration
                            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
                            ishareware=false;
                        }
                    }
                }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您关闭了 WebView硬件加速,那么您可能需要使用软件渲染来播放视频。您可以使用 Android SDK 提供的 MediaPlayer 类或者 ExoPlayer 库来实现。 使用 MediaPlayer 类播放视频的基本步骤如下: 1. 创建 MediaPlayer 实例。 2. 设置数据源,可以是本地文件或者网络地址。 3. 准备 MediaPlayer。 4. 开始播放。 示例代码如下: ```java MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("your_video_file_path"); mediaPlayer.prepare(); mediaPlayer.start(); ``` 如果您需要在 WebView 中播放网络视频,您可以使用 ExoPlayer 库来实现。ExoPlayer 是 Google 推荐的一个用于播放多种媒体格式的开源库,可以轻松地实现视频播放、缓存和跨平台支持等功能。 您需要在 WebView 中注册一个 WebChromeClient,然后在 onShowCustomView 方法中创建一个 View 并将其添加到 WebView 中。在这个 View 中,您可以使用 ExoPlayer 来播放视频。 示例代码如下: ```java private WebView webView; private FrameLayout videoLayout; private View videoView; private SimpleExoPlayer exoPlayer; webView.setWebChromeClient(new WebChromeClient() { @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); videoView = view; videoLayout.addView(videoView); exoPlayer = new SimpleExoPlayer.Builder(context).build(); exoPlayer.setVideoSurfaceView((SurfaceView) videoView); exoPlayer.setMediaItem(MediaItem.fromUri("your_video_url")); exoPlayer.prepare(); exoPlayer.play(); } @Override public void onHideCustomView() { super.onHideCustomView(); videoLayout.removeView(videoView); exoPlayer.release(); } }); ``` 其中,videoLayout 是一个 FrameLayout,用于将视频 View 添加到 WebView 中。在 onShowCustomView 方法中,我们创建了一个 SurfaceView 并将其设置为 ExoPlayer 的视频 Surface,然后设置要播放的媒体项并准备 ExoPlayer。在 onHideCustomView 方法中,我们从 videoLayout 中移除视频 View 并释放 ExoPlayer。 需要注意的是,如果您关闭了 WebView硬件加速,使用软件渲染来播放视频可能会导致性能下降和卡顿等问题。因此,建议您在必要的情况下开启 WebView硬件加速,并在播放视频时使用硬件加速
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值