5

我正在尝试实现滑入式导航(例如 Facebook、Path 或 Google+ Android 应用程序)。可以在此处找到重现此错误的完整来源。

然而,当在设备上制作屏幕外的动画WebView时,会发生闪烁,就好像设备WebView在将其从屏幕上推出之前正在咬我一口。

WebView 幻灯片导航菜单 IN(设备)

仿真器上不会出现神器!动画顺利进行。

WebView 幻灯片导航菜单 IN(模拟器)

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

TextView 幻灯片导航菜单 IN(设备)

Web 视图活动的布局:

<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出图片并重新进入。谢谢!

4

1 回答 1

7

一般来说,问题似乎与WebViews在 3.0+ 设备上启用硬件加速时的错误有关。我也尝试过使用滑动菜单库,WebView但遇到了同样的闪烁问题。环顾四周后,我在这里找到了解决方法:

如果启用了硬件加速(Android 3.0+),WebView 会以白色背景“闪烁”

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

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

这段代码为我解决了闪烁问题,但缺点是性能较低。

于 2013-04-24T08:51:14.600 回答