• 实现Launcher默认壁纸、选择壁纸定制化功能


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


    第一部分:客制化默认壁纸:
        Launcher默认的壁纸配置是放在frameworkres下面配置的,图片也是放在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;
                }
            }
    }

         

  • 相关阅读:
    曲线与直线相切
    两函数切线
    导数+放缩
    选取拟合函数
    二分法求零点次数
    奇函数+方程的根与零点
    对数函数绝对值交点问题
    判断函数相等+判断反函数+判断周期函数
    已知分段函数零点个数求范围
    2020-05-03 助教一周小结(第十二周)
  • 原文地址:https://www.cnblogs.com/bill-technology/p/4130796.html
Copyright © 2020-2023  润新知