根据罗曼·盖伊(Romain Guy)的博客文章Android Performance Case Study,当谈到“ overdraw ”时,他说:



但是getWindow()。setBackgroundDrawable(null)似乎没有作用。这是带有代码的示例:

//MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().setBackgroundDrawable(null);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

// main.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"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:background="#FFE0FFE0"
tools:context=".MainActivity" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="40dp"
    android:layout_marginRight="40dp"
    android:background="#FFFFFFE0" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="@string/hello_world" />
</LinearLayout>

// styles.xml
<style name="AppTheme" parent="AppBaseTheme">
   <item name="android:windowBackground">@color/yellow</item>
</style>

该样本在图像中产生结果。您可以看到外层有 overdraw ,并且窗口背景颜色仍然可见。我希望窗口的背景消失,只有lineralayout会 overdraw 。

最佳答案

只需将getWindow().setBackgroundDrawable(null)向下移动,直到setContentView(R.layout.main)之后的任何位置即可;例如。:

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    getWindow().setBackgroundDrawable(null);
}
setContentView(...)调用传播设置 Activity 附加到的窗口上的内容的设置,并且可能会覆盖您打算使用setBackgroundDrawable(null)进行的更改。

结果:

10-04 17:36