已经好久没更新Launcher系列文章,今天不解析源码,讲讲如安在Launcher里面添加桌面设置的功能。今朝很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能。例如小米MIUI的Launcher就有很雄厚编辑功能。今天开端会讲一下如何实现桌面编辑功能。网上对于实现Launcher一些编辑功能的文章凤毛麟角,根蒂根基没什么材料可以参考,只能靠本身摸索对比别人Launcher的结果。
桌面编辑功能我首要分为 壁纸设置、Widget插件、切换殊效、主题 4个项目组。这个主如果参考OPPO的做的,小我感觉Oppo这方面做得挺不错。今天先说说壁纸设置功能,长按桌面或者在WorkSpace按Menu键就可以打开编辑栏。下面给出两张做对比。第一张是编辑栏没有打开景象,第二张是打开编辑栏处于壁纸设置模块。
(PS:新建的QQ群,有爱好可以参加一路评论辩论:Android群:322599434)
1、编辑栏设计规划
这个编辑栏实现的根蒂根基思路跟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是一样的,两者只能有一个显示出来。
//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解析和批改的文章。
2、原生壁纸设置解析
Launcher原生就有一个壁纸设置功能,信赖解析过Launcher源码的伴侣都看过,我第二篇文章也简单解析了Launcher如何设置壁纸。所以壁纸设置功能实现不艰苦,只要移植原生的代码即可。下面简单解析首要须要移植的代码。
原生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)
{
//设置壁纸的操纵
Wallpaper(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根蒂根基用法。把上方壁纸加载和显示代码移植后根蒂根基就可以实现壁纸设置功能。
3、增长其他壁纸设置
我们因为把长按桌面功能直接改为显示编辑栏功能,所以本来选择其他壁纸的功能也没有了,这里须要增长一个进口给其他壁纸应用。我这里是增长了一个按钮在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 ;
}
4、结语
经由过程上方办法就可以移植壁纸设置功能,实现我上方结果图的功能。今上帝如果讲一下如何参加编辑模块到Launcher里面,当然,我这里只是此中一种实现体式格式。还可以参考其他Launcher的实现办法。
我这里主如果供给一种思路和批改办法给大师参考,跟着我解析过程应当也能实现响应功能,若是还不成以,只能说你对Launcher不熟悉,因为在Launcher编辑的功能里面,壁纸设置是最简单的。接下来的Widget插件会比壁纸设置难度大很多,要批改和编写的代码也很多。所以若是你对Launcher源码不熟悉,下面的就很难进行。