美文网首页
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