Launcher3桌面開發(fā)方案及重要類解析

實(shí)現(xiàn)方案

1.寫一個(gè)apk然后把系統(tǒng)的屬性加上去,然后啟動(dòng)的時(shí)候默認(rèn)就指定到這個(gè)apk的包名,他就啟動(dòng)。
優(yōu)點(diǎn):開發(fā)成本相對(duì)低,維護(hù)都是自己,所有代碼可控。
缺點(diǎn):必須熟練掌握事件分發(fā)機(jī)制:長(zhǎng)按,拖拽,點(diǎn)擊,雙擊,滑動(dòng)

2.基于Androidlauncher3的源碼去做一個(gè)定制化的修改
優(yōu)點(diǎn):比較穩(wěn)定,基本功能都有。
缺點(diǎn):熟悉Launcher3源碼,成本比較高,定制化功能需要了解。

Launcher3官方代碼下載:

https://android.googlesource.com/platform/packages/apps/Launcher3/

概述

市面上有很多桌面產(chǎn)品,比如91桌面,go桌面,小米桌面等等,雖說千差萬別,但都完成了桌面的基本任務(wù),比如說組織圖標(biāo),拖動(dòng)圖標(biāo),滑動(dòng)頁面,顯示小工具等等功能。桌面跟其他Android App很大的不同是,他只有一個(gè)Activity,但是這個(gè)Activity卻十分復(fù)雜,用幾個(gè)自定義View把Android的觸摸事件的處理玩兒的眼花繚亂,沒有長(zhǎng)時(shí)間的折騰是很難熟悉的。

Launcher3中的常用類
  • Launcher
    繼承Activity,主界面,用來顯示圖標(biāo),widget和文件夾等,它的布局就是桌面的基本結(jié)構(gòu),布局內(nèi)部為DragLayer,再嵌套了Workspace和hotseat。

Launcher3其實(shí)最主要的是一個(gè)Activity,基本上所有的操作都集中在這個(gè)Activity上,在Launcher.java 當(dāng)中,setContentView的參數(shù)是R.layout.launcher,我們暫時(shí)只研究下桌面豎屏的情況,相關(guān)源碼在res/layout-port/launcher.xml。

  • LauncherModel
    主要作用是加載數(shù)據(jù),處理數(shù)據(jù),保存桌面狀態(tài),內(nèi)部類LoaderTask用來初始化桌面。
public class LauncherModel extends LauncherApps.Callback implements InstallSessionTracker.Callback {
}
  • LauncherProvider
    繼承ContentProvider,主要處理數(shù)據(jù)庫的操作。
public class LauncherProvider extends ContentProvider {
}
  • compat
    兼容包,帶這個(gè)后綴的都是做兼容處理的類,比如(LauncherAppsCompat 【App列表的兼容類】AppweightManagerCompat【Appweight的兼容類】)。

  • DragLayer
    一個(gè)用來負(fù)責(zé)分發(fā)事件的viewGroup。

public class DragLayer extends BaseDragLayer<Launcher> implements LauncherOverlayCallbacks {
}
  • DragController
    DragLayer只是一個(gè)ViewGroup,具體的拖拽的處理都放到了DragController中。
public abstract class DragController<T extends ActivityContext>
        implements DragDriver.EventListener, TouchController {
}
  • DragView
    拖拽圖標(biāo)時(shí)跟隨手指移動(dòng)的view。
public abstract class DragView<T extends Context & ActivityContext> extends FrameLayout {
}
  • DatabaseWidgetPreviewLoader
    存儲(chǔ)Widget信息的數(shù)據(jù)庫,內(nèi)部創(chuàng)建了數(shù)據(jù)庫widgetpreviewsdb。

  • IconCache
    圖標(biāo)緩存類,應(yīng)用程序icon和title的緩存,內(nèi)部類創(chuàng)建了數(shù)據(jù)庫app_icons.db。

public class IconCache extends BaseIconCache {
}
  • ItemInfo
    桌面上每個(gè)Item的信息數(shù)據(jù)結(jié)構(gòu),包括在第幾屏第幾行,第幾列,寬高等信息,該對(duì)象與數(shù)據(jù)庫中記錄一一對(duì)應(yīng),該類有多個(gè)子類如:FolderIcon的FolderInfo,BubbleTextView的shorcutInfo。

  • LauncherAppWidgetHost
    AppWidgetHost子類,是桌面插件宿主,為了方便拖拽等才繼承處理。

class LauncherAppWidgetHost extends AppWidgetHost {
}
  • LauncherAppWidgetHostView
    AppWidgetHostView子類,配合LauncherAppWidgetHost得到HostView。

  • LauncherRootView
    豎屏模式下根布局,繼承了InsettavleFrameLayout,控制是否顯示在狀態(tài)欄下面。

public class LauncherRootView extends InsettableFrameLayout {
}
  • BubbleTextView
    圖標(biāo)都是基于他,繼承自TextView
public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
        IconLabelDotView, DraggableView, Reorderable {
}
  • Folder
    打開文件夾展示的view。

  • FolderIcon
    文件夾圖標(biāo)。

public class FolderIcon extends FrameLayout implements FolderListener, IconLabelDotView,
        DraggableView, Reorderable {
}
  • DragSource、DrogTarget
    拖拽接口,DragSource表示圖標(biāo)從哪里開始拖拽,DrogTarget表示圖標(biāo)被拖到了哪里。
public interface DragSource {
    void onDropCompleted(View target, DragObject d, boolean success);
}
默認(rèn)圖標(biāo)配置

default_workspace.xml
我們知道當(dāng)我們?cè)趩?dòng)Launcher的時(shí)候桌面會(huì)有一些已經(jīng)配置好的圖標(biāo),其實(shí)在第一次運(yùn)行Launcher的時(shí)候會(huì)讀取一個(gè)配置xml文件來進(jìn)行布局(launcher/res/xml/default_workspace.xml)這個(gè)文件可以配置App的快捷方式

這些事我們默認(rèn)的布局文件3 * 3,4 * 4,5 * 5,5 * 6表示桌面圖標(biāo)的列數(shù)和行數(shù),可以根據(jù)屏幕的大小來進(jìn)行適配選擇用那一個(gè)布局。

參考:
https://blog.csdn.net/chezabo6116/article/details/128223607
手把手教你打造一款個(gè)人專屬Android桌面
https://github.com/fookwood/Launcher3?tab=readme-ov-file
http://www.itdecent.cn/p/4b6ca081ea41

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容