我遇到的问题是从一个存在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;
}
}
}