本篇文章主要介绍了" Launcher3--壁纸",主要涉及到方面的内容,对于Android开发感兴趣的同学可以参考一下:
在说Launcher上设置壁纸时,首先需要弄清楚的是,壁纸的设置属于系统行为,而不是Launcher的应用特性。在Launcher中,壁纸的设置最终也是...
在说Launcher上设置壁纸时,首先需要弄清楚的是,壁纸的设置属于系统行为,而不是Launcher的应用特性。在Launcher中,壁纸的设置最终也是通过调用系统壁纸设置接口来完成的,所有,不仅仅是Launcher,很多第三方应用也是可以设置壁纸的。
Android中,可以使用WallpaperManager这一壁纸管理类来设置壁纸,有如下几种方法,

我们可以根据壁纸资源的不同,选择合适的方法,其中,最后一个可以用来设置动态壁纸。
下面就来说说Launcher3中是如何设置壁纸的,我们直接从壁纸设置界面的入口说起,
/**
* Event handler for the wallpaper picker button that appears after a long press
* on the home screen.
*/
protected void onClickWallpaperPicker(View v) {
if (LOGD) Log.d(TAG, "onClickWallpaperPicker");
final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
pickWallpaper.setComponent(getWallpaperPickerComponent());
startActivityForResult(pickWallpaper, REQUEST_PICK_WALLPAPER);
if (mLauncherCallbacks != null) {
mLauncherCallbacks.onClickWallpaperPicker(v);
}
}
protected ComponentName getWallpaperPickerComponent() {
if (mLauncherCallbacks != null) {
return mLauncherCallbacks.getWallpaperPickerComponent();
}
return new ComponentName(getPackageName(), LauncherWallpaperPickerActivity.class.getName());
}
很显然,LauncherWallpaperPickerActivity就是壁纸设置界面了,LauncherWallpaperPickerActivity继承于WallpaperPickerActivity,WallpaperPickerActivity又继承于WallpaperCropActivity,这么多继承,看来这个界面还是比较复杂的。从命名来看的话,也是为了区分每个类的处理重点,WallpaperCropActivity用来进行壁纸的裁剪,将图片裁剪到合适的尺寸;WallpaperPickerActivity就是壁纸选择器,选择壁纸并设置;至于LauncherWallpaperPickerActivity,从代码中看到只是重写了父类的两个方法,没什么可分析的,这里我们重点分析WallpaperPickerActivity这个类。一、壁纸类型对象
作为内部类,定义在WallpaperPickerActivity类中,
public static abstract class WallpaperTileInfo {
protected View mView;
public Drawable mThumb;
public void setView(View v) {
mView = v;
}
public void onClick(WallpaperPickerActivity a) {}// 缩略图点击事件
public void onSave(WallpaperPickerActivity a) {}// 设置壁纸,并做一些保存操作
public void onDelete(WallpaperPickerActivity a) {}// 删除壁纸
public boolean isSelectable() { return false; }// 是否可选
public boolean isNamelessWallpaper() { return false; }// 壁纸是否没有名字
public void onIndexUpdated(CharSequence label) {// 更新索引
if (isNamelessWallpaper()) {
mView.setContentDescription(label);
}
}
}
壁纸对象的一个抽象类,不直接使用,具体的壁纸继承该类并根据自身特点扩展。壁纸来源有多个途径,如应用内置的壁纸、图库、第三方等,另外设为壁纸的方式也不一定相同,需要对不同来源区分处理,所有就定义了以下几个壁纸类对象,PickImageInfo--图片选择器,在Activity中添加属性,就可以隐式调用到,如图库
UriWallpaperInfo--通过图片的Uri来设置壁纸
FileWallpaperInfo--通过图片文件来设置壁纸
ResourceWallpaperInfo--Launcher3中内置的壁纸资源来设置
DefaultWallpaperInfo--系统默认壁纸,资源在framework中
这几个类实现其抽象父类中的方法,具体代码实现就不一一细说,后面说到具体方法时会举其中的例子来说明,这里对几个抽象方法已经做了注释。二、加载壁纸列表
图1是壁纸设置界面,界面简单,包含了壁纸列表、设置壁纸按钮以及壁纸预览图等。