前言
進(jìn)入公眾號回復(fù)listview即可獲得demo的git地址。
之前寫的一篇文章《Creator之ScrollView那些事》中提到了官方Demo中提供的ListViewCtl,只是實(shí)現(xiàn)了縱向滑動,沒有實(shí)現(xiàn)橫向滑動。并且建議官方可以把功能做全然后放入組件庫中供開發(fā)者使用。然后有個牛逼大神說這個ListView不ok。要我對自己的公眾號內(nèi)容負(fù)責(zé)。我還以為有什么嚴(yán)重的bug,其實(shí)是打斷了合批操作。對于官方提供的ListViewCtr的操作方式肯定會打斷合批的 !不過對于一些簡單的需求,比如我上次文章中的這個截圖。這樣的列表需要合批嗎?我的需求就是少創(chuàng)建幾個節(jié)點(diǎn)就可以了。所以我覺得ok不ok還是要看需求吧!為什么tableview呼聲那么高,而Laya也在官方組件中支持了ListView,已經(jīng)是很好的說明了。ListView的局限
首先,這個ListView是有局限的,它直接將Item放入了content中,肯定會打斷合批操作;如果你有一個多列多行,并且item非常復(fù)雜的需求,那么用這個ListView肯定是不合適的。就好比你用一把殺雞的刀去殺一頭牛,不悲劇才怪!所以大家在看到別人分享東西的時候建議最好不要拿來主義,而是經(jīng)過分析后決定用還是不用,我相信作為程序猿,這點(diǎn)判斷能力還是有的!
其次 ,這個ListView不支持網(wǎng)格顯示。如果想要多行或者多列顯示,需要自己在一個Item中排列好。然后自己設(shè)置每個道具的顯示與隱藏,所以對于有多列顯示需求的情況還是比較復(fù)雜的。
那么我先說說ListView采用的原理,然后再說說如何改進(jìn)吧。
ListView采用的原理
根據(jù)可顯示區(qū)域的寬或者高計(jì)算出需要創(chuàng)建的道具的數(shù)量。然后多加一行或者一列,避免滑動的時候顯示不自然。滑動時,將離開可見區(qū)域的道具放到與滑動方向相反的一端重復(fù)使用。原理其實(shí)就這么兩點(diǎn),目的就是少創(chuàng)建節(jié)點(diǎn)。支持網(wǎng)格顯示的ListView——GridListView
首先我為之前的ListView增加了網(wǎng)格顯示能力,代碼中通過給定的spaceX和spaceY 結(jié)合可顯示區(qū)域的寬或者高計(jì)算可顯示的列數(shù)或者行數(shù)如果只是做了網(wǎng)格顯示能力而不做分層管理其實(shí)一樣有局限1。雖然比你直接把道具放入content中好很多,但是dc依然很高。支持分層管理的ListView——GridLayerListView
GridLayerListView 是繼承了GridListView,重寫了設(shè)置坐標(biāo)和添加節(jié)點(diǎn)的方法。這里的item依然被添加到了content中,只是此時的它已經(jīng)沒有子節(jié)點(diǎn)了,只是用來判斷是否離開顯示區(qū)域而存在的。同時在添加item的時候給item自定義了一個LIST屬性,用于保存子節(jié)點(diǎn)的引用,因?yàn)橐呀?jīng)不能通過item的children數(shù)組獲得子節(jié)點(diǎn)了。為每個子節(jié)點(diǎn)自定義一個屬性INIT_POS,保存本地坐標(biāo),更新位置的時候會用到。為了保證所有節(jié)點(diǎn)顯示位置的正確性,代碼中直接移除節(jié)點(diǎn)中存在的widget組件。當(dāng)你將一個ScrollView拖到界面上時,只需要調(diào)整ScrollView和view的寬高,代碼中直接刪除了默認(rèn)的item節(jié)點(diǎn)GridLayerListView并沒有使用對象池,如果確實(shí)有需要可以在getItem函數(shù)中自己通過對象池獲取道具。通過設(shè)置ScrollView的Horizontal 和 Vertical 改變滾動方向,同時只支持一個方向滾動。使用方式
將一個ScrollView拖到界面中,掛上GridLayerListView組件定義一個處理邏輯的組件掛到界面上,并在邏輯組件中聲明好使用的變量和函數(shù),設(shè)置好GridLayerListView的參數(shù)。(其實(shí)跟ListViiew的使用方式是一樣的)設(shè)置ScrollView 和View 的寬高,注意尤其是View的寬高,因?yàn)閂iew大小就是可見區(qū)域,代碼中會根據(jù)View的寬高判斷應(yīng)該顯示的列數(shù)或者行數(shù)。注意列數(shù)或者行數(shù)等于寬度或者高度/(item的寬度或者高度+橫向間距或者縱向間距)使用效果
為了看優(yōu)化的效果,用到的兩個紋理都去掉了Packable選項(xiàng)
不分層的GridListView dc=64在不分層管理的情況下,道具中的label是否設(shè)置為Char模式dc都是一樣的。分層+Label不為Char模式 dc=23分層+Label為Char模式 dc=9道具的預(yù)制體結(jié)構(gòu)道具使用情況根據(jù)后臺輸出可以看出,一共有35個需要顯示的道具,實(shí)際上只創(chuàng)建了3 x5 = 15個道具就搞定了,即使有再多需要顯示的道具,也只用這15個道具。dc 從64 減少到9,依然用上了ListView少創(chuàng)建,重復(fù)利用的原理,只是加上分層管,達(dá)到了這樣的效果,還算過得去吧。結(jié)語
以上是我在之前的ListView基礎(chǔ)上添加了網(wǎng)格顯示,分層管理等能力后寫出來的新組件,我給它起名叫GridLayerListView,是因?yàn)樗且粋€支持網(wǎng)格顯示,分層管理節(jié)點(diǎn)的ListView。一個既可以殺雞也可以殺牛的刀。就是對ListView情有獨(dú)鐘,沒辦法了。我并沒有說這個是最優(yōu)的方案,也不保證沒有bug(我還不是一個敢說自己寫的東西沒bug的牛人),思想僅供參考,大神可以繞道。如果你想將dc降到更低,那么你還需要做一些其他的優(yōu)化。建議閱讀文弱書生陳皮皮的《Cocos Creator 性能優(yōu)化:DrawCall》進(jìn)入公眾號回復(fù)listview即可獲得demo的git地址。
歡迎掃碼關(guān)注公眾號《微笑游戲》,瀏覽更多內(nèi)容。如果您覺得文章還可以,點(diǎn)贊、在看、分享、贊助都是對我最大的鼓勵,在下將感激不盡。
微信圖片_20190904220029.jpg
更多內(nèi)容
跨引擎游戲開發(fā)框架
小游戲SDK整合框架
使用四叉樹優(yōu)化碰撞檢
游戲開發(fā)中UI管理器的使用
小游戲開發(fā)中如何優(yōu)雅的使用本地存檔
sdk接入整合,用一個變量切換不同渠道
CocosCreator之AssetBundle使用方案分享
CocosCreator之填色游戲的一種實(shí)現(xiàn)方案
一個可屏蔽長短鏈接的網(wǎng)絡(luò)模塊
游戲開發(fā)中的人工智能
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的android listview 去掉水波纹效果_CocosCreator之分层管理的ListView的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。