1. 程式人生 > >Android Launcher分析和修改13——實現Launcher編輯模式(1) 桌布更換

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實現編輯欄。

public class WorkSpaceEdit extends LinearLayout
{
  
//....... }

  WorkSpaceEdit就是我實現的編輯欄主要類,跟Hotseat一樣。整個思路其實也是參考HotSeat的實現方法來的,Launcher裡面的確有很多好的設計方案可以學習。然後我們只要在Launcher配置檔案裡面加入WorkSpaceEdit的佈局即可。預設狀態設為不可見,因為它佔用的位置跟Hotseat是一樣的,兩者只能有一個顯示出來。

  <!-- 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。編輯欄裡面所有元素都被包含在裡面。

<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看看如何載入和顯示桌布。

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檔案。下面我們簡單看看如何讀取桌布檔案:

  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裡面,我們增加下面的處理:

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 泡泡糖

系列文章:

Edited by mythou

相關推薦

Android Launcher分析修改13——實現Launcher編輯模式(1) 桌布更換

  已經很久沒更新Launcher系列文章,今天不分析原始碼,講講如何在Launcher裡面新增桌面設定的功能。目前很多第三方Launcher或者定製Rom都有簡單易用的桌面設定功能。例如小米MIUI的Launcher就有很豐富編輯功能。今天開始會講一下如何實現桌面編輯功能。網上對於實現Launcher一些編

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android Launcher分析修改1——Launcher預設介面配置(default_workspace)

//Edited by mythou // //傳入default_workspace檔案的資源ID和資料庫實力,把xml裡面資料解析,儲存到Launcher資料庫。返回總共解析了多少個標籤。 private int loadFavorites(SQLiteDatabase db, int workspa

Android Launcher分析修改2——Icon修改、介面佈局調整、桌布設定

<!-- Workspace cell size --> <dimen name="workspace_cell_width_land">88dp</dimen> <dimen name="workspace_cell_width_port">

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

  接著上一篇文章,繼續分析AllAPP列表介面。上一篇文章分析了所有應用列表的介面構成以及如何通過配置檔案修改屬性。今天主要是分析PagedViewWithDraggableItems類,因為在我們分析AppsCustomizePagedView之前,需要先了解PagedViewWithDraggableI

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

  今天主要是分析一下Launcher裡面的所有應用列表。Android4.0 Launcher的所有應用列表跟2.X比較大的區別就是多了Widget的顯示。下面會詳細分析Launcher裡面有關所有應用列表配置和程式碼分析。   1、AllApp列表配置檔案 配置AllAPP應用列表介面的配置檔案

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

  Android4.0的Launcher自帶了一個簡單的分頁指示器,就是Hotseat上面那個線段,這個本質上是一個ImageView利用.9.png圖片做,效果實在是不太美觀,用測試人員的話,太醜了。特別是搭配其他風格的圖示和背景,的確不好看。所以打算自己重新寫一個指示器。這個所謂的分頁指示器作用很簡單,

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

public boolean onTouchEvent(MotionEvent ev) { if(OWL_DEBUG) Log.d(OWL, "onTouchEvent entering..");      //........switch (action &

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

  void addInScreen(View child, long container, int screen, int x, int y, int spanX, int spanY, boolean insert) { if(OWLLaunche

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

  本來想分析AppsCustomizePagedView類,不過今天突然接到一個臨時任務。客戶反饋說機器介面的圖示很難點選啟動程式,經常點選了沒有反應,Boss說要優先解決這問題。沒辦法,只能看看是怎麼回事。今天分析一下Launcher啟動APP的過程。從使用者點選到程式啟動的流程,下面針對WorkSpac

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

void resetLayout() {    //清空原來的內容 mContent.removeAllViewsInLayout(); //新增AllAPP按鈕,也是一個BubbleTextView物件 Context context = g

Android Launcher分析修改4——初始化載入資料

private void bindWorkspace() {       //通知Launcher開始繫結資料 mHandler.post(new Runnable() { public void run() {

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

@Override protected void onCreate(Bundle savedInstanceState)   { super.onCreate(savedInstanceState); //獲取Application 例項 La

Android Launcher分析修改12——Widget列表資訊收集

public void syncWidgetPageItems(final int page, final boolean immediate) { int numItemsPerPage = mWidgetCountX * mWidgetCountY; //

Kali Linux Web滲透測試手冊(第二版) - 2.6 - 使用瀏覽器自帶的開發工具來做基本的分析修改

翻譯來自:掣雷小組 成員資訊: thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt, 這個公眾號,一定要關注哦,慢慢會跟上面老哥們一起分享很多幹貨哦~~ 第二章:偵察 介紹 2.1、被動資訊收集 2.2、使用Recon-ng收集資訊 2.3、

Android記憶體分析調優(上)

PID    Vss        Rss        Pss       Uss      cmdline ...... 2319 42068K 42032K 13536K 7028K com.xxx ...... 該命令可以列出當前系統所有程序的記憶體佔用情況。 PID是程序ID。 Vss是佔用的虛擬

Android記憶體分析調優

在前文中討論瞭如果使用adb shell procrank, dumpsys meminfo和showmaps分析程序的記憶體佔用情況。 本文將繼續細化,具體分析導致記憶體過大的dalvik heap。 Dalvik heap分析和優化 Dalkvik heap是最常見的android應用記憶體優化的物件。

Java資料結構----棧(Stack)原始碼分析個人簡單實現

一、Stack原始碼分析 1.繼承結構  棧是資料結構中一種很重要的資料結構型別,因為棧的後進先出功能是實際的開發中有很多的應用場景。Java API中提供了棧(Stacck)的實現。   Stack類繼承了Vector類,而Vector類繼承了AbstractList抽象

問題的分析解決-思維能力或者思維模式

事情 分類 分層 tro 邏輯推理 預測 我們 本質 以及 原因分析:抓住事物本質。邏輯推理:把握事物之間的聯系,以及分清事物內部的邏輯關系思維策略:分層分類(金字塔那種感覺),反映為解決問題的策略結果預測:對事物發展趨勢做出判斷(對掌握的信息進行分析之後)抓住事物的本質

簡單的介面抽象類實現模板設計模式

一、先使用介面實現模板設計模式 1、先寫模板模式中大家公共的方法,將該方法放到一個接口裡: public interface MyPublic { public void step02(); } 2、寫模板類(step01和step03是公共的不變的方法,ste