Android Launcher分析和修改13——實現Launcher編輯模式(1) 壁紙更換


  已經很久沒更新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) {
           //設置壁紙的操作 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基本用法。把上面壁紙加載和顯示代碼移植后基本就可以實現壁紙設置功能。

 

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源碼不熟悉,下面的就很難進行。

PS:最近遇到很多不順心的事,希望一切都好起來!

 

2013-9-11

Edited by 泡泡糖

 

系列文章:

Android Launcher分析和修改1——Launcher默認界面配置(default_workspace)

Android Launcher分析和修改2——Icon修改、界面布局調整、壁紙設置

Android Launcher分析和修改3——Launcher啟動和初始化

Android Launcher分析和修改4——初始化加載數據

Android Launcher分析和修改5——HotSeat分析

Android Launcher分析和修改6——頁面滑動(PagedView

Android Launcher分析和修改7——AllApp全部應用列表(AppsCustomizeTabHost)

Android Launcher分析和修改8——AllAPP界面拖拽元素(PagedViewWithDraggableItems)

Android Launcher分析和修改9——Launcher啟動APP流程

Android Launcher分析和修改10——HotSeat深入進階

Android Launcher分析和修改11——自定義分頁指示器(paged_view_indicator)

Android Launcher分析和修改12——Widget列表信息收集

 

Edited by mythou

原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3315569.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM