仿網易Tab分類排序控制項實現

来源:http://www.cnblogs.com/ganchuanpu/archive/2017/03/26/6619150.html
-Advertisement-
Play Games

1、XML佈局引入 2、設置數據源數據,也就是每個item的對應文本數據 3、設置監聽,用於交互點擊和長按的事件 4、開始排序和結束排序的介面 未完善的自定義功能 1、現在僅僅是支持String,並且佈局也無法自定義,後續可能會完善Tab的item的View的自定義輸入 2、現在佈局的行數和間距由硬 ...


1、XML佈局引入

<com.net168.lib.SortTabLayout 
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

2、設置數據源數據,也就是每個item的對應文本數據

//構造數據源,暫時僅支持String
List<String> data = new ArrayList<String>();
for (int i = 0; i < 20; i ++) {
    data.add("item" + i);
}
//設置數據源
vSortLayout.setShowData(data, 1);

3、設置監聽,用於交互點擊和長按的事件

vSortLayout.setOnSelectListener(new onSelectListener() {
    //點擊事件,點擊Tab佈局裡面的item觸發
    @Override
    public void onSelect(View v, int index) {
        Toast.makeText(MainActivity.this, "你點擊了item ,內容為:" + ((TextView)v).getText(), Toast.LENGTH_SHORT).show();
    }
    //長按事件,長按Tab佈局裡面的item觸發
    @Override
    public void onLongSelect(View v) {
        Toast.makeText(MainActivity.this, "長按Tab,開始排列", Toast.LENGTH_SHORT).show();
    }
});

4、開始排序和結束排序的介面

 //如果參數是true的話,開始排序,也就是可以拖動
vSortLayout.setIsMoveList(true);
//結束排序,並且會返回選擇tab的當前新位置
vSortLayout.getAndFinishSortData();

 

未完善的自定義功能

1、現在僅僅是支持String,並且佈局也無法自定義,後續可能會完善Tab的item的View的自定義輸入

2、現在佈局的行數和間距由硬代碼控制,並沒有形成簡便易懂的介面暴漏

PS:調試間距的方法,主要調試下列幾個參數

/**
 * 配置參數區域
 * mMaxRow : 每行的個數
 * Magin Width Tab的間隔和本身的寬度的占比
 * 例如mMaxRow = 4,則寬度會由此策略分配
 * |Magin|View|Magin|View|Magin|View|Magin|View|Magin|
 * 記控制項寬度為這麼分配 : 總寬度 = 5 * Magin + 4 * View, 而 Magin : View = mRowMagin : mRowWidth
 * 可以推導出各個控制項的寬度,高度也如此計算
 */
private final int mMaxRow = 4;
private final int mRowMagin = 5;
private final int mRowWidth = 26;
private final int mColumnMagin = 4;
private final int mColumnHeight = 10;

3、回滾不流暢,後期可以引入Scroller來控制緩慢回滾

 

實現原理

1、佈局item排序採用基於ViewGroup的自定義佈局,在onLayout的方法邏輯根據配置參數區域的參數進行計算配置

@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
    
    final int childCount = getChildCount();
    
    int row = 0;
    int column = 0;
    int startWidth = 0;
    int startHeight = 0;
    
    for (int i = 0; i < childCount; i++) {
        View childeView = childList.get(i);
        row = i / 4;
        column = i % 4;
        startWidth = (int) ((column * (mRowWidth + 2 * mRowMagin) + mRowMagin) * mChildeItemSize);
        startHeight = (int) ((row * (mColumnHeight + 2 * mColumnMagin) + mColumnMagin) * mChildeItemSize);
        childeView.layout(startWidth ,startHeight ,(int)(startWidth + mRowWidth * mChildeItemSize),
                 (int)(startHeight + mColumnHeight * mChildeItemSize));
    }
    
}

2、滑動模塊部分,在onTouchEvent裡面根據坐標的捕獲,有坐標分析出對應的子Item,利用View.layout()方法讓拖動的View跟隨手指移動,參加代碼

