需求功能说明:
    该定制需求为在系统中增加一个新的分区如myimage,用以实现存放定制资源。例如在myimage下新建wallpaper文件夹用于存放定制的墙纸图片资源,当Launcher加载默认墙纸或者选择设置墙纸时会优先从该路径下读取资源。




第一部分:客制化默认壁纸:
    Launcher默认的壁纸配置是放在framework下res下面配置的,图片也是放在framework下面,对于独立的第三方Launcher要想绕开framework实现默认壁纸则需要自身实现设置默认壁纸的功能。因此要在Launcher第一次运行或者重置时设置默认壁纸。实现方式为在Launcher.java类的onCreate()方法下的showFirstRunWorkspaceCling()执行设置默认壁纸的功能代码,如下:

  /*封装设置默认壁纸的方法*/

private void setDefaultWallpaper(){

WallpaperManager wm = (WallpaperManager)getSystemService(Context.WALLPAPER_SERVICE);

try{

wm.setBitmap(getBitmap("/myimage/wallpaper/wallpaper_01.jpg"));

}catch(Exception e){

e.printStackTrace();

}

}

/*得到绝对路径下的图片为bitmap类型*/

public Bitmap getBitmap(String path) {

Bitmap bitmap = null;

File file = new File(path);

if (file.exists())

bitmap = BitmapFactory.decodeFile(path);

return bitmap;

}

/*第一次启动时显示的指导画面*/

public void showFirstRunWorkspaceCling() {

setDefaultWallpaper();

......

}

第二部分 客制化选择壁纸:

由于在Launcher2中对墙纸资源的引用是通过id引用,但是当前客制化定制的文件路径为绝对路径如/myimage/wallpaper,也就说需要通过路径进行引用,因此修改如下:

第一步:wallpapers.xml

如:

<item>wallpaper_01</item>

<item>wallpaper_02</item>

<item>wallpaper_04</item>

<item>wallpaper_05</item>

<item>wallpaper_06</item>

<item>wallpaper_07</item>

<item>wallpaper_08</item>

注:每一项的值应与实际图片名字相同

第二步:修改WallpaperChooserDialogFragment.java类

 
 
    private ArrayList<String> mThumbs;
    private ArrayList<String> mImages;
    private void selectWallpaper(int position) {
        if (LauncherLog.DEBUG) {
            LauncherLog.d(TAG, "selectWallpaper: position = " + position + ", this = " + this);
        }
        try {
            WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(
                    Context.WALLPAPER_SERVICE);
            wpm.setBitmap(getBitmap(mImages.get(position)));
            Activity activity = getActivity();
            activity.setResult(Activity.RESULT_OK);
            activity.finish();
        } catch (IOException e) {
            Log.e(TAG, "Failed to set wallpaper: " + e);
        }
    }
 
    public Bitmap getBitmap(String path) {
        Bitmap bitmap = null;
        File file = new File(path);
        if (file.exists())
            bitmap = BitmapFactory.decodeFile(path);
        return bitmap;
    }
    private void findWallpapers() {
        mThumbs = new ArrayList<String>();
        mImages = new ArrayList<String>();
 
        final Resources resources = getResources();
        final String packageName = resources.getResourcePackageName(R.array.wallpapers);
        addWallpapers(resources, packageName, R.array.wallpapers);
        addWallpapers(resources, packageName, R.array.extra_wallpapers);
    }
 
    private void addWallpapers(Resources resources, String packageName, int list) {
        final String[] extras = resources.getStringArray(list);
        for (String extra : extras) {
            String res="/myimage/wallpaper/"+extra+".jpg";
            String thumbRes="/myimage/wallpaper/"+extra+"_small.jpg";
            mThumbs.add(thumbRes);
            mImages.add(res);
        }
    }
 
 
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
 
            if (convertView == null) {
                view = mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false);
            } else {
                view = convertView;
            }
 
            ImageView image = (ImageView) view.findViewById(R.id.wallpaper_image);
 
            String thumbRes = mThumbs.get(position);
            image.setImageBitmap(getBitmap(thumbRes));
            Drawable thumbDrawable = image.getDrawable();
            if (thumbDrawable != null) {
                thumbDrawable.setDither(true);
            } else {
                Log.e(TAG, "Error decoding thumbnail resId=" + thumbRes + " for wallpaper #"
                        + position);
            }
 
            return view;
        }
    }
        @Override
        protected Bitmap doInBackground(Integer... params) {
            if (isCancelled() || !isAdded()) {
                LauncherLog.d(TAG, "WallpaperLoader doInBackground: canceled = " + isCancelled()
                        + ",isAdded() = " + isAdded() + ",activity = " + getActivity());
                return null;
            }
            try {
                return BitmapFactory.decodeFile(mImages.get(params[0]), mOptions);
            } catch (OutOfMemoryError e) {
                LauncherLog.e(TAG, "WallpaperLoader decode resource out of memory " + e.getMessage());
                return null;
            }
        }
}

