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