在设备上制作动画视图时,Android WebView会出现闪烁错误

时间:2012-10-09 18:24:01

标签: android android-emulator android-webview android-animation

我正在尝试实施幻灯片导航(Facebook,Path或Google+ Android应用)。重现此错误的完整来源can be found here

然而,当屏幕上的WebView设置动画时,会在设备上发生闪烁,就好像设备在将其推离屏幕之前咬了我的WebView一样。

WebView slide nav menu IN (device)

模拟器上不会出现工件!动画进展顺利。

WebView slide nav menu IN (emulator)

有趣的是,这种闪烁似乎只发生在动画视图为WebView时!这是使用TextView作为主要内容视图的相同项目。

TextView slide nav menu IN (device)

网络视图活动的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/blue" >

    <WebView
        android:id="@+id/web_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

</RelativeLayout>

对于文本视图活动:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/blue" >

    <TextView
        android:id="@+id/web_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello there. no flicker!"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
         />

</RelativeLayout>

调用代码以滑动导航菜单:

 private void slideIn() {
        LinearLayout actionBarFrame = (LinearLayout) findViewById(android.R.id.content).getParent();

        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        menuView = inflater.inflate(R.layout.menu, null);
        menuView.setLayoutParams(new FrameLayout.LayoutParams(SIZE, LayoutParams.MATCH_PARENT, Gravity.LEFT));
        FrameLayout decorView = (FrameLayout) getWindow().getDecorView();
        decorView.addView(menuView);
        decorView.bringChildToFront(actionBarFrame);

        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) actionBarFrame.getLayoutParams();
        params.setMargins(SIZE, 0, -SIZE, 0);
        actionBarFrame.setLayoutParams(params);

        TranslateAnimation ta = new TranslateAnimation(-SIZE, 0, 0, 0);
        ta.setDuration(DURATION); 
        actionBarFrame.startAnimation(ta);
    }

将其滑回:

    private void slideOut() {
        LinearLayout actionBarFrame = (LinearLayout) findViewById(android.R.id.content).getParent();

        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) actionBarFrame.getLayoutParams();
        params.setMargins(0, 0, 0, 0);
        actionBarFrame.setLayoutParams(params);

        TranslateAnimation ta = new TranslateAnimation(SIZE, 0, 0, 0);
        ta.setDuration(DURATION);
        ta.setAnimationListener(new  AnimationListener() {
            @Override 
            public void onAnimationEnd(Animation arg0) {
                ((FrameLayout) getWindow().getDecorView()).removeView(menuView);
                menuView = null;
            }
            @Override public void onAnimationRepeat(Animation arg0) { }
            @Override public void onAnimationStart(Animation arg0) { }
        });
        actionBarFrame.startAnimation(ta);
    }

我将代码作为公开回购邮件上传到BitBucket,因此您可以像我一样尝试此项目。

对于为什么会发生这种情况或如何解决问题的任何帮助或想法将不胜感激!所需要的是平滑地动画WebView从图片中移出并重新进入。谢谢!

1 个答案:

答案 0 :(得分:5)

一般来说,使用WebViews并在3.0+设备上启用硬件加速时,问题似乎与错误有关。我还尝试将sliding menu库与WebView一起使用,但遇到了同样的闪烁问题。环顾四周后,我找到了一个解决方法:

WebView “flashing” with white background if hardware acceleration is enabled (Android 3.0+)

变通方法使用以下代码将WebView的图层类型设置为软件渲染:

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

此代码解决了闪烁问题,但性能较低。