实现Launcher默认壁纸、选择壁纸定制化功能的更多相关文章

  1. Ubuntu 16.04 启用 点击Launcher图标,窗口实现最小化 功能

    安装了Ubuntu之后,要是每次都点击最小化按钮来实现窗口的最小化,操作起来很不方便,那么怎么样才能方便操作呢, Ubuntu 16.04 本身支持 点击应用程序Launcher图标实现最小化 功能, ...

  2. 为什么MES系统要定制化?看这三家汽车供应商的苦恼

    很多企业对于为什么要对MES系统进行选择和定制化很不理解,今天,小编通过一个故事给大家进行阐述—— 故事背景: 汽车电子行业的三家企业A,B,C. A是整车厂一级供应商,主要产品为汽车电子配电盒. B ...

  3. Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换

    已经很久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能.目前很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...

  4. 实现Launcher编辑模式(1) 壁纸更换

    Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换 Posted on 2013-09-11 23:25 泡泡糖 阅读(212) 评论(3) 编辑 收藏 已 ...

  5. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  6. Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段

    在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...

  7. Oracle Sales Cloud:管理沙盒(定制化)小细节1——利用公式创建字段并显示在前端页面

    Oracle Sales Cloud(Oracle 销售云)是一套基于Oracle云端的CRM管理系统.由于 Oracle 销售云是基于 Oracle 云环境的,它与传统的管理系统相比,显著特点之一便 ...

  8. 定制化Azure站点Java运行环境(1)

    Azure website提供了为现代化的web应用程序快速部署的PAAS平台,可以让用户几分钟之内快速的将自己的应用部署到云端,并且提供了自动扩展(auto-scaling),SSL,多种语言(Ja ...

  9. AI应用开发实战 - 定制化视觉服务的使用

    AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...

随机推荐

  1. 网页边框样式与style样式部分总结

    1).border边框样式:border-style:solid 边框样式值如下: none : 无边框.与任何指定的border-width值无关 hidden : 隐藏边框.IE不支持 dotte ...

  2. Android实现圆形图片

     情景再现: 写Android程序也有一段时间了,今天突然被问怎么实现一个圆形图片,很多app图像是圆形的.但是用户上传的图像可不是圆的,所以问题就来了,需要我们代码实现圆形图片.但是大脑飞转想到第三 ...

  3. 用超链接提交表单,实现在动态网页的url中隐藏参数

    动态网页中怎么隐藏url参数传递 我们在做动态网站的时候往往会在各个页面之间传递参数,而这些参数的名称和值都会在url地址栏中被暴露出来,这样一方面不安全,另一方面也不便于搜索引擎的收录,有的时候还有 ...

  4. 用Object字面量来代替swtich/if...else

    很多时候,if...else...有很多判断分支选项,就会见到: if (animal === 'dog') { // TO DO 'dog' } else if (animal === 'cat') ...

  5. PHP 常用函数的解释

    1.trim() 去掉字符序列左边和右边的空格 2.stripslashes() 去掉反斜线字符 3.htmlspecialchars() 把预定义的字符 "<" (小于)和 ...

  6. EntityFramework CodeFirst SQLServer转Oracle踩坑笔记

    接着在Oracle中使用Entity Framework 6 CodeFirst这篇博文,正在将项目从SQLServer 2012转至Oracle 11g,目前为止遇到的问题在此记录下. SQL Se ...

  7. 一生伏首拜阳明------<明朝那些事儿>

    一生伏首拜阳明. 王守仁,字伯安,别号阳明. 成化八年(1472),王守仁出生在浙江余姚,大凡成大事者往往出身贫寒,小小年纪就要上山砍柴,下海捞鱼,家里还有几个生病的亲属,每日以泪洗面.这差不多也是惯 ...

  8. php 数组的常用函数

    在php教程中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数  *  * 数组的排序函 ...

  9. Linux系统值得一看的学习方法及路线图

    网络是一个很神奇的东西,现代人的生活离不开网络,网络已深入人们的工作,生活,娱乐等方方面面.网络之所以无处不在,是因为它提供了诸多的网络服务,所以网络服务是网络的灵魂. 互联网上的各种网络服务是架构在 ...

  10. wxPython入门练习代码 四

    自定义Model文件abtractmodel.py: class AbstractModel(object): def __init__(self): self.listeners = [] def ...