Android 自定義 TabLayout

weixin_33843409發表於2016-09-12

TabLayout 的兩種互動方式

TabLayout 有兩種互動方式,第一種是通過滑動來選擇 Tab,第二種是通過點選來選擇 Tab。因此,當你在實現自定義 TabLayout 時,首先要保證自己對原元件的擴充套件能夠同時支援這兩種互動方式,其次要注意自己的擴充套件能夠複合這兩種互動方式的特點。

需求

  1. 所有的 Tab 都由標題和色塊組成;無論 Tab 是否被選中,標題的位置都位於整個 Tab 的正中;當 Tab 未被選中時,色塊的高度較低,在視覺上位於標題的下面;當 Tab 被選中的時候,色塊的高度較高,在視覺上包裹了標題;當 Tab 在未選中狀態和選中狀態之間切換時,色塊的高度逐漸變高或逐漸變低,文字的顏色元件變白或變黑。

  2. 滑動時,Tab 的漸變過程應該是由使用者控制的,使用者滑動的快慢對應漸變的快慢。

  3. 點選時,Tab 的漸變過程應該是不受使用者控制的,當使用者執行完點選操作後,原來的 Tab 進入反向漸變過程,被點選的 Tab 進入正向漸變過程。

  4. 需要提供的介面包括:設定 ViewPager 的介面;設定選中 Tab 的介面;增刪 Tab 後更新自定義 TabLayout 檢視的介面。

分析

  1. TabLayout 和 ViewPager 的配合 —— 當滑動時,通過 ViewPager 的原有 API 去更新 TabLayout 的檢視:通過重寫 onPageScrolled 方法實現 Tab 上的漸變效果;通過重寫 onPageSelected 方法實現 Tab 的移動居中。

  2. TabLayout 和 ViewPager 的配合 —— 當點選時,通過 TabLayout 的自定義 API 去更新 ViewPager 的檢視:通過獲取點選的 Tab 的下標來選中 ViewPager 的指定 Page。

  3. 色塊應該是一個繼承自 View 的類,可以設定高度和背景顏色,並提供讓高度漸變的介面(原始高度、最終高度、漸變型別);重寫 onDraw 方法,根據不斷改變的高度繪製不同高度的色塊。
    (待續)

相關文章