private void moveChildView(float x, float y) {
    if (mMoveChildView != null) {
        int left = (int) (((mChildIndex % 4) * (mRowWidth + 2 * mRowMagin) + mRowMagin) * mChildeItemSize);
        int top = (int) (((mChildIndex / 4) * (mColumnHeight + 2 * mColumnMagin) + mColumnMagin) * mChildeItemSize);
        int width = (int) (left + mRowWidth * mChildeItemSize);
        int heigth = (int) (top + mColumnHeight * mChildeItemSize);
        int moveX = (int) (x - beginX);
        int moveY = (int) (y - beginY);
        mMoveChildView.layout(left + moveX, top + moveY, width + moveX, heigth + moveY);
        mMoveChildView.invalidate();
    }
}

3、動畫模塊,由於考慮低版本和不想引入過多的開源庫,故採用普通的動畫實現
具體參見beginAnimation(final int start,final int end, boolean forward)方法。

4、整體流程

a、Touch的down事件,捕捉當前的x、y數據,計算出被移動的View的所對應index,並且其餘view開始抖動動畫

b、move事件,將被選中的view根據x、y利用layout方法進行跟隨手指移動

c、up事件,執行位置調整動畫,並且在調整完畢後,進行新位置的設置

 

完整代碼:https://github.com/ganchuanpu/SortTabLayout.git

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Qt的事件機制 事件過濾器: 可以讓一個對象偵聽攔截另外一個對象的事件。 實現原理: 在所有Qt對象的基類:QObject中有一個 類型為:QObjectList 名字為:eventFilters 的成員變數,當A給B安裝了事件過濾器後 B的eventList中就會保存A對象的指針, 在B處理事件之 ...
  • 東麓莊園游戲開發,東麓莊園系統開發,聯繫傑森團隊微電188-2624-7572. 前 言 東麓莊園震撼來襲,順應移動互聯網發展大趨勢,結合線下優質資源,帶動當地產業發展,實現財富與娛樂的全新體驗。東麓莊園農場游戲是寧夏賀蘭山東麓莊園酒業有限公司出品的線上游戲平臺,由西安鵬博網路科技有限公司搭建,寧夏 ...
  • 昨天面試一個比較資深的候選人,他談到設計模式一臉不屑的樣子,表示很不認同,說應該只瞭解幾個面向對象的設計原則就對了。 嗯,我相信他的水平可以超越設計模式,但是這種對設計模式不屑一顧的思想就很有問題了。 其實,設計模式就是招數和套路,初學者必須先學習前人總結的經驗,勤加練習,積累經驗,熟能生巧, 進而 ...
  • sc create "Memcached Server1" start= auto binPath= "D:\01_Soft\memcached\memcached.exe -d runservice -m 32 -p 11211 -l 127.0.0.1" DisplayName= "Memcac ...
  • 簡單工廠模式解釋: 簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern) 是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。 簡單工廠模式的UML圖: 簡單工廠模式 ...
  • https 和 SSH 的區別: 1、前者可以隨意克隆github上的項目,而不管是誰的;而後者則是你必須是你要克隆的項目的擁有者或管理員,且需要先添加 SSH key ,否則無法克隆。 2、https url 在push的時候是需要驗證用戶名和密碼的;而 SSH 在push的時候,是不需要輸入用戶 ...
  • 什麼是構建配置文件? 生成配置文件是一組可以用來設置或覆蓋 Maven 構建配置值的預設值。使用生成配置文件,你可以針對不同的環境,如:生產V/S開發環境自定義構建。 配置文件中指定 pom.xml 文件使用其配置文件/配置文件元素和多種方式來觸發。配置文件修改 POM 後,在編譯的時候是用來給不同 ...
  • 上一章我們完善了服務層的設計,傳送門:項目架構開發:服務層(下) 這次我們來完成項目的單機部署與集群部署,我們來看看單機部署與登錄 單機部署很簡單,這裡就不演示了,要註意的是我們用的是session來保存登錄信息 雖然Session不安全,比如sessionid被截獲那就可以在任何地方用你的賬號登錄 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...