1. 程式人生 > >Android Launcher分析和修改8——AllAPP介面拖拽元素(PagedViewWithDraggableItems)

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

  接著上一篇文章,繼續分析AllAPP列表介面。上一篇文章分析了所有應用列表的介面構成以及如何通過配置檔案修改屬性。今天主要是分析PagedViewWithDraggableItems類,因為在我們分析AppsCustomizePagedView之前,需要先了解PagedViewWithDraggableItems。這是因為他們是繼承關係。我們先看看AppsCustomizePagedView的類繼承關係。(以後部落格的圖片都會加上水印,因為發現很多轉載文章的人把所有作者資訊都刪除了,鄙視這種行為 ╭∩╮(︶︿︶)╭∩╮)

1、觸控攔截

  從上面的類關係圖我們可以看到,我們今天需要分析的PagedViewWithDraggableItems類是繼承了PagedView類。PagedView我在

第六篇文章裡面已經做了詳細分析。PagedView裡面主要就是實現了介面滑動操作,PagedView把頁面滑動的訊息在onInterceptTouchEvent()裡面攔截了,然後在onTouchEvent()裡面進行滑動頁面的處理。既然PagedViewWithDraggableItems也是繼承PagedView,我們先看看PagedViewWithDraggableItems有關觸控事件的攔截和處理。

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) 
    {
        
if(OWL_DEBUG) Log.d(OWL, "enter- onInterceptTouchEvent "); handleTouchEvent(ev); return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { if(OWL_DEBUG) Log.d(OWL, "enter- onTouchEvent "); handleTouchEvent(ev);
return super.onTouchEvent(ev); }

  PagedViewWithDraggableItems的onInterceptTouchEvent和onTouchEvent處理都很簡單,而且都呼叫了同一個處理方法。呼叫完handleTouchEvent(ev)方法後,會直接呼叫父類的相對應介面。父類的介面也就是PagedView的介面,這兩個攔截觸控訊息的回撥方法,我們在上一篇文章已經做了很詳細分析,這裡不再多說。根據程式碼執行順序,我們可以知道,介面會先呼叫PagedViewWithDraggableItems的onInterceptTouchEvent方法並且做了一些額外處理,然後才會呼叫PagedView的處理。下面我們看看PagedViewWithDraggableItems的handleTouchEvent方法做了什麼事。

2、handleTouchEvent方法

 private void handleTouchEvent(MotionEvent ev) 
    {
        final int action = ev.getAction();
        if(OWL_DEBUG) Log.d(OWL, "handleTouchEvent action="+(action & MotionEvent.ACTION_MASK)+
                " mTouchState="+mTouchState+" mIsDragging="+mIsDragging+" mIsDragEnabled="+mIsDragEnabled);
        switch (action & MotionEvent.ACTION_MASK) 
        {
            case MotionEvent.ACTION_DOWN: //按下事件處理
                cancelDragging();
                mIsDragEnabled = true;
                break;
            case MotionEvent.ACTION_MOVE: //進入滑動狀態
                if (mTouchState != TOUCH_STATE_SCROLLING && !mIsDragging && mIsDragEnabled) 
                {
            //根據是否進入滾動狀態,判斷是否需要拖曳按鈕
if(OWL_DEBUG) Log.d(OWL, "handleTouchEvent--->before drag "); determineDraggingStart(ev); } else { if(OWL_DEBUG) Log.d(OWL, "handleTouchEvent--->Not drag "); } break; } }

從上面程式碼我們可以看到handleTouchEvent裡面判斷了兩種觸控狀態:ACTION_DOWN和ACTION_MOVE。在ACTION_DOWN的時候會清理有關拖動圖示的標記。而在ACTION_MOVE的時候,會根據當前TouchState是不是滾動狀態,如果不是,進入拖動圖示操作。TouchState是根據PagedView裡面的狀態判斷的,這個我們分析TouchState的時候已經分析過。下面我們看看程式碼呼叫流程,下面是我加了列印訊息後,LogCat的訊息:

 

  上面是我結合PagedView類和PagedViewWithDraggableItems類對一次介面滑動的程式碼跟蹤 ,我們可以看到系統先呼叫PagedViewWithDraggableItems的onInterceptTouchEvent然後依次呼叫上面分析的程式碼。需要注意的是上面LogCat高亮喊資訊裡面,會跑到handleTouchEvent的ACTION_MOVE,然後呼叫determineDraggingStart()方法。不過這裡並不會呼叫PagedViewWithDraggableItems的determineDraggingStart()方法,而且呼叫了AppsCustomizedPagedView的方法,因為在AppsCustomizedPagedView裡面把這個方法重寫了。是一個空方法。

4、拖曳按鈕

  上面分析的流程是滑動介面執行的程式碼流程,下面我們看看如果你需要拖曳一個按鈕,會怎麼樣。Android裡面拖曳一個按鈕,首先需要除非LongClick訊息,也就是需要長按按鈕才行。下面我們跟蹤LogCat訊息看看程式碼執行情況:

  @Override
    public boolean onLongClick(View v) 
    {
        if(OWL_DEBUG) Log.d(OWL, "onLongClick Enter");
        
        //下面有幾種情況會取消長按觸控,不是觸控狀態,正在動畫過渡,離開了allAPP頁面
        if (!v.isInTouchMode()) return false;
        // Return early if we are still animating the pages
        if (mNextPage != INVALID_PAGE) return false;
        // When we have exited all apps or are in transition, disregard long clicks
        if (!mLauncher.isAllAppsCustomizeOpen() ||
                mLauncher.getWorkspace().isSwitchingState()) return false;
       
        if(OWL_DEBUG) Log.d(OWL, "onLongClick beginDragging()");
        //呼叫開始拖曳的設定,裡面會設定一些標記
        return beginDragging(v);
    }

  PagedViewWithDraggableItems的onLongClick()方法,只是執行了簡單的標記設定。到這裡應該可以瞭解PagedViewWithDraggableItems主要的作用,因為Launcher裡面很大一部分功能就是對於這種手勢操作的處理,所以有必要認真分析這幾個基類。為後面分析AppsCustomizedPagedView打好基礎。

Launcher分析系列文章:

Edited by mythou

相關推薦

Android Launcher分析修改8——AllAPP介面元素PagedViewWithDraggableItems

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

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

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

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

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

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分析修改3 Launcher啟動初始化

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

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

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

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; //

資料庫分庫分表(sharding)系列(五) 一種支援自由規劃無須資料遷移修改路由程式碼的Sharding擴容方案...

作為一種資料儲存層面上的水平伸縮解決方案,資料庫Sharding技術由來已久,很多海量資料系統在其發展演進的歷程中都曾經歷過分庫分表的Sharding改造階段。簡單地說,Sharding就是將原來單一資料庫按照一定的規則進行切分,把資料分散到多臺物理機(我們稱之為Shard)上儲存,從

隨機樣本一致性:一種用於影象分析自動製圖的模型擬合模型5--P4P的解析解

(一)P4P問題的解析解 條件:已知物平面和像平面中的四對同名像點;透視中心到像平面的距離(即攝影系統的焦距);像平面中主光點的位置(位置,也就是像平面中的座標,該點是主光軸在像平面上的焦點); 求解:透視中心相對於物方座標系統下的3維位置。 符號說明: (1)像

Android開發ViewPagerFragment結合使用實現新聞類app基本成型的app

//該類為我們的標題欄的自定義View public class MyLinearLayout extends LinearLayout { public MyLinearLayout(Context context, AttributeSet attrs) { super(cont

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應用記憶體優化的物件。