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


  Android4.0的Launcher自帶了一個簡單的分頁指示器,就是Hotseat上面那個線段,這個本質上是一個ImageView利用.9.png圖片做,效果實在是不太美觀,用測試人員的話,太丑了。特別是搭配其他風格的圖標和背景,的確不好看。所以打算自己重新寫一個指示器。這個所謂的分頁指示器作用很簡單,就是告訴用戶界面有多少分屏,目前處於第幾分屏。當然目前也有一些Launcher增強了這個功能,只要滑動這些指示器就可以 快速滑動桌面。

  今天給大家講講如何自定義一個分頁指示器,並添加到Launcher里面使用,滑動切換功能后續再講。默認的藍色分頁指示器~

(PS:新建的QQ群,有興趣可以加入一起討論:Android群:322599434)

 

1、自定義View

  為了實現自定義分頁指示器,需要先自定義一個View,這個也是為了后面可以方便增加其他功能進去,也不會打亂Launcher原來的代碼邏輯。最后我選擇使用LinearLayout作為這個View的容器,重載LinearLayout來做這個分頁指示器。使用LinearLayout只要橫向排布這些頁面圖標就可以。

 
         
//Edited by mythou
//http://www.cnblogs.com/mythou/
public class PageSlideIndicator extends LinearLayout
{
    private final static String TAG="OWL_PageIndicator";
   //控件頁面滑動,操作PagedView
    PagedView mPagedView=null;
    
    Context mContext;
    
    //其他頁面標識
    Drawable mNormalDrawable;
    //當前頁面標識
    Drawable mFocusDrawable;
    
    //總頁面數
    int mTotalPage=0;
    //當前頁面
    int mCurPageNum=0;

    //...............
}

  上面是我定義的一個分頁指示器類,主要的屬性就是兩個Drawable,分別代表兩張不同的圖片,當前頁面和其他頁面的圖片。之所以直接定義Drawable是因為,其他頁面指示器的數量是不確定的,這里直接把圖片Drawable保存好,方便后面創建ImageView使用。當然你也可以直接加載ImageView,動態維護一個隊列,只是會比較耗資源。

  另外還有兩個比較重要的屬性,總頁面數和當前頁面的序號。這兩個屬性決定了分頁指示器需要顯示的數量和那個位置顯示當前的頁面指示器。這兩個屬性的數據,我們都可以通過PagedView類里面獲取到。(添加這個頁面指示器需要對PagedView、Workspace、Launcher、AppsCustomizePagedView這些類有一定的了解)

  另外我還定義了一個PagedView的對象,這個是方便以后用來做滑動頁面時,需要調用PagedView的方法。滑動功能今天暫時不講,以后再說~

 

2、初始化分頁指示器

