Launcher3壁纸的规格默认是:壁纸高度=屏幕高度,壁纸宽带=屏幕宽度*2倍
Android4.4的壁纸信息存放在/data/system/users/0/目录下,WallpaperManagerService启动后,会生成如下两个文件在/data/system/users/0/目录下:
static final String WALLPAPER = "wallpaper"; //设置的壁纸图片,一般为jpeg格式 static final String WALLPAPER_INFO = "wallpaper_info.xml"; //包含墙纸的规格信息:高、宽
Wallpaper_info.xml的解析可以查看WallpaperManagerService的loadSettingsLocked()方法。下面是WallpaperManagerService的启动时序图,不解释了,用的上朋友可以对着查看源码:
下面我们就应该在Launcher3里将壁纸的高、宽信息写入上面说的wallpaper_info.xml文件中(当然时机写入动作还是在Framework中),Launcher3只是将其自身需要的墙纸高、宽写入wallpaper_info.xml,你使用Go桌面,那肯定是在Go桌面设置高、宽了。
1. 找对位置后很简单,就是Launcher3的WallpaperCropActivity.java文件getDefaultWallpaperSize()。
static protected Point getDefaultWallpaperSize(Resources res, WindowManager windowManager) { Point minDims = new Point(); Point maxDims = new Point(); windowManager.getDefaultDisplay().getCurrentSizeRange(minDims, maxDims); int maxDim = Math.max(maxDims.x, maxDims.y); int minDim = Math.max(minDims.x, minDims.y); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { Point realSize = new Point(); windowManager.getDefaultDisplay().getRealSize(realSize); maxDim = Math.max(realSize.x, realSize.y); minDim = Math.min(realSize.x, realSize.y); } // We need to ensure that there is enough extra space in the wallpaper // for the intended // parallax effects final int defaultWidth, defaultHeight; if (isScreenLarge(res)) { defaultWidth = (int) (maxDim * wallpaperTravelToScreenWidthRatio(maxDim, minDim)); defaultHeight = maxDim; } else { defaultWidth = Math.max((int) (minDim * WALLPAPER_SCREENS_SPAN), maxDim); defaultHeight = maxDim; } return new Point(defaultWidth, defaultHeight); }
defaultWidth和defaultHeight分别赋值为屏幕的宽、高就行了。
2. cropImageAndSetWallpaper()方法,这个方法应该是设置墙纸时,按墙纸规格裁剪图片用到的,该法与上面一样。
3. 阻止Launcher3滑屏时,滑动墙纸:在Workspace.java中,注释updateOffset()方法的调用(有两处)。
未完待续,有不对的地方,请指正。