最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

flutter實現帶刪除動畫的listview功能

 更新時間:2021年05月21日 15:40:50   作者:Mannaoz  
最近接了一個新項目,需要開發(fā)帶有刪除動畫效果的listview功能,在實現過程中列表滾動效果用listview實現的,本文通過實例代碼給大家分享實現過程,感興趣的朋友跟隨小編一起學習下吧

個人開發(fā)app中,需要開發(fā)一個帶有刪除功能的ListView

效果如下

需求動畫分析

列表可以滾動用listView,

有兩個動畫,第一個動畫是透明度變化,第二個是size變化

是順序執(zhí)行

實現過程

新建一個動畫頁面進行單獨控制

記得用statefulwidget類,這第二個動畫之間涉及到頁面刷新切換widget

記得with tickerproviderstatemixin 這個是動畫類狀態(tài)管理的必備

class AnimationListItem extends StatefulWidget {
  AnimationListItem();
  @override
  _AnimationListItemState createState() => _AnimationListItemState();
}

class _AnimationListItemState extends State<AnimationListItem>
    with TickerProviderStateMixin {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container();
  }
}

動畫流程

聲明

//控制器 
 AnimationController lucencyController;
  AnimationController sizeController;
// 動畫
  Animation<double> lucencyAnimation;
  Animation<double> sizeAnimation;

初始化

///必須在initstate這個生命周期進行初始化
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    lucencyController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 150));
    lucencyAnimation = Tween(begin: 1.0, end: 0.0).animate(
        CurvedAnimation(parent: lucencyController, curve: Curves.easeOut));

    sizeController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 250));
    sizeAnimation = Tween(begin: 1.0, end: 0.0).animate(
        CurvedAnimation(parent: sizeController, curve: Curves.easeOut));
  }

注銷

@override
  void dispose() {
    lucencyController.dispose();
    sizeController.dispose();
    super.dispose();
  }

最后內容呈現

class AnimationListItem extends StatefulWidget {
  AnimationListItem();
  @override
  _AnimationListItemState createState() => _AnimationListItemState();
}

