已经好久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能。目前不少第三方Launcher或者定制Rom都有简单易用的桌面设置功能。例如小米MIUI的Launcher就有很丰富编辑功能。今天开始会讲一下如何实现桌面编辑功能。网上对于实现Launcher一些编辑功能的文章百里挑一,基本没什么资料能够参考,只能靠本身摸索对比别人Launcher的效果。html
桌面编辑功能我主要分为 壁纸设置、Widget插件、切换特效、主题 4个部分。这个主要是参考OPPO的手机作的,我的以为Oppo手机这方面作得挺不错。今天先说说壁纸设置功能,长按桌面或者在WorkSpace按Menu键就能够打开编辑栏。下面给出两张图片作对比。第一张是编辑栏没有打开状况,第二张是打开编辑栏处于壁纸设置模块。java
(PS:新建的QQ群,有兴趣能够加入一块儿讨论:Android群:322599434)android
一、编辑栏设计方案ide
这个编辑栏实现的基本思路跟Hotseat同样,也是编写一个独立的模块,而后嵌入到Launcher里面。若是对Hotseat已经有必定了解的朋友,作这个应该不困难。看上面效果图的功能就能够自动,我把编辑栏布局分为上下两部分,直接用LinearLayout布局就能够。因此我重载了LinearLayout,自定义一个ViewGroup实现编辑栏。布局
//Edited by mythou
//http://www.cnblogs.com/mythou/
public class WorkSpaceEdit extends LinearLayout { //....... }
WorkSpaceEdit就是我实现的编辑栏主要类,跟Hotseat同样。整个思路其实也是参考HotSeat的实现方法来的,Launcher里面的确有不少好的设计方案能够学习。而后咱们只要在Launcher配置文件里面加入WorkSpaceEdit的布局便可。默认状态设为不可见,由于它占用的位置跟Hotseat是同样的,二者只能有一个显示出来。post
//Edited by mythou
//http://www.cnblogs.com/mythou/
<!-- WorkSpace下面编辑菜单 mythou--> <include layout="@layout/workspace_edit" android:id="@+id/workspaceEditID" android:layout_width="match_parent" android:layout_height="160dp" android:layout_gravity="bottom" android:visibility="gone"/>
@layout/workspace_edit就是引用了编辑栏的布局文件,下面简单看看它如何布局,根部局就是咱们上面重载了LinearLayout的新的ViewGroup。编辑栏里面全部元素都被包含在里面。学习
//Edited by mythou
//http://www.cnblogs.com/mythou/
<com.android.launcher2.WorkSpaceEdit xmlns:android="http://schemas.android.com/apk/res/android" xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher" android:background="@drawable/workspace_edit_bg" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > //................. </com.android.launcher2.WorkSpaceEdit>
整个编辑栏的逻辑结构就是这样,跟Launcher结合的方式和Hotseat是如出一辙。这里多说一句,在咱们为Launcher增长一些新功能的时候,大可参考Launcher原生的代码,固然前提是你对Launcher源码有必定了解。对Hotseat有兴趣的朋友能够参考我之前编写的有关Hotseat分析和修改的文章。this
二、原生壁纸设置分析url
Launcher原生就有一个壁纸设置功能,相信分析过Launcher源码的朋友都看过,我第二篇文章也简单分析了Launcher如何设置壁纸。因此壁纸设置功能实现不困难,只要移植原生的代码便可。下面简单分析主要须要移植的代码。spa
原生Launcher的壁纸设置功能,代码都在WallpaperChooserDialogFragment.java里面,这是一个Fragment。既然是Fragment,咱们先去onCreateView看看如何加载和显示壁纸。
//Edited by mythou
//http://www.cnblogs.com/mythou/
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//查找wallpapers和extra_wallpapers里面的图片文件 findWallpapers(); /* * If this fragment is embedded in the layout of this activity, then we * should generate a view to display. Otherwise, a dialog will be * created in onCreateDialog() */ if (mEmbedded) { View view = inflater.inflate(R.layout.wallpaper_chooser, container, false); view.setBackgroundDrawable(mWallpaperDrawable); //经过Gallery控件显示壁纸 final Gallery gallery = (Gallery) view.findViewById(R.id.gallery); gallery.setCallbackDuringFling(false); gallery.setOnItemSelectedListener(this); gallery.setAdapter(new ImageAdapter(getActivity())); View setButton = view.findViewById(R.id.set); setButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {
//设置壁纸的操做 selectWallpaper(gallery.getSelectedItemPosition()); } }); return view; } return null; }
从上面能够看到,其实咱们要作的工做主要有两个,第一:加载默认的壁纸,第二:把壁纸关联到一个Gallery里面。Launcher默认的壁纸是经过XML加载的,由于壁纸文件名都写在XML文件里面,并且是区分了两个XML文件。下面咱们简单看看如何读取壁纸文件:
//Edited by mythou
//http://www.cnblogs.com/mythou/
private void addWallpapers(Resources resources, String packageName, int list) { final String[] extras = resources.getStringArray(list); for (String extra : extras) {
//经过文件名查找图片资源的ID int res = resources.getIdentifier(extra, "drawable", packageName); if (res != 0) { final int thumbRes = resources.getIdentifier(extra + "_small", "drawable", packageName); if (thumbRes != 0) {
//分别把缩略图和大图片加入到图片列表,这里保存的是图片资源ID mThumbs.add(thumbRes); mImages.add(res); // Log.d(TAG, "add: [" + packageName + "]: " + extra + " (" // + res + ")"); } } } }
从XML读取到图片文件的名字,而后经过包名加载对应文件的资源ID,把壁纸的缩略图和大图片分别保存到对应的列表里面,这里只是保存对应图片的资源ID。咱们只要把上面说的代码移植到咱们新编写的WorkSpaceEdit便可。设置壁纸代码这里很少说,能够自行查看源码。另外有关Gallery控件的使用,这里也很少说,能够看看我前面编写的Gallery使用的文章,或者百度一下Gallery基本用法。把上面壁纸加载和显示代码移植后基本就能够实现壁纸设置功能。
三、增长其余壁纸设置
咱们由于把长按桌面功能直接改成显示编辑栏功能,因此原来选择其余壁纸的功能也没有了,这里须要增长一个入口给其余壁纸使用。我这里是增长了一个按钮在Gallery里面,默认第一个Gallery元素就是其余壁纸的入口(PS:这个方案也是参考Oppo手机实现的)。能够在点击这个Item 的时候,咱们发送原生Launcher打开壁纸功能的Intent。在响应Gallery按下的回调方法onItemClick里面,咱们增长下面的处理:
//Edited by mythou
//http://www.cnblogs.com/mythou/
if (position==0) { //选择其余壁纸 final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER); Intent chooser = Intent.createChooser(pickWallpaper, mContext.getText(R.string.chooser_wallpaper)); ((Activity) mContext).startActivityForResult(chooser, REQUEST_PICK_WALLPAPER); return ; }
四、结语
经过上面方法就能够移植壁纸设置功能,实现我上面效果图的功能。今天主要是讲一下如何加入编辑模块到Launcher里面,固然,我这里只是其中一种实现方式。还能够参考其余Launcher的实现方法。
我这里主要是提供一种思路和修改方法给你们参考,跟着我分析过程应该也能实现相应功能,若是还不能够,只能说你对Launcher不熟悉,由于在Launcher编辑的功能里面,壁纸设置是最简单的。接下来的Widget插件会比壁纸设置难度大不少,要修改和编写的代码也不少。因此若是你对Launcher源码不熟悉,下面的就很难进行。
PS:最近遇到不少不顺心的事,但愿一切都好起来!
2013-9-11
Edited by 泡泡糖
系列文章:
Edited by mythou
原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3315569.html