1.整體思路:
更換桌布時,獲取當前桌面桌布(已適應螢幕後的桌布),裁剪當前桌布適應statusbar,
將其設定為statusbar
背景,再採用高斯模糊處理演算法,實現模糊效果。關於透明度,可以通過設定
background
實現。
2.實現:
首先調整桌布鋪滿螢幕,當前桌布未充滿螢幕。修改offset
值為0,
桌布視窗繪製出現
y軸偏移,導致螢幕未能鋪滿。
再來看背景處理,分為兩種情況,乙個是靜態桌布,乙個是動態桌布。先來看靜態桌布,當tabletstatusbar
收到替換桌布
intent
時,分別有以下四個過程:
1) mbackground = mwall*****manager.getbitmap();
獲取當前桌面處理後的桌布。
2)根據螢幕大小,以及
statusbar
長寬,裁剪當前桌面桌布
bitmap result = bitmap.createbitmap(mbackground, clipx, clipy, clipw, cliph, null, false);
3)利用高斯模糊演算法,處理裁剪後桌布為模糊狀態,並可調整實際模糊度。
關於高斯模糊演算法可參考:
drawable drawable = boxblurfilter(result);
/** 水平方向模糊度 */
private static float hradius = 10;
/** 豎直方向模糊度 */
private static float vradius = 10;
/** 模糊迭代度 */
private static int iterations = 7;
4)設定背景
mstatusbarview.setbackgrounddrawable(drawable);
靜態桌布先告一段落,來看動態桌布,對於動態桌布,我們的方案是盡量尋找一張靜態來替代。
動態桌布的設定時,與靜態桌布設定不同,首先會setwall*****component
,所以在每次更換動態桌布時,傳送廣播,來到
code 2
,當tabletstatusbar
收到為動態桌布時,則設定背景為靜態。
以上是桌布替換動作時,相關處理邏輯。繼續來看,使用者開機後,statusbar
初始化時,設定背景。
在tabletstatusbar makestatusbarview()
方法中,傳送
msg_set_wz_statusbar_blur
訊息,handler
收到並處理:
關鍵方法是mwall*****manager.getwall*****info() != null
來判斷當前桌布是否為動態桌布或為靜態桌布,判斷後按
code2
相同邏輯,處理之,並最終實現
statusbar
背景模糊效果。
最後,還有一點是,透明背景效果的實現,在此用了乙個取巧的方法:
code 5:
frameworks/base/packages/systemui/res/layout/system_bar.xml
android:id="@+id/bar_contents"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:clipchildren="false" >
+ android:clipchildren="false"
+ android:background="#30000000" >
到此為止,statusbar
背景模糊透明效果基本實現。
android改變狀態列背景為應用背景
activity main.xml 中的root 布局中新增 android cliptopadding false android fitssystemwindows false 在介面activity的oncreat函式中新增 if build.version.sdk int build.ver...
android 透明狀態列(設定純色背景)
使用透明狀態列必須在 4.4 api19 以上,在5.0 api21 做了優化,所以需要不同適配。設定透明狀態列,採取的是使用較多的方法,設定不同style 建立 values v19 style.xml color colorprimary color color 2da568 color col...
Android透明狀態列 沉浸式狀態列
注意 android版本 4.4此方法有效 第一步 在activity的布局檔案中,根布局中加入以下第5 7行 第二步 新建類kitkatutils.class package cn.powerthink.djt.utils import android.annotation.suppresslin...