基於duilib的虛擬列表實現

2021-09-13 01:12:16 字數 1377 閱讀 4170

本文由作者鄒啟文授權網易雲社群發布。

在郵箱大師選擇duilib作為ui開發庫後,我們面臨這樣乙個問題。隨著時間的積累,使用者資料會越來越多,如何保證我們的軟體在展示這些資料時依然保持非常好的體驗?

原生態duilib列表的實現是,資料與控制項(列表的每一項)一一對應,即有多少資料,便有多少控制項。通過粗略測試,我們發現,當資料量達到10000封郵件時,僅僅是構造這10000個控制項就需要花費16s,也就是說在這16s內,使用者無法操作軟體,這是我們無法接受的。所以,我們決定改進duilib列表,通過虛擬化的方式解決這個問題。

虛擬化,就是,對於10000封郵件,我們並不需要構造10000個控制項,因為真正可以讓使用者看見的不超過20(根據螢幕高度和控制項高度計算)個控制項,那麼,我們可以通過反覆利用這20個控制項來達到展示10000封郵件的目的。

那麼,具體如何實現呢?很簡單,在滑鼠上下滾動的時候,我們對這20個控制項重新布局(更改其位置)和更新其內容。

但是,產品和視覺提出了乙個需求,給列表滾動加上動畫效果,即使用者滾動列表鬆開滑鼠後,列表內容仍要向上或向下以一定的速度前進,之後才停下來。那麼,上面的方案便行不通,因為20個控制項在滾動時不斷重新布局和更新內容比較耗時,會導致列表出現卡頓式的前進,使用者體驗太差。如何解決這個問題呢?

我們的解決辦法是採用100個控制項。這樣,在滾動時判斷是否需要重新布局,如果不需要,則直接重新整理繪製新的郵件內容,如果到了臨界條件,那麼再重新布局然後繪製新的郵件內容。具體做法如下:

臨界條件的判斷:

假設滾動條的位置為yscrollpos,列表的區域為rclist,第乙個列表項的位置為rcfirst,最後乙個列表項的位置為rclast。

當yscrollpos > (rclast.bottom-rclist.top)-rclist.height時,為向下滾動的臨界條件;

當yscrollpos < rcfirst.top-rclist.top時,為向上滾動的臨界條件。

1,向下滾動到臨界條件

特別注意:存在靠近最底部時重新布局的情況,100個列表項的後面不可見的一部分項可以置為無效。

2,向上滾動到臨界條件

特別注意:存在靠近頂部時重新布局的情況,此時,與上面圖不同的是,大部分項會布局在下面,少部分在上面,但是沒有關係,因為此後向上滾動,不會再觸發重新布局。

目前郵箱大師中,虛擬列表應用在郵件列表、通訊錄列表、寫信聯絡人列表等,極大提高了軟體執行效能和體驗,而且執行穩定。

免費領取驗證碼、內容安全、簡訊傳送、直播點播體驗包及雲伺服器等**

基於Duilib的白板專案

1 設計之初就是想實現類似於辦公室玻璃牆的一樣的白板,可書寫,透明,還可以新增自己需要的工具 2 除了duilib不依賴其他的介面庫,可以插入到任何工程中。1 常規的圖形 矩形,橢圓,直線,箭頭,三角形,菱形 2 圖形的二次編輯 移動,刪除,新增 3 圖形儲存功能,通過序列化反序列化可以將圖形儲存成...

vue實現虛擬列表

當資料量較大 此處設定為10w 而且要用列表的形式展現給使用者,如果我們不做處理的話,在瀏覽器中渲染10w dom節點,是極其耗費時間的,那我的macbook air舉例,10w條資料渲染出來到能看到頁面,需要13秒多 實際應該是10秒左右 如果是使用者的話肯定是不會等乙個網頁十幾秒的 我們可以用虛...

實驗 實現基於MYSQL的FTP虛擬使用者

說明 本實驗在兩台centos主機上實現,一台作為ftp伺服器,一台做mysql資料庫伺服器。注意 須把selinux跟防火牆關閉。1.在ftp伺服器安裝所需要的包組。root anuuy yum install vsftpd root anuuy yum groupinstall developm...