launcher 壁纸相关

frameworks/base/core/java/android/app/WallpaperManager.java
壁纸信息是通过WallpaperManager.java管理的,WallpaperManager通调用服务WallpaperManagerService来完成
具体的实现

frameworks/base/services/java/com/android/server/WallpaperManagerService.java
从saveSettingsLocked方法可知
壁纸信息保存在路径 data/system/users/0/wallpaper_info.xml 中
文件记录的壁纸的宽度高度等信息

从loadSettingsLocked方法中可知
若获取的wallPaper的width小于 2*屏幕width
则wallPaper的width被设置成 2*屏幕width


1.如何添加修改壁纸列表?
packages/apps/Launcher2/src/com/android/launcher2/WallpaperChooserDialogFragment.java
从findWallpapers()方法,可以看到他是从wallpapers.xml的文件中读取壁纸信息列表的
默认壁纸
frameworks/base/core/java/android/app/WallpaperManager.java
从getDefaultWallpaperLocked(Context context)方法可以看到
默认壁纸读取的是frameworks/base/core/res/res/drawable-相关dpi/default_wallpaper.jpg


2.壁纸如何随着屏幕切换移动?
Workspace.java 方法
private void syncWallpaperOffsetWithScroll() {
        final boolean enableWallpaperEffects = isHardwareAccelerated();
        if (enableWallpaperEffects) {
            mWallpaperOffset.setFinalX(wallpaperOffsetForCurrentScroll());
        }
}
没有开启硬件加速,壁纸便不会随着手指滑动

3.壁纸选择器调用

final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
          Intent chooser = Intent.createChooser(pickWallpaper,
                  getText(R.string.chooser_wallpaper));
          startActivityForResult(chooser, REQUEST_PICK_WALLPAPER);

开启壁纸选择器,所有<intent-filter> <action android:name="android.intent.action.SET_WALLPAPER" />  所有action为android.intent.action.SET_WALLPAPER的应用都会进入壁纸选择列表,

默认壁纸在laucnher应用 WallpaperChooser.java

WallpaperChooserDialogFragment.onCreateView() 方法中调用 findWallpapers() 从制定路径获取壁纸列表

 

posted @ 2013-09-04 16:26  adam.li  阅读(474)  评论(0编辑  收藏  举报