美文网首页
Flutter如何实现视差滚动?

Flutter如何实现视差滚动?

作者: 小米Metre | 来源:发表于2019-07-30 20:04 被阅读0次

    Flutter如何实现视差滚动?

    效果如下:

    效果图

    在Flutter 中实现视差滚动,非常简单,Flutter已经提供相关的控件。CustomScrollView
    CustomScrollView是一个可以实现多个嵌套滚动自定义控件。可以同时嵌套多个GridView、多个ListView或者混合嵌套,同时保证一致的滑动效果。

    所有需要滚动的模块都必须是Sliver。可滚动widget,如ListView、GridView等都有对应的Sliver实现如SliverList、SliverGrid等。

    对于大多数Sliver来说,它们和可滚动Widget最主要的区别是Sliver不会包含Scrollable Widget,也就是说Sliver本身不包含滚动交互模型 ,正因如此,CustomScrollView才可以将多个Sliver"粘"在一起,这些Sliver共用CustomScrollView的Scrollable,最终实现统一的滑动效果。

    import 'package:flutter/material.dart';
    class CustomView extends StatefulWidget{
    
      @override
      State<StatefulWidget> createState() => CustomViewState();
    
    }
    
    class CustomViewState extends State<CustomView>{
    
      bool isToTop = false;
      //滚动控制器
      ScrollController _controller;
    
      void _onPressed(){
       //回到ListView顶部
        _controller.animateTo(0, duration: Duration(milliseconds: 200), curve: Curves.ease);
      }
    
      @override
      void initState() {
        _controller = ScrollController();
        _controller.addListener((){
    
          if(_controller.offset > 1000){
            setState(() {
              isToTop = true;
            });
          }else if(_controller.offset <=500){
            setState(() {
              isToTop = false;
            });
    
          }
        });
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
    
        return new MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: Scaffold(
            backgroundColor:Colors.white,
            appBar: AppBar(title: Text("CustomView AppBar Title")),
            body: CustomScrollView(
              controller: _controller,
              slivers: <Widget>[
                SliverAppBar(
                  title: Text("视差滚动效果",style: TextStyle(color: Colors.grey,fontWeight: FontWeight.bold)),
                  floating: true,
                  flexibleSpace:
                  Image.network("http://img95.699pic.com/photo/50057/7197.jpg_wh300.jpg"
                      ,fit:BoxFit.cover),
                  expandedHeight: 200,
                ),
                SliverList( 
                  delegate: SliverChildBuilderDelegate(
                        (context,index)=>ListTile(title: Text('Item $index')),
                    childCount:100,
                  ),
                )
              ],
            ),
            floatingActionButton: isToTop?FloatingActionButton(
                onPressed: ()=>_onPressed(),
                child:Icon(Icons.arrow_upward)
            ):null,
          ),
        );
      }
    
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
    

    相关文章

      网友评论

          本文标题:Flutter如何实现视差滚动?

          本文链接:https://www.haomeiwen.com/subject/aqsgrctx.html