4

ハードウェアアクセラレーションは、組み込みのすべてのAndroidビューで機能するはずだとどこかで読んだことがあります。ただし、WebViewを使用してスライドアニメーションを実行しようとすると、アニメーションの期間中、Webコンテンツ全体が空白になります。

ちょっとしたアプリを書いてみますので、自分で見たい方はぜひお試しください。アプリは、WebViewにページが読み込まれるたびにスライドアニメーションを実行します。ImageViewとWebViewの間をスライドします。ImageViewには、WebView自体のスクリーンショットが含まれます。アクティビティのonCreateに次のコードを貼り付けます。

final WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.google.com");

final ImageView myImageView = (ImageView) findViewById(R.id.imageView);

myWebView.setWebViewClient(new WebViewClient() {

    public void onPageFinished(WebView view, String url) {

        myWebView.setDrawingCacheEnabled(true);
        myWebView.buildDrawingCache();
        myImageView.setImageBitmap(Bitmap.createBitmap(myWebView.getDrawingCache()));
        myWebView.setDrawingCacheEnabled(false);

        myImageView.setVisibility(View.VISIBLE);

        myWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

        ObjectAnimator webViewAnimator = ObjectAnimator.ofFloat(myWebView, "translationX", myWebView.getWidth(), 0);
        webViewAnimator.setDuration(SLIDE_DURATION);
        ObjectAnimator imageViewAnimator = ObjectAnimator.ofFloat(myImageView, "translationX", 0, -myWebView.getWidth());
        imageViewAnimator.setDuration(SLIDE_DURATION);

        AnimatorSet set = new AnimatorSet();
        set.addListener(new AnimatorListenerAdapter() {
            public void onAnimationEnd(Animator animation) {
                myWebView.setLayerType(View.LAYER_TYPE_NONE, null);
                myImageView.setVisibility(View.GONE);
            }
        });
        set.playTogether(webViewAnimator, imageViewAnimator);
        set.start();
    }
}

Manifest.xmlにandroid:hardwareAccelerated="true"があることを確認してください

また、main_layout.xmlで:

<RelativeLayout 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" >

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ImageView
        android:id="@+id/imageView"
        android:contentDescription="@string/image_view_description"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />

</RelativeLayout>

これで、ページをロードするたびに、ImageView(WebViewのスクリーンショットを含む)とWebView自体の間にスライドトランジションが発生します。

このバグはJellyBeanシミュレーターでは再現できませんが、これまでにテストされたすべてのICS/JellyBeanデバイスで発生します...

この問題についての洞察をいただければ幸いです。WebViewのレイヤータイプをLAYER_TYPE_SOFTWAREに設定することで、ハードウェアアクセラレーションを無効にすることができます。これにより、「ブランキングアウト」の問題が修正されますが、レンダリングの利点があるため、ハードウェアアクセラレーションを有効のままにしておきます。

4

0 に答える 0