class _AnimationListItemState extends State<AnimationListItem>
    with TickerProviderStateMixin {
  AnimationController lucencyController;
  AnimationController sizeController;

  Animation<double> lucencyAnimation;
  Animation<double> sizeAnimation;

  bool isChange = false;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    lucencyController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 150));
    lucencyAnimation = Tween(begin: 1.0, end: 0.0).animate(
        CurvedAnimation(parent: lucencyController, curve: Curves.easeOut));

    sizeController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 250));
    sizeAnimation = Tween(begin: 1.0, end: 0.0).animate(
        CurvedAnimation(parent: sizeController, curve: Curves.easeOut));
  }

  @override
  Widget build(BuildContext context) {
    return buildItemBox();
  }

  @override
  void dispose() {
    lucencyController.dispose();
    sizeController.dispose();
    super.dispose();
  }

  Widget buildItemBox() {
    return isChange
        ? SizeTransition(
            axis: Axis.vertical,
            sizeFactor: sizeAnimation,
            child: Container(
              height: duSetWidth(100),
              width: double.infinity,
            ),
          )
        : FadeTransition(
            opacity: lucencyAnimation,
            child: Container(
              alignment: Alignment.center,
              padding: EdgeInsets.only(
                left: duSetWidth(15),
                right: duSetWidth(15),
              ),
              height: duSetWidth(100),
              child: buildRow(),
            ),
          );
  }

  Widget buildRow() {
    ///設置顯示的樣式
    bool _isSub = false;
    Color _isSubColor = Color.fromRGBO(245, 77, 130, 1);
    Color _isSubBackColor = Colors.transparent;

    Widget isSubWidget = InkWell(
      child: Container(
        alignment: Alignment.center,
        width: duSetWidth(55),
        height: duSetWidth(28),
        decoration: BoxDecoration(
          color: _isSubBackColor,
          border: Border.all(color: _isSubColor),
          borderRadius: BorderRadius.circular(duSetWidth(15)),
        ),
        child: Text(
          '+ 書架',
          style: TextStyle(
            color: _isSubColor,
          ),
        ),
      ),
      onTap: () {
        if (_isSub)
          print('dasd');
        else
          print('dsada');
      },
    );

    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        Container(
          width: duSetWidth(60),
          height: duSetWidth(80),
          child: ClipRRect(
            borderRadius: BorderRadius.circular(duSetWidth(5)),
            child: Image.network(
              'https://gimg2.baidu.com/image_search/src=http%3A%2F%2F00.minipic.eastday.com%2F20170307%2F20170307164725_114ea3c04f605e59bd10699f37870267_13.jpeg&refer=http%3A%2F%2F00.minipic.eastday.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1623596389&t=946dba98698d8d67d773ea8f7af55f45',
              fit: BoxFit.cover,
            ),
          ),
        ),
        Container(
          width: duSetWidth(155),
          height: duSetWidth(80),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Container(
                height: duSetWidth(25),
                alignment: Alignment.centerLeft,
                width: double.infinity,
                child: Text(
                  '這是標題',
                  maxLines: 1,
                  overflow: TextOverflow.ellipsis,
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: duSetFontSize(16),
                  ),
                ),
              ),
              Container(
                height: duSetWidth(20),
                alignment: Alignment.centerLeft,
                width: double.infinity,
                child: Text(
                  '這是副標題',
                  maxLines: 1,
                  overflow: TextOverflow.ellipsis,
                  style: TextStyle(
                    color: Color.fromRGBO(162, 168, 186, 1),
                    fontSize: duSetFontSize(14),
                  ),
                ),
              ),
            ],
          ),
        ),
        Container(
          width: duSetWidth(100),
          height: duSetWidth(80),
          padding: EdgeInsets.only(
            top: duSetWidth(4),
          ),
          alignment: Alignment.center,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              isSubWidget,
              InkWell(
                onTap: () async {
                  await lucencyController.forward();
                  setState(() {
                    isChange = true;
                    sizeController.forward();
                  });
                },
                child: Container(
                  alignment: Alignment.center,
                  width: duSetWidth(35),
                  height: duSetWidth(28),
                  decoration: BoxDecoration(
                    border: Border.all(
                      color: Color.fromRGBO(113, 118, 140, 1),
                    ),
                    borderRadius: BorderRadius.circular(duSetWidth(15)),
                  ),
                  child: Icon(
                    Icons.delete,
                    color: Color.fromRGBO(113, 118, 140, 1),
                    size: duSetFontSize(16),
                  ),
                ),
              ),
            ],
          ),
        )
      ],
    );
  }
}

dusetwidth是我自定義的函數可以不用管,自己替換

下列是在頁面使用

class HistoryPage extends StatefulWidget {
  @override
  _HistoryPageState createState() => _HistoryPageState();
}

class _HistoryPageState extends State<HistoryPage> {
 
 @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ListView(
        children: [
          AnimationListItem(),
          AnimationListItem(),
          AnimationListItem(),
          AnimationListItem(),
        ],
      ),
    );
  }

  /// 構造appbar
  Widget buildAppabr() {
    return AppBar(
      backgroundColor: Color.fromRGBO(33, 39, 46, 1),
      brightness: Brightness.dark,
      centerTitle: true,
      title: Text(
        '瀏覽記錄',
        style: TextStyle(
          fontSize: duSetFontSize(16),
          color: Colors.white,
        ),
      ),
      leading: IconButton(
        icon: Icon(
          Icons.arrow_back_ios,
          color: Colors.white,
          size: duSetFontSize(18),
        ),
        onPressed: () {
          Get.back();
        },
      ),
    );
  }
}

這個我原來是準備使用animatedList來進行實現的,最后發(fā)現,animatedList里面只能設置移除動畫,不能實現補位動畫

