Android原生的 Launcher ,会在桌面的顶部和底部加一个渐变阴影的效果。如下图:
由于很多桌面都是基于原生桌面进行开发的,所以一些机型的手机上会保留有这个效果。个人猜测Google应该是考虑到状态栏的小图标是白色的,如果壁纸是浅色或白色,那么状态栏的小图标会很难认清,甚至看不见,所以加了这个一个效果。
最近项目里接到一个需求,需要把这个渐变阴影的效果去掉。
根据以往一些小小的经验,首先推测了下这个效果的实现方法。可以想到两种:
1、在桌面的xml布局文件中使用<gradient>标签,用了 android:startColor 和 android:endColor 属性来实现渐变效果。
2、可能Launcher在加载壁纸时,对壁纸图片进行了处理,直接在图片中加入了阴影效果。
带着自己的推测,按照关键信息去查看源码。只能说,理想很丰满。没有用到以上两种方式。只能从代码清单入手,挑一些关键字重点浏览,搜索设置背景的相关方法。功夫不负有心人,
在 packages/apps/Launcher3/src/com/android/launcher3/Launcher.java 中找到了相关方法 setWorkspaceBackground():
5.x 系统下:
private void setWorkspaceBackground(boolean workspace) {
mLauncherView.setBackground(workspace ? mWorkspaceBackgroundDrawable : null);
}
6.0和7.0系统下的实现略有不同,但是换汤不换药:
private void setWorkspaceBackground(int background) {
switch (background) {
case WORKSPACE_BACKGROUND_TRANSPARENT:
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
break;
case WORKSPACE_BACKGROUND_BLACK:
getWindow().setBackgroundDrawable(null);
break;
default:
// 实现阴影的代码
getWindow().setBackgroundDrawable(mWorkspaceBackgroundDrawable);
}
}
渐变效果的实现最终都是在壁纸的基础上,给launcher设置了一个 background 。该方法调用了图片资源: workspace_bg.9.png :
mWorkspaceBackgroundDrawable = getResources().getDrawable(R.drawable.workspace_bg);
图片存放在packages/apps/Launcher3/res/ 各分辨率适配的目录下。去掉阴影可以有两种方法:
1、直接注释掉 setWorkspaceBackground()中设置桌面background 的相关代码就行。
2、要是不嫌麻烦,也可以将 workspace_bg.9.png 替换成全透明的图片。
去掉渐变效果后,就是以下的样子:
那么,问题来了。去掉渐变效果后,由于状态栏和壁纸都是浅色的,会导致状态栏的图标可视性(用户体验)较差。所以相应的可能就需要进行状态栏颜色的修改。请见《android修改状态栏颜色的实现》