//Edited by mythou
//http://www.cnblogs.com/mythou/
  public void reflashIndacitor(int curPage, int totalPage)
    {
        mTotalPage = totalPage;
        mCurPageNum = curPage;
        //清空容器的view對象 this.removeAllViews();
        //添加分頁指示器
        for (int page = 0; page < mTotalPage; ++page) 
        {
       //View的屬性設置 LayoutParams layoutParams
= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParams.leftMargin=10; layoutParams.rightMargin=10;
       //新建ImageView,用來顯示分頁圖標 ImageView newPageImageView
= new ImageView(mContext);    //根據當前頁還是其他頁面設置對應圖標 if (page == mCurPageNum) { newPageImageView.setBackgroundDrawable(mFocusDrawable); } else { newPageImageView.setBackgroundDrawable(mNormalDrawable); } //把圖標添加到LinearLayout this.addView(newPageImageView, layoutParams); } }

  上面就是簡單的初始化過程,根據傳入的總頁面數和當前頁面號,設置相關圖片以及初始化LinearLayout。需要注意的是,上面的ImageView因為是動態創建的,所以需要使用LayoutParams類來設置相關的參數屬性。

 

3、資源文件引用

  下面我們看看如何在XML配置文件里面使用我們新編寫的類,這里只界面Workspace的配置。workspace和AllApp頁面里面是不一樣的配置。因為兩個界面引用了不同的View配置,所以如果你想兩個界面都使用自定義的分頁指示器,需要分別配置使用。原理基本一致,這里只介紹Workspace的配置。

 
         
//Edited by mythou
//http://www.cnblogs.com/mythou/
<!--分頁指示器 OWL -->
<com.android.launcher2.PageSlideIndicator
     android:id="@+id/workSpacePageIndicator" 
     android:layout_width="match_parent"  
     android:layout_height="wrap_content" 
     android:layout_marginBottom="153dp"
     android:layout_gravity="bottom"
     android:gravity="center_horizontal"
/> 

  上面是我在launcher.xml里面引用我們剛剛編寫的分頁指示器。至於這個View的位置,可以根據你實際界面需要自行調整,我這里是放到了hotseat上面。里面配置的屬性沒有什么特別,其實就是配置一個LinearLayout的屬性。

 

4、Launcher.java里面初始化

 
         
//Edited by mythou
//http://www.cnblogs.com/mythou/
//初始化頁面標識器 OWL
mPageSlideIndicator = (PageSlideIndicator)findViewById(R.id.workSpacePageIndicator);
mPageSlideIndicator.InitPageSlideIndicator(3, 1);
mPageSlideIndicator.setPageViewObject(mWorkspace);
mWorkspace.setPageIndicator(mPageSlideIndicator);

  接着我們在Launcher.java里面初始化這個類,可能會有人問為什么要在Launcher.java里面初始化而不是在workspace里面初始化,因為這個其實是使用了workspace里面的數據。原因是因為我們的XML配置文件是在launcher.xml文件里面引用的,我們需要找到對應的資源。初始化工作注意就是把頁面有多少頁和當前頁存放進去,我這里設置了一個固定值,因為我workspace默認只有3頁,當前頁面是第2頁。這個你可以默認設置,也可以在加載界面完成后,獲取workspace的數據再設置。另外就是把這個PageSlideIndicator對象傳遞給workspace類里面去,因為具體檢測頁面滑動切換都是在workspace里面完成(准確來說是PagedView)。

 

5、檢測滑動切換頁面

    
//Edited by mythou
//http://www.cnblogs.com/mythou/
  protected void onPageEndMoving() 
    {
        super.onPageEndMoving();
        if (isHardwareAccelerated()) 
        {
            updateChildrenLayersEnabled();
        } 
        else 
        {
            clearChildrenCache();
        }
        if (!mDragController.dragging()) 
        {
            if (LauncherApplication.isScreenLarge()) 
            {
                hideOutlines();
            }
        }
        mOverScrollMaxBackgroundAlpha = 0.0f;
        mOverScrollPageIndex = -1;
        if (mDelayedResizeRunnable != null) 
        {
            mDelayedResizeRunnable.run();
            mDelayedResizeRunnable = null;
        }
        //檢測頁面滑動完成,設置相關頁面切換
        mPageSlideIndicator.setCurrentPage(mCurrentPage, getPageCount());
    }

  然后把我們相關的頁面切換數據傳遞給PageSlideIndicator處理就可以了。如果對這些處理不了解的朋友,需要先了解Launcher里面PagedView和workspace關系以及他們之間如何處理滑動切換頁面,這個我前面的文章已經分析過,有興趣可以查閱我前面的文章。

  還有一點就是,如果想做出比較炫的效果,可以在這里加入動畫效果。例如淡入淡出的效果,用戶體驗會好一些。我這里只是簡單講解如何實現自定義分頁指示器。

  另外還有一點需要注意的是,如果你的頁面是動態變化(例如AllAPP界面里面)的,也就是說你的頁面數目是不固定的,需要檢測APP變化,並且監聽removeview等方法,然后動態修改你的頁面數目。ALlAPP界面里面就需要監聽頁面數目的變化,因為這個是不確定的,會根據用戶安裝軟件數目動態變化。

 

6、后語

  回頭看看,這已經是第11篇有關Launcher分析和修改的文章,不過今天看了一下,發現我那些Launcher的文章,看的人很少o(╯□╰)o  ,不知道是我寫得太菜還是搞Launcher開發的人比較少。不管怎樣,這個系列會繼續寫下去。

 

系列文章:

Android Launcher分析和修改1——Launcher默認界面配置(default_workspace)

Android Launcher分析和修改2——Icon修改、界面布局調整、壁紙設置

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

Android Launcher分析和修改4——初始化加載數據

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

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

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

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

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

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

 

Edited by mythou

原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3231000.html 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM