美文网首页
引导页 + 自定义底部指示器

引导页 + 自定义底部指示器

作者: 91阿生 | 来源:发表于2021-01-28 14:57 被阅读0次

    效果图:


    welcome.gif
    1.先创建个StatefulWidget
    class WelcomePage extends StatefulWidget {
      static const routeName = '/welcome';
    
      @override
      _WelcomePageState createState() => _WelcomePageState();
    }
    
    class _WelcomePageState extends State<WelcomePage> {
      // 默认显示第一张图
      int _currentIndex = 0;
      
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Stack(
            children: [
              // 图片播放容器PageView
              buildPageView(),
              // 底部指示器
              buildIndicator(),
              // 立即体验按钮
              buildEnterButton()
            ],
          ),
        );
      }
    
    2.创建PageView来存放图片
    Widget buildPageView() {
       return Positioned.fill(
         child: PageView.builder(
           itemCount: 4,
           // 取消边缘弹簧效果
           physics: ClampingScrollPhysics(),
           // 解决图片之间切换产生的短暂背景显示出来
           allowImplicitScrolling: true,
           itemBuilder: (context, index) {
             return Image.asset(
               "assets/images/guideX${index+1}.png",
               fit: BoxFit.cover,
             );
           },
           onPageChanged: (value) {
             setState(() {
               _currentIndex = value;
             });
           },
         ),
       );
     }
    
    3.底部指示器 + 圆点
    Widget buildIndicator() {
        return Positioned(
          left: 15,
          right: 15,
          bottom: 50,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [0, 1, 2, 3].map((index) {
              return buildDotView(_currentIndex == index);
            }).toList()
          )
        );
      }
    
    // isSelected:用于圆点的宽度
    Widget buildDotView(bool isSelected) {
        return Padding(
          padding: const EdgeInsets.all(8.0),
          // 具有动画效果的Container
          child: AnimatedContainer(
            width: isSelected ? 40 : 12,
            height: 12,
            duration: Duration(milliseconds: 300),
            decoration: BoxDecoration(
              color: Color(0xFFf5ca2b),
              borderRadius: BorderRadius.circular(6)
            ),
          ),
        );
      }
    
    4.创建按钮;添加透明度效果
    Widget buildEnterButton() {
        return Positioned(
          left: 0,
          right: 0,
          bottom: 45,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              AnimatedOpacity(
                opacity: _currentIndex == 3 ? 1 : 0, 
                duration: Duration(milliseconds: 300),
                child: Container(
                  width: 130,
                  height: 40,
                  child: FlatButton(
                    color: Color(0xFFf5ca2b),
                    shape: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5),
                      borderSide: BorderSide(
                        width: 0, 
                        color: Color(0xFFf5ca2b)
                      )
                    ),
                    child: Text("立即体验", style: TextStyle(
                      fontSize: 17
                    )),
                    onPressed: () {
                      print("立即体验");
                    },
                  ),
                ),
              )
            ],
          )
        );
      }
    

    相关文章

      网友评论

          本文标题:引导页 + 自定义底部指示器

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