第一個透明度的動畫就是移除動畫,第二個size變化就是補位動畫,

animatedList沒有補位,所以下方list直接移動上去會顯得非常突兀,我看了看源碼,修改較為麻煩。所以就直接用動畫變換來寫

這個List內的內容,并不是直接移除,而是替換成高低為0 的一個盒子

如果有animatedList簡單的改造實現的補位動畫,希望留言給我地址,非常感謝

到此這篇關于flutter實現帶刪除動畫的listview功能的文章就介紹到這了,更多相關flutter listview刪除內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android原生繪圖工具Paint詳細

    Android原生繪圖工具Paint詳細

    這篇文章要給大家分享的是Android原生繪圖工具Paint,android中提供了類似的工具Canvas和Paint,分別對應畫布和畫筆,本文就來介紹Androi中的Paint,感興趣的小伙伴一起來學習下面文章內容
    2021-09-09
  • RecyclerView實現流式標簽單選多選功能

    RecyclerView實現流式標簽單選多選功能

    RecyclerView是Android一個更強大的控件,其不僅可以實現和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。這篇文章主要介紹了RecyclerView實現的流式標簽單選多選功能,需要的朋友可以參考下
    2019-11-11
  • 安卓模擬器genymotion的安裝與使用圖文教程

    安卓模擬器genymotion的安裝與使用圖文教程

    這篇文章主要為大家詳細介紹了安卓模擬器genymotion的安裝與使用圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android Studio中主題樣式的使用方法詳解

    Android Studio中主題樣式的使用方法詳解

    這篇文章主要介紹了Android Studio中主題樣式的使用方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android使用ViewDragHelper實現圖片下拽返回示例

    Android使用ViewDragHelper實現圖片下拽返回示例

    這篇文章主要介紹了Android使用ViewDragHelper實現圖片下拽返回示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Android自定義彈出框dialog效果

    Android自定義彈出框dialog效果

    這篇文章主要為大家詳細介紹了Android自定義彈出框dialog效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • android輕松管理安卓應用中的log日志 發(fā)布應用時log日志全部去掉的方法

    android輕松管理安卓應用中的log日志 發(fā)布應用時log日志全部去掉的方法

    android合理的管理log日志,在開發(fā)的時候打印出來,在發(fā)布的時候,把所有的log日志全部關掉,下面就把方法給你一一道來
    2013-11-11
  • Android10.0實現本地音樂播放(附源碼下載)

    Android10.0實現本地音樂播放(附源碼下載)

    這篇文章主要介紹了Android10.0實現本地音樂播放(附源碼下載),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • android notification 的總結分析

    android notification 的總結分析

    notification是一種出現在任務欄的提示,特別是在4.0以后notification改進了不少,本文內容都是基于4.0及4.1以后總結來的
    2013-05-05
  • OpenHarmony如何調用電話服務API撥打電話

    OpenHarmony如何調用電話服務API撥打電話

    OpenHarmony3.1版本標準系統(tǒng)增加了通話相關的聯系人應用,來電應用等,在系統(tǒng)服務層面電話相關功能也比較完善,這篇文章主要介紹了OpenHarmony如何調用電話服務API撥打電話
    2022-11-11

最新評論

东阳市| 双牌县| 新密市| 沁源县| 鄂尔多斯市| 康平县| 崇阳县| 九龙坡区| 大方县| 巴马| 平凉市| 黄大仙区| 塔城市| 高雄县| 墨玉县| 赞皇县| 河北省| 洛浦县| 建宁县| 泽库县| 崇义县| 乌海市| 乐业县| 阳山县| 蒙阴县| 泰顺县| 陇川县| 鹤峰县| 都兰县| 海林市| 秀山| 灌南县| 乌拉特前旗| 博白县| 东阳市| 罗山县| 抚顺县| 桐乡市| 西充县| 天祝| 盘锦市|