1. 程式人生 > >AOSP6.0.1 launcher3入門篇-解析DeviceProject.java及相關檔案

AOSP6.0.1 launcher3入門篇-解析DeviceProject.java及相關檔案

上一篇文章(AOSP6.0.1 launcher3入門篇—解析launcher.java檔案)描述了launcher3的載入過程,本篇文章記錄hotseat停靠方向和位置、隱藏頁指示器、Folder大小等。

首先介紹建構函式:

找到public DeviceProfile(Context context, InvariantDeviceProfile inv,
            Point minSize, Point maxSize,
            int width, int height, boolean isLandscape)
this.inv = inv;
 傳入InvariantDeviceProfile例項物件,InvariantDeviceProfile類負責hotseat的停靠方向,allapps按鍵進入cellLayout的佈局設定,包括指定裝置型號的app擺放形式(行、列設定)和icon大小,在文章最後對InvariantDeviceProfile類進行分析

this.isLandscape = isLandscape;
如果傳入的是true桌面為橫屏,false桌面為豎屏

isTablet = res.getBoolean(R.bool.is_tablet);
isLargeTablet = res.getBoolean(R.bool.is_large_tablet);
這裡呼叫的packages/apps/Launcher3/res/values/config.xml ,tablet和large_tablet預設為false

transposeLayoutWithOrientation =
                res.getBoolean(R.bool.hotseat_transpose_layout_with_orientation);
這裡也是呼叫config.xml,<bool name="hotseat_transpose_layout_with_orientation">true</bool>
允許hotseat設定停靠方向和停靠位置(比如放置在螢幕正中心位置),如果為false在橫屏模式下無效



 edgeMarginPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);
        desiredWorkspaceLeftRightMarginPx = 2 * edgeMarginPx;
        pageIndicatorHeightPx =
                res.getDimensionPixelSize(R.dimen.dynamic_grid_page_indicator_height);
        defaultPageSpacingPx =
                res.getDimensionPixelSize(R.dimen.dynamic_grid_workspace_page_spacing);
        overviewModeMinIconZoneHeightPx =
                res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_min_icon_zone_height);
        overviewModeMaxIconZoneHeightPx =
                res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_max_icon_zone_height);
        overviewModeBarItemWidthPx =
                res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_bar_item_width);
        overviewModeBarSpacerWidthPx =
                res.getDimensionPixelSize(R.dimen.dynamic_grid_overview_bar_spacer_width);
        overviewModeIconZoneRatio =
                res.getInteger(R.integer.config_dynamic_grid_overview_icon_zone_percentage) / 100f;
        iconDrawablePaddingOriginalPx =
                res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding);
                
這裡呼叫的packages/apps/Launcher3/res/values/dimens.xml



 if (isLandscape) {
            availableWidthPx = maxSize.x;
            availableHeightPx = minSize.y;
            如果是橫屏模式,採用x軸最大值,y軸最小值(比如比例為800*600)
        } else {
            availableWidthPx = minSize.x;
            availableHeightPx = maxSize.y;
            如果是豎屏模式,採用x軸最小值,y軸最大值(比如比例為600*800)
        }



private void updateAvailableDimensions(DisplayMetrics dm, Resources res)函式:

float scale = 1f;
預設比例
int drawablePadding = iconDrawablePaddingOriginalPx;
當folder展開時,folder的高度為iconSizePx + drawablePadding + fm上限得到folder的實際高度

updateIconSize(1f, drawablePadding, res, dm);
按實際比例計算出資料夾範圍、hotseat範圍


 Rect workspacePadding = getWorkspacePadding(false /* isLayoutRtl */);
 返回workspace空間,workspace是PageView型別,
 PageView大小可以在public void layout(Launcher launcher)中設定

private void updateIconSize(float scale, int drawablePadding, Resources res,
DisplayMetrics dm)函式:

hotseatBarHeightPx = iconSizePx + 4 * edgeMarginPx;
不修改xml的情況下,修改hotseatBarHeightPx值可以改變Hotseat空間大小,達到
Hotseat放置螢幕中間位置效果

hotseatBarHeightPx = (availableWidthPx  + iconSizePx + 6 * edgeMarginPx);
這個是修改後,hotseat空間範圍變大,看起來像放置到螢幕中間,按鈕觸發事件的範圍也會變大

private void computeAllAppsButtonSize(Context context)函式:

float padding = res.getInteger(R.integer.config_allAppsButtonPaddingPercent) / 100f;
修改hotseat空間內所有app(不包括allapps按鈕進入的CellLayout內app)的佔用比例
xml檔案所在位置/res/values/config.xml

public void layout(Launcher launcher)函式:

