已經好久沒更新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