前言
進入公眾號回復listview即可獲得demo的git地址,
- 之前寫的一篇文章《Creator之ScrollView那些事》中提到了官方Demo中提供的ListViewCtl,只是實作了縱向滑動,沒有實作橫向滑動,并且建議官方可以把功能做全然后放入組件庫中供開發者使用,
- 然后有個牛逼大神說這個ListView不ok,要我對自己的公眾號內容負責,我還以為有什么嚴重的bug,其實是打斷了合批操作,對于官方提供的ListViewCtr的操作方式肯定會打斷合批的 !不過對于一些簡單的需求,比如我上次文章中的這個截圖,

這樣的串列需要合批嗎?我的需求就是少創建幾個節點就可以了,所以我覺得ok不ok還是要看需求吧!為什么tableview呼聲那么高,而Laya也在官方組件中支持了ListView,已經是很好的說明了,
ListView的局限
-
首先,這個ListView是有局限的,它直接將Item放入了content中,肯定會打斷合批操作;

如果你有一個多列多行,并且item非常復雜的需求,那么用這個ListView肯定是不合適的,就好比你用一把殺雞的刀去殺一頭牛,不悲劇才怪!所以大家在看到別人分享東西的時候建議最好不要拿來主義,而是經過分析后決定用還是不用,我相信作為程式猿,這點判斷能力還是有的! -
其次 ,這個ListView不支持網格顯示,如果想要多行或者多列顯示,需要自己在一個Item中排列好,然后自己設定每個道具的顯示與隱藏,所以對于有多列顯示需求的情況還是比較復雜的,
那么我先說說ListView采用的原理,然后再說說如何改進吧,
ListView采用的原理
- 根據可顯示區域的寬或者高計算出需要創建的道具的數量,然后多加一行或者一列,避免滑動的時候顯示不自然,

- 滑動時,將離開可見區域的道具放到與滑動方向相反的一端重復使用,

- 原理其實就這么兩點,目的就是少創建節點,
支持網格顯示的ListView——GridListView
- 首先我為之前的ListView增加了網格顯示能力,代碼中通過給定的spaceX和spaceY 結合可顯示區域的寬或者高計算可顯示的列數或者行數

- 如果只是做了網格顯示能力而不做分層管理其實一樣有局限1,雖然比你直接把道具放入content中好很多,但是dc依然很高,
支持分層管理的ListView——GridLayerListView
- GridLayerListView 是繼承了GridListView,重寫了設定坐標和添加節點的方法,


- 這里的item依然被添加到了content中,只是此時的它已經沒有子節點了,只是用來判斷是否離開顯示區域而存在的,
- 同時在添加item的時候給item自定義了一個LIST屬性,用于保存子節點的參考,因為已經不能通過item的children陣列獲得子節點了,
- 為每個子節點自定義一個屬性INIT_POS,保存本地坐標,更新位置的時候會用到,

- 為了保證所有節點顯示位置的正確性,代碼中直接移除節點中存在的widget組件,

- 當你將一個ScrollView拖到界面上時,只需要調整ScrollView和view的寬高,代碼中直接洗掉了默認的item節點

- GridLayerListView并沒有使用物件池,如果確實有需要可以在getItem函式中自己通過物件池獲取道具,

- 通過設定ScrollView的Horizontal 和 Vertical 改變滾動方向,同時只支持一個方向滾動,

使用方式
- 將一個ScrollView拖到界面中,掛上GridLayerListView組件

- 定義一個處理邏輯的組件掛到界面上,并在邏輯組件中宣告好使用的變數和函式,設定好GridLayerListView的引數,(其實跟ListViiew的使用方式是一樣的)

- 設定ScrollView 和View 的寬高,注意尤其是View的寬高,因為View大小就是可見區域,代碼中會根據View的寬高判斷應該顯示的列數或者行數,注意列數或者行數等于寬度或者高度/(item的寬度或者高度+橫向間距或者縱向間距)

使用效果
為了看優化的效果,用到的兩個紋理都去掉了Packable選項

- 不分層的GridListView dc=64

在不分層管理的情況下,道具中的label是否設定為Char模式dc都是一樣的, - 分層+Label不為Char模式 dc=23

- 分層+Label為Char模式 dc=9

- 道具的預制體結構

- 道具使用情況

根據后臺輸出可以看出,一共有35個需要顯示的道具,實際上只創建了3 x5 = 15個道具就搞定了, - dc 從64 減少到9,依然用上了ListView少創建,重復利用的原理,只是加上分層管,達到了這樣的效果,還算過得去吧,
結語
- 以上是我在之前的ListView基礎上添加了網格顯示,分層管理等能力后寫出來的新組件,我給它起名叫GridLayerListView,是因為它是一個支持網格顯示,分層管理節點的ListView,一個既可以殺雞也可以殺牛的刀,就是對ListView情有獨鐘,沒辦法了,
- 我并沒有說這個是最優的方案,也不保證沒有bug(我還不是一個敢說自己寫的東西沒bug的牛人),思想僅供參考,大神可以繞道,如果你想將dc降到更低,那么你還需要做一些其他的優化,建議閱讀文弱書生陳皮皮的《Cocos Creator 性能優化:DrawCall》
進入公眾號回復listview即可獲得demo的git地址,
歡迎掃碼關注公眾號《微笑游戲》,瀏覽更多內容,如果您覺得文章還可以,點贊、在看、分享、贊助都是對我最大的鼓勵,在下將感激不盡,

歡迎掃碼關注公眾號《微笑游戲》,瀏覽更多內容,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/27785.html
標籤:其他