PagedView workspace = (PagedView) launcher.findViewById(R.id.workspace);
        lp = (FrameLayout.LayoutParams) workspace.getLayoutParams();
        lp.gravity = Gravity.CENTER;
        Rect padding = getWorkspacePadding(isLayoutRtl);
        workspace.setLayoutParams(lp);
        workspace.setPadding(padding.left, padding.top, padding.right, padding.bottom);
        workspace.setPageSpacing(getWorkspacePageSpacing(isLayoutRtl));
這段是建立workspace的程式碼,xml位置在res/下,如果是豎屏呼叫layout-port/launcher.xml,
橫屏呼叫layout-land/launcher.xml,修改xml可以實現主介面空白的效果

 <include layout="@layout/hotseat"
            android:id="@+id/hotseat"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
     +       android:visibility="gone" />
在hotseat欄位中增加“android:visibility="gone"”即可隱藏hotseat佈局

顯示空白主介面方法:
hotseat欄位增加“android:visibility="gone"”

<com.android.launcher3.Workspace
            android:id="@+id/workspace"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
         -   launcher:pageIndicator="@+id/page_indicator"
            launcher:defaultScreen="@integer/config_workspaceDefaultScreen">
        </com.android.launcher3.Workspace>
workspace欄位去掉“launcher:pageIndicator="@+id/page_indicator"”,不載入指示器

<com.android.launcher3.FocusIndicatorView
            android:id="@+id/focus_indicator"
            android:layout_width="0dp"
            android:layout_height="0dp" />
FocusIndicatorView欄位寬和高改為0dp,在allapps進入的CellLayout佈局中(二級桌面)長按app會顯示FocusIndicatorView檢視

page_indicator欄位增加“android:visibility="gone"”,不顯示頁指示器

下面回到程式碼中:
如果想在空白桌面中顯示所有app是可以實現的,只是目前使用的方式不太正確,按返回鍵會顯示出hotseat佈局

從// Layout the hotseat
        /*View hotseat = launcher.findViewById(R.id.hotseat);
開始註釋一直到 }*/  // Layout the Overview Mode上面的最後一個括號

增加下面一段程式碼
View allapps = launcher.findViewById(R.id.apps_view);
        lp = (FrameLayout.LayoutParams) allapps.getLayoutParams();
        lp.gravity = Gravity.CENTER;
        allapps.setLayoutParams(lp);
        allapps.setPadding(padding.left, padding.top, padding.right, padding.bottom);
啟動手機系統後即可看到allapps進入的CellLayout佈局和app,這種方式不太好,繼續探索新的方式...


下面說下hotseat停靠方向的修改:
進入InvariantDeviceProfile.java檔案:

進入InvariantDeviceProfile(Context context)函式:
找到portraitProfile = new DeviceProfile(context, this, smallestSize,largestSize,
                largeSide , smallSide, /*false*/false /* isLandscape */);
 修改false為true,參考下面
 portraitProfile = new DeviceProfile(context, this, smallestSize,largestSize,
                largeSide , smallSide,true );
 這是豎屏模式下,hotseat佈局右方停靠方式

landscapeProfile = new DeviceProfile(context, this, smallestSize,largestSize,
                largeSide, smallSide, false);
橫屏模式下,true改為false


相關推薦

AOSP6.0.1 launcher3入門-解析DeviceProject.java相關檔案

上一篇文章(AOSP6.0.1 launcher3入門篇—解析launcher.java檔案)描述了launcher3的載入過程,本篇文章記錄hotseat停靠方向和位置、隱藏頁指示器、Folder大小等。 首先介紹建構函式: 找到public DevicePr

AOSP6.0.1 launcher3入門—hotseat相關實現

在安卓桌面程式的主介面我們可以看到是由QsbSearchBar(上方搜尋框)、Workspace(頁檢視空間)、pageIndicator(頁指示器)、hotseat(底部檢視空間)四個部分組成,它們是

從零開始學習ASP.NET MVC 1.0 (一) 開天闢地入門

《從零開始學習ASP.NET MVC 1.0》 文章導航 一.摘要 隨著ASP.NET MVC 1.0版本的正式釋出, 我將本系列文章也更新到了1.0, 對於已經發表的文章我都會根據1.0版本重新編輯. 希望本系列文章能打給大家幫助. 二.前言 ASP.NET MVC是微軟官方提供的開源M

Elastic Search 新手筆記(1)——入門

前言 之前寫過一個關於Elastic Search的文章,當時的我還不會使用markdown,還不知道怎麼好好把自己所想的,總結成一個有條理的文章,所以我就想寫下了這一篇新文章,幫助自己消化所學的東西,也可以把知識分享給大家。 使用 版本 作業系

Android Studio2.0使用教程-入門

1.大體認知 1.1模式         AS是基於idea,而idea和eclipse有大的區別,有好處也有不好的地方,在一段時間裡,idea被認為是開發java最好用強大的ide工具,所以AS新建的時候有new application和new module開發。id

和我一起學 Selenium WebDriver(1)——入門

   zTree 東西不多,我也一直使用著原始的人工測試手段,隨著內容的不斷增多,測試起來就越發的繁雜,而且經常犯懶,這樣就會忽略很多本該發現的問題,而且也容易出現舊的bug 反覆出現的情況,這都是測試不規範造成的。要做好東西就要更加規範和嚴格,於是乎決定要學習一下 S

命令列工具之Cmder:(1入門

前置知識 系統:windows7 64位 軟體:Cmder 簡介 cmder是windows下的命令列工具,用來替代windows自帶的cmd。下載地址:http://cmder.net

1. DFT 入門-scan chain

DFT   --  design  for  test 三要素:輔助性設計, physical defects   結構性測試向量   是一種輔助性設計,利用這種輔助性設計 對根據 physical  defects  建立的 fault  model 進行求解產生的結構性測

Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解決方案

運行程序 分布式文件系 關於 啟動 exce ima trac set 判斷 Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解決方案 作者:

react-native系列(3)入門:使用VSCode除錯程式碼(debug)

VSCode是一款程式碼編輯器,是微軟的產品,這款編輯器非常受歡迎的一個原因是它支援很多外掛,當然也包括RN開發的外掛。VSCode的下載頁是:https://code.visualstudio.com/,直接下載安裝即可。 安裝好後,可以通過 ' Open Folder ' 選項

010Editor(v8.0.1最新版)逆向_演算法分析註冊機編寫(附可用key和原始碼)

010Editor(v8.0.1)逆向分析0x0軟體簡介010Editor是一款採用QT介面庫編寫的,相容多作業系統的十六進位制編輯軟體.功能強大,簡單易用.0x1逆向環境及工具系統環境:Window 7 32bit使用工具:OllyDbg,IDA本次測試版本為官方最新版:N

java基礎知識1:關鍵字;介面和抽象類;java併發相關

true、false、null都不是關鍵字 goto、const、是保留的關鍵字 abstract continue for new switch defa

由淺入深--探究Tomcat9.0---入門1

好幾個月沒寫部落格了,一是在籌備轉型事宜,二是一直在研究tomcat,現在總算有一些眉目了。現在將自己這幾個月的研究成果給各位看官奉上,希望大家喜歡。 本次原始碼分析預計分為五大專題 第一部分是Tomcat入門篇(元件介紹,啟動流程分析) 第二部分是手寫tomcat實現

Java應用基礎微專業-入門-第1章用程序來做計算

version mac ear 浮點 spa class pin system font p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px "PingFang SC" } p.p2 { margin: 0.0px 0.

Redis學習筆記1--入門

ase list ica cati ctu apple string replace first 一、Redis簡介: Redis(http://redis.io)是一款開源的、高性能的鍵-值存儲(key-value store),它是用ANSI C來編寫。Redis的項目

python函數0-1

ber ons log 應用場景 通過 color idt () 技術 創建類和對象 面向對象編程是一種編程方式,此編程方式的落地需要使用 “類” 和 “對象” 來實現,所以,面向對象編程其實就是對 “類” 和 “對象” 的使用。   類就是一個模板,模板裏可以包含多個函

Linux下的fdlisk - l 用法解析-入門

com png gen 結束 文件系統 解析 大小 bubuko 引導 fdlisk - l 的含義是查看linux下面的磁盤分區大小。這個大小包含了很多信息。 我們來看度娘的一則介紹: FDISK進行硬盤分區從實質上說就是對硬盤的一種格式化。當我們創建分區時,就已經

【helloworld】-微信小程序開發教程-入門1

基本 微信小程序開發 AI 彈出對話框 頁面 com 基本使用 alt 案例演示 1. 開篇導言 本節目標:旨在演示如何用開發者工具構建並運行簡單的 helloworld 應用。 目標用戶:無編程經驗,但對微信小程序感興趣的同學。 學習目標:開發者工具的基本使用流程

Spring Boot 2.0.1 入門教程

代碼生成 -i Coding fig IT code location sta -a 簡介 Spring Boot是Spring提供的一套基礎配置環境,可以用來快速開發生產環境級別的產品。尤其適合開發微服務架構,省去了不少配置麻煩。比如用到Spring MVC時,只需把sp

spring MVC框架(入門)-1

app 容器 入門 pri 初始 調度員 att url 結果 Spring Web MVC 簡稱(Spring MVC),是一個Spring提供給web應用的一個框架設計 1.MVC是什麽? MVC框架是一種理念,被廣泛應用到各類語言和開發中。 M-MODEL(模型層)