WebView setLayerType LAYER_TYPE_HARDWARE无法正常工作

时间:2015-06-03 15:43:29

标签: java android webview layer

对于性能,我使用LAYER_TYPE_HARDWARE作为我的WebView。但它无法正常工作。

enter image description here enter image description here

这是我的代码:

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时,存在一些问题:

  • 单击“加载文本”按钮,WebView不显示任何内容,只需单击进入该网页,即可显示其内容。
    mWebView.scrollBy(0, 1);之后插入mWebView.loadDataWithBaseURL可以解决此问题,但我认为这只是一个“备份计划” 启动应用程序并快速单击“加载文本”按钮,结果将显示。但是在此之后点击按钮仍然会显示空白页面
  • “更改大小”功能在上述两种情况下都能很好地工作,但有时它不起作用,我需要单击WebView区域来显示内容。
  • 我正在编写一个类似的WebView类(代码here),问题是相反的,页面总是在调用loadDataWithBaseURL后显示(也使用LAYER_TYPE_HARDWARE),但是调用了javascript函数(类似于更改大小)不会更改WebView的内容,...

    那么,我是否需要配置与LAYER_TYPE_HARDWARE一起使用?

1 个答案:

答案 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

我希望这有助于某人。