Android簡(jiǎn)單實(shí)用的可拖拽GridView組件分享
前言
在我們?nèi)粘i_(kāi)發(fā)中,使用 GridView
這種網(wǎng)格視圖的場(chǎng)合還是不少的,比如照片墻、九宮格等等。有一個(gè)場(chǎng)景就是需要對(duì)網(wǎng)格的元素進(jìn)行拖拽排序,這個(gè)時(shí)候 Flutter 自帶的GridView
就無(wú)法滿足了。本篇我們來(lái)介紹一個(gè)支持拖拽的 GridView
組件,可以輕松搞定網(wǎng)格視圖的拖拽排序,這個(gè)組件就是 flutter_draggable_gridview
。
GraggableGridView 使用
flutter_draggable_gridview
使用一個(gè)DraggableGridViewBuilder
來(lái)構(gòu)建可拖拽的 GridView
,內(nèi)部實(shí)際上還是基于 GridView
實(shí)現(xiàn)的,因此 GridView
的一些配置還是可以沿用。DraggableGridViewBuilder
的一些特有的屬性如下:
chidren
:要求返回的子組件列表需要是DraggableGridItem
,實(shí)際上我們可以用DraggableGridItem
來(lái)包裹我們要展示的元素即可。isOnlyLongPress
:是否只有長(zhǎng)按才能觸發(fā)拖拽,默認(rèn)是true
。dragCompletion
:完成拖拽后的回調(diào),會(huì)告訴我們哪兩個(gè)元素進(jìn)行了位置互換,通過(guò)互換的元素的下標(biāo)我們可以知道拖拽后的次序。如果需要保存的話就可以提交拖拽后的次序到后端更新。dragFeedback
:一個(gè)回調(diào)函數(shù),當(dāng)拖拽開(kāi)始后可以返回一個(gè)組件,來(lái)突顯正在被控制拖動(dòng)的元素。通常是將原先的組件尺寸縮小。dragPlaceHolder
:元素被拖動(dòng)后,留下的空白位置的占位組件,可以自定義任何組件。
正常使用的時(shí)候,基本上我們把這些屬性設(shè)置好就能用了。比如下面的代碼:
DraggableGridViewBuilder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: MediaQuery.of(context).size.width / (MediaQuery.of(context).size.height / 3), ), children: _makeGridItems(12), isOnlyLongPress: true, dragCompletion: (List<DraggableGridItem> list, int beforeIndex, int afterIndex) { if (kDebugMode) { print('onDragAccept: $beforeIndex -> $afterIndex'); } }, dragFeedback: (List<DraggableGridItem> list, int index) { return SizedBox( width: 200, height: 150, child: list[index].child, ); }, dragStartBehavior: DragStartBehavior.start, dragPlaceHolder: (List<DraggableGridItem> list, int index) { return PlaceHolderWidget( child: Container( color: Colors.blue[100], ), ); }, )
這里的_makeGridItems
方法就是構(gòu)建子元素列表的方法,實(shí)際上就是用DraggableGridItem
包裹一層要顯示的組件。
List<DraggableGridItem> _makeGridItems(int count) { var colors = [ Colors.blue, Colors.red[400], Colors.amber, Colors.orange, Colors.purple ]; return List.generate( count, (index) => DraggableGridItem( isDraggable: true, child: Container( color: colors[index % colors.length], child: Center( child: Material( color: Colors.transparent, child: Text('$index'), ), ), ), ), ); }
DraggableGridItem
還有兩個(gè)參數(shù)可以供我們使用:
isDraggable
:是否可以拖拽, 默認(rèn)是false
,比如我們有些元素是固定不可以改變的(如置頂元素),那么就可以設(shè)置為false
。dragCallback
:在拖拽過(guò)程中,當(dāng)一個(gè)元素正在被推擠時(shí),回調(diào)函數(shù)中的第二個(gè)參數(shù)isDragging
會(huì)為true
。我們可以通過(guò)這個(gè)參數(shù)來(lái)做一些處理,比如高亮當(dāng)前被推擠的元素。
我們有了上面的框架后,大部分情況下,只需要控制要顯示的子元素和尺寸就可以了,比如我們換成圖片,只需要更改_makeGridItems
,將DraggableGridItem
的 child
的子組件更換為圖片組件就搞定了。
List<DraggableGridItem> _makeGridItems(int count) { var assetsName = [ 'images/earth.jpeg', 'images/fire.png', 'images/girl.jpeg', 'images/island-coder.png', 'images/mb.jpeg' ]; return List.generate( count, (index) => DraggableGridItem( isDraggable: true, dragCallback: (_, isDragging) { debugPrint('{$index}在拖拽:{$isDragging}'); }, child: Image.asset( assetsName[index % assetsName.length], fit: BoxFit.cover, ), ), ); }
總結(jié)
本篇向大家推薦了一款簡(jiǎn)單實(shí)用的可拖拽 GridView
組件,基本上可以滿足我們大部分支持拖拽的網(wǎng)格視圖應(yīng)用。大家如果有用過(guò)類(lèi)似的組件,也歡迎在評(píng)論區(qū)推薦一下。
以上就是Android簡(jiǎn)單實(shí)用的可拖拽GridView組件分享的詳細(xì)內(nèi)容,更多關(guān)于Android GridView組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android UI自定義ListView實(shí)現(xiàn)下拉刷新和加載更多效果
這篇文章主要介紹了Android UI自定義ListView實(shí)現(xiàn)下拉刷新和加載更多效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11如何在Android中實(shí)現(xiàn)一個(gè)簡(jiǎn)易的Http服務(wù)器
這篇文章主要介紹了如何在Android中實(shí)現(xiàn)一個(gè)簡(jiǎn)易的Http服務(wù)器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)
QR碼比普通一維條碼具有快速讀取和更大的存儲(chǔ)資料容量,也無(wú)需要像一維條碼般在掃描時(shí)需要直線對(duì)準(zhǔn)掃描儀。因此其應(yīng)用范圍已經(jīng)擴(kuò)展到包括產(chǎn)品跟蹤,物品識(shí)別,文檔管理,庫(kù)存營(yíng)銷(xiāo)等方面。本文講解Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)的步驟2021-06-06RecyclerView焦點(diǎn)跳轉(zhuǎn)BUG優(yōu)化的方法
這篇文章主要介紹了RecyclerView焦點(diǎn)跳轉(zhuǎn)BUG優(yōu)化的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Android apk 項(xiàng)目一鍵打包并上傳到蒲公英的實(shí)現(xiàn)方法
這篇文章主要介紹了Android apk 項(xiàng)目一鍵打包并上傳到蒲公英,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Flutter實(shí)現(xiàn)下拉刷新和上拉加載更多
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)下拉刷新和上拉加載更多,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08MobLink Android端業(yè)務(wù)場(chǎng)景簡(jiǎn)單說(shuō)明
這篇文章主要介紹了MobLink Android端業(yè)務(wù)場(chǎng)景簡(jiǎn)單說(shuō)明,MobLink的功能實(shí)現(xiàn)就是在分享前會(huì)將鏈接的參數(shù)信息保存到服務(wù)器,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-09-09Android Jetpack組件之ViewModel使用詳解
Android中的ViewModel是一個(gè)可以用來(lái)存儲(chǔ)UI相關(guān)的數(shù)據(jù)的類(lèi)。ViewModel的生命周期會(huì)比創(chuàng)建它的Activity、Fragment的生命周期長(zhǎng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-04-04Android播放assets文件里視頻文件相關(guān)問(wèn)題分析
這篇文章主要介紹了Android播放assets文件里視頻文件相關(guān)問(wèn)題分析,結(jié)合Android播放assets文件出現(xiàn)錯(cuò)誤的實(shí)際問(wèn)題給出了原因分析與解決方法參考,需要的朋友可以參考下2016-08-08