四、 背景过度绘制
1 . 背景设置 :
① 设置背景 : 设置了背景 , 图片或颜色值 , 绘制增加 1 11 次 ;
② 透明背景 : 背景透明 , 不增加绘制次数 , 绘制增加 0 00 次 ;
③ 主题背景 : 在主题中设置了背景 , 也会增加 1 11 次绘制 ;
如果同时设置布局的背景和主题背景 , 此时会绘制 2 22 次 ;
删除一次背景设置 , 这里建议删除主题的背景 ;
2 . 删除主题背景 :
① 使用代码删除 : 调用 getWindow().setBackgroundDrawable( null ) 方法 , 删除背景 , 该方法调用调用必须 在 super.onCreate 之后, 在 setContentView 之前 ;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 删除背景, 该调用必须在 super.onCreate 之后, setContentView 之前 getWindow().setBackgroundDrawable(null); setContentView(R.layout.activity_main); }
② 主题中删除 ( 建议 ) : 在主题中设置 <item name=“android:windowBackground”>null</item> 元素 , 然后 Activity 使用该主题 , 即可避免背景二次重绘 ;
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- 设置应用启动时默认显示的图片 , 这样比白屏/黑屏体验好一些 --> <!--<item name="android:windowBackground">@mipmap/ic_launcher</item>--> <!-- 将背景设置成透明的 --> <!--<item name="android:windowIsTranslucent">true</item>--> </style> <style name="AppTheme.NoBackground" parent="AppTheme"> <!-- 布局渲染时, 不设置主题背景, 避免过度重绘 --> <item name="android:windowBackground">null</item> </style> </resources>
在 AndroidManifest.xml 的 Activity 标签中设置该主题 , 即可取消该背景 ;
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kim.hsl.rtmp"> <application> <activity android:theme="@style/AppTheme.NoBackground" android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
或者在代码中设置主题 :
@Override protected void onCreate(Bundle savedInstanceState) { /* 此时应用首界面启动完成, 将主题恢复成其它主题 此处也可以根据不同的设置, 为应用设置不同的主题 */ setTheme(R.style.AppTheme.NoBackground); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }