对于性能,我使用LAYER_TYPE_HARDWARE作为我的WebView。但它无法正常工作。
这是我的代码:
SmoothWebViewActivity.java
package uet.ducvu.androidexample;
import java.io.InputStream;
import java.util.Scanner;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
public class SmoothWebViewActivity extends Activity {
private WebView mWebView;
private int mTextSize = 15;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_smooth_web_view);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
mWebView = (WebView) findViewById(R.id.my_web_view);
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.getSettings().setJavaScriptEnabled(true);
//mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
public void loadText(View view){
InputStream raw = getResources().openRawResource(R.raw.my_webview_template);
Scanner scanner = new Scanner(raw).useDelimiter("\\A");
String core = scanner.next();
String body = "Some data here";
scanner.close();
for (int i = 0; i < 1000; i++)
body += "<br/>" + i;
String html = String.format(core, mTextSize, body);
mWebView.loadDataWithBaseURL(null, html, null, "utf-8", null);
System.out.println("Hardware: " + mWebView.isHardwareAccelerated());
}
public void changeSize(View view){
mTextSize++;
mWebView.loadUrl("javascript:dynamicChangeSize(" + mTextSize + ");");
}
}
activity_smooth_web_view.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="uet.ducvu.androidexample.SmoothWebViewActivity"
tools:ignore="HardcodedText,ButtonStyle" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="loadText"
android:text="Load text" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="changeSize"
android:text="Change size" />
</LinearLayout>
<WebView
android:id="@+id/my_web_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
RES /原料/ my_webview_template.html
<html>
<head>
</head>
<body style="font-size:%dpx;">%s</body>
<script type="text/javascript">
function dynamicChangeSize(size){
document.body.style.fontSize = size + "px";
}
</script>
</html>
的AndroidManifest.xml
<activity
android:name=".SmoothWebViewActivity"
android:label="@string/title_activity_smooth_web_view"
android:hardwareAccelerated="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
当我使用View.LAYER_TYPE_SOFTWARE
时,一切正常。但是,当我切换到View.LAYER_TYPE_HARDWARE
时,存在一些问题:
mWebView.scrollBy(0, 1);
之后插入mWebView.loadDataWithBaseURL
可以解决此问题,但我认为这只是一个“备份计划”
启动应用程序并快速单击“加载文本”按钮,结果将显示。但是在此之后点击按钮仍然会显示空白页面loadDataWithBaseURL
后显示(也使用LAYER_TYPE_HARDWARE),但是调用了javascript函数(类似于更改大小)不会更改WebView的内容,...
答案 0 :(得分:2)
这是一个老问题,但我注意到你已经开启了硬件加速
清单中的活动级别,
使用WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
的窗口级别,
和使用mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
的视图级别。尝试仅使用视图级别加速,或仅使用清单中的android:hardwareAccelerated="true"
。不是两个,一起。
来自Android开发者页面...
检查应用程序是否有两种不同的方法 硬件加速:
如果View附加到a,View.isHardwareAccelerated()将返回true 硬件加速窗口。 Canvas.isHardwareAccelerated()返回 如果Canvas是硬件加速的话,则为true
我希望这有助于某人。