Android 状态栏背景模糊透明效果实现

1.整体思路:

更换壁纸时,获取当前桌面壁纸(已适应屏幕后的壁纸),裁剪当前壁纸适应statusbar

将其设置为statusbar背景,再采用高斯模糊处理算法,实现模糊效果。关于透明度,可以通过设置background实现。

2.实现:

首先调整壁纸铺满屏幕,当前壁纸未充满屏幕。修改offset值为0,壁纸窗口绘制出现y轴偏移,导致屏幕未能铺满。

再来看背景处理,分为两种情况,一个是静态壁纸,一个是动态壁纸。先来看静态壁纸,当tabletstatusbar收到替换壁纸intent时,分别有以下四个过程:

1) mBackground = mWallpaperManager.getBitmap();

获取当前桌面处理后的壁纸。

2)根据屏幕大小,以及statusbar长宽,裁剪当前桌面壁纸

Bitmap result = Bitmap.createBitmap(mBackground, clipX, clipY, clipW, clipH, null, false);

3)利用高斯模糊算法,处理裁剪后壁纸为模糊状态,并可调整实际模糊度。

关于高斯模糊算法可参考:http://blog.csdn.net/luohai859/article/details/25039795

Drawable drawable = BoxBlurFilter(result);

/** 水平方向模糊度 */

private static float hRadius = 10;

/** 竖直方向模糊度 */

private static float vRadius = 10;

/** 模糊迭代度 */

private static int iterations = 7;

4)设置背景

mStatusBarView.setBackgroundDrawable(drawable);

静态壁纸先告一段落,来看动态壁纸,对于动态壁纸,我们的方案是尽量寻找一张静态图片来替代。

动态壁纸的设置时,与静态壁纸设置不同,首先会setWallpaperComponent,所以在每次更换动态壁纸时,发送广播,来到code 2,当tabletstatusbar 收到为动态壁纸时,则设置背景为静态图片。

以上是壁纸替换动作时,相关处理逻辑。继续来看,用户开机后,statusbar初始化时,设置背景。

tabletstatusbar  makeStatusBarView()方法中,发送MSG_SET_WZ_STATUSBAR_BLUR消息,handler收到并处理:

关键方法是mWallpaperManager.getWallpaperInfo() != null 来判断当前壁纸是否为动态壁纸或为静态壁纸,判断后按code2相同逻辑,处理之,并最终实现statusbar 背景模糊效果。

最后,还有一点是,透明背景效果的实现,在此用了一个取巧的方法:

Code 5:

frameworks/base/packages/SystemUI/res/layout/system_bar.xml

 

         <RelativeLayout

             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 背景模糊透明效果基本实现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章