Android WebView可以通过硬件加速执行translationX动画吗?

时间:2012-10-21 07:37:21

标签: android webview android-animation

我曾在某处读过硬件加速应适用于所有内置的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设备上......

对此问题的任何见解将不胜感激。请注意,虽然我可以通过将其层类型设置为LAYER_TYPE_SOFTWARE来简单地禁用WebView上的硬件加速,这将解决“消隐”问题,但我希望保持硬件加速,因为渲染的好处。

0 个答案:

没有答案