android Launcher——ui架構

來源:互聯網
上載者:User

著手開發laucher 我個人覺得首先要從ui架構入手,瞭解清楚了ui架構對laucher就有了一個大致的瞭解,知道關鍵的幾個類在哪裡,對後面進一步深入地研究作出鋪墊。廢話不多說了,直接進入主題:

1.先看圖

這是我正在研究的一個800*480的launcher的ui架構圖,對應的案頭顯示效果如下:

下面一行應用是我修改案頭後的結果,在前面我的ui架構圖中沒有。
閑話不多說,下面就一一做出講解
1.DragLayer--DragLayer繼承FrameLayout,並在此基礎上組合了DragController實現拖放功能,DragLayer主要監聽下面兩個使用者事件
onInterceptTouchEvent
onTouchEvent
交給DragController進行處理,DragController根據是否在拖放中等資訊控制控制項拖放過程處理。
DragLayer 是Launcher這個activity的頂層view,Launcher2這個應用只有一個activity那就是Laucher.java

 

2.DeleteZone--開啟launcher.xml,DeleteZone預設是不顯示的android:visibility="invisible"
但是我們每次開始拖放表徵圖的時候DeleteZone就顯示了,它是怎麼實現的呢?DeleteZone實現了DragController.DragListener介面,DragListener提供兩個介面方法,
onDragStart:隱藏把手,顯示DeleteZone
onDragEnd:顯示把手,隱藏DeleteZone
分別在開始DragController開始拖放和結束拖放的時候被調用.
另外DeleteZone實現了DropTarget介面,一旦滑鼠把表徵圖拖放到DeleteZone,就會調用DeleteZone
實現的onDrop方法對應用表徵圖進行刪除處理。

 

3.ClippedImageView--螢幕左右移動按鈕,正常表徵圖很小,你只能看到小點,我設定view背景不透明為綠色如前面我的
ClippedImageView要注意三點,
--1.案頭左右移動時Drawable的變換,變換表徵圖列表可查看home_arrows_right.xml
,ClippedImageView通過把drawable傳遞給worksapce,當案頭切換時通過調用Drawable.setLevel函數實現不同表徵圖顯示。
--2.點擊ClippedImageView實現左右案頭切換,查看ClippedImageView的布局檔案
android:onClick="previousScreen",該屬性定義了一個ClippedImageView onClick事件響應函數,函數在布局檔案對應的Activity中定義
也就是在Launcher.java中定義
    /**
     * @Description:使用者點擊前一個案頭按鈕
     * @param v
     * @Others:
     */
    @SuppressWarnings({"UnusedDeclaration"})
    public void previousScreen(View v) {
        if (!isAllAppsVisible()) {
            mWorkspace.scrollLeft();
        }
    }
--3.在ClippedImageView初始化(Launcher.setupViews)中添加了長按事件OnLongClickListener有當長按ClippedImageView,會執行
launcher.onlongclick方法,方法執行顯示5個案頭的預覽微縮圖顯示,具體實現不做深入說明,後面將作深入研究。

 

4.RelativeLayout--android:id="@+id/all_apps_button_cluster",如前面右邊灰色豎狀條,它是一個相對布局對象,上面承載了三個view
中間是一個HandleView,是一個進入allappview的按鈕,HandleView的上下都是一個進入google搜尋的imageview
        --HandleView
                --1.點擊事件 傳遞給Launcher.onClick進行處理 顯示應用菜單view
                --2.長按事件 傳遞給Launcher.onLongClick進行處理,方法執行顯示5個案頭的預覽微縮圖顯示
        --google搜尋的imageview
                --onClick響應:android:onClick="launchHotSeat"

 

5.AllApps2D -- 菜單view,在launcher.xml中引用的是:
        <include
                layout="@layout/all_apps" />
all_apps.xml定義如下:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <include layout="@layout/all_apps_2d" />
    <!--include layout="@layout/all_apps_3d" /-->
</merge>
中間增加了一個層次,如果有需要可以定義自己的apps_3d布局
 AllApps2D包括兩個view
 --1.GridView android:id="@+id/all_apps_2d_grid" 應用菜單grid view 它是一個grid view 用來放應用表徵圖
                 GridView對應的Adapter實作類別是AppsAdapter,對應的Adapter布局檔案是:application_boxed.xml
 --2.view android:id="@+id/all_apps_2d_home" 應用菜單view右邊的home按鈕 ,點擊隱藏 AllApps2D

 

6.Workspace--使用者案頭包括5個workspace_screen,預設顯示的是:launcher:defaultScreen="0"
workspace繼承了viewgroup,5個workspace_screen作為它的child,值得注意它只接收CellLayout類型的child,workspace重寫了addview函數,
添加非CellLayout的child將拋異常
--Workspace長按事件仍由launcher.onLongClick來監聽
--Workspace實現了DropTarget, DragSource兩個介面,意味著Workspace既是拖放源,又是拖放目的地
--Workspace實現DragScroller介面,DragScroller介面提供兩個方法
    void scrollLeft();
    void scrollRight();
  在拖放過程被DragController調用實現案頭的左右滾動
  --CellLayout Workspace下的一個案頭布局,CellLayout也是ViewGroup的子類,上面我的案頭紅色地區就是CellLayout
  Workspace下有5個CellLayout順序排列,Workspace下布局檔案:android:scrollbars="horizontal"決定了5個CellLayout排列是橫向還是縱向的
  CellLayout被劃分成不同的cell空間,並使用boolean[][] mOccupied;來標識每個cell是否被佔用,先看CellLayout的布局檔案workspace_screen.xml:
          <com.android.launcher2.CellLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:hapticFeedbackEnabled="true"
                launcher:cellWidth="115dip"//每一個cell的寬度
                launcher:cellHeight="100dip"//每個cell的高度
                launcher:longAxisStartPadding="0dip"//cell距離父view CellLayout左邊距
                launcher:longAxisEndPadding="0dip"//cell距離父view CellLayout右邊距
                launcher:shortAxisStartPadding="0dip"//cell距離父view CellLayout上邊距
                launcher:shortAxisEndPadding="80dip"//cell距離父view CellLayout下邊距
                launcher:shortAxisCells="3"//對橫屏來說表示CellLayout cells行數
                launcher:longAxisCells="5"//對橫屏來說表示CellLayout cells列數
                android:background="#FF0000">               
        </com.android.launcher2.CellLayout>
        當縱向的控制項不夠cells排列時,cell將產生重疊,橫向不產生重疊,橫向每個cell間隔至少為0
        --CellLayout覆蓋重新實現了onMeasure方法,和onlayout方法,它限定了child view 使用的布局參數類型為CellLayout.LayoutParams因此企圖通過修改
        workspace_screen.xml來改變它的案頭布局是不會得以成功的,你必須修改CellLayout類
        --CellLayout.LayoutParams說明,CellLayout.LayoutParams下有幾個成員需要說明一下
                --cellX:該child view佔用的第幾列的cell(若橫向佔用多個cell,表示最左邊的cellx)
                --cellY: 該child view佔用的第幾行的cell(若縱向佔用多個cell,表示最上邊的celly)
                --cellHSpan:橫向跨越的列數
                --cellVSpan: 縱向跨越行數
                --isDragging:該child是否正在被拖動
                --regenerateId:是否重建view id

 

7.案頭表徵圖的四種類型
ItemInfo--所有類型的父類
        --ApplicationInfo 應用表徵圖項 應用菜單view中所有應用表徵圖的資料表示
        --FolderInfo 案頭檔案夾
                --UserFolderInfo 對應實現布局檔案R.layout.folder_icon
                --LiveFolderInfo 對應實現布局檔案R.layout.live_folder_icon
        --LauncherAppWidgetInfo 案頭組件
        --ShortcutInfo 應用捷徑 對應實現布局檔案R.layout.application

原文:http://blog.csdn.net/stonecao/article/details/6462357

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.