Android 如何使ListWheelScrollView水平

Android 如何使ListWheelScrollView水平,android,listview,dart,flutter,Android,Listview,Dart,Flutter,我正在尝试使用一个水平列表视图小部件来放大中心项目。我尝试使用普通的列表视图,但无法放大中心项目。然后在搜索颤振文档时,我遇到了ListWheelScrollView,但不幸的是,它似乎不支持水平子布局。因此,我基本上希望创建一个水平的列表视图,并将中心项目放大。如果有人能至少为我指出正确的方向,我将不胜感激。谢谢您可以使用此颤振软件包。 它也有一个非常有用的描述和一些示例来查看它的外观。而且它也与dart 2.0兼容。编辑: 我已经发布了基于此的软件包 这是我的解决办法 import 'pa

我正在尝试使用一个水平
列表视图
小部件来放大中心项目。我尝试使用普通的
列表视图
,但无法放大中心项目。然后在搜索颤振文档时,我遇到了
ListWheelScrollView
,但不幸的是,它似乎不支持水平子布局。因此,我基本上希望创建一个水平的
列表视图
,并将中心项目放大。如果有人能至少为我指出正确的方向,我将不胜感激。谢谢

您可以使用此颤振软件包。 它也有一个非常有用的描述和一些示例来查看它的外观。而且它也与dart 2.0兼容。

编辑: 我已经发布了基于此的软件包

这是我的解决办法

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

class ListWheelScrollViewX extends StatelessWidget {
  final Widget Function(BuildContext, int) builder;
  final Axis scrollDirection;
  final FixedExtentScrollController controller;
  final double itemExtent;
  final double diameterRatio;
  final void Function(int) onSelectedItemChanged;
  const ListWheelScrollViewX({
    Key key,
    @required this.builder,
    @required this.itemExtent,
    this.controller,
    this.onSelectedItemChanged,
    this.scrollDirection = Axis.vertical,
    this.diameterRatio = 100000,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return RotatedBox(
      quarterTurns: scrollDirection == Axis.horizontal ? 3 : 0,
      child: ListWheelScrollView.useDelegate(
        onSelectedItemChanged: onSelectedItemChanged,
        controller: controller,
        itemExtent: itemExtent,
        diameterRatio: diameterRatio,
        physics: FixedExtentScrollPhysics(),
        childDelegate: ListWheelChildBuilderDelegate(
          builder: (context, index) {
            return RotatedBox(
              quarterTurns: scrollDirection == Axis.horizontal ? 1 : 0,
              child: builder(context, index),
            );
          },
        ),
      ),
    );
  }
}

您可以在
ListView
PageView
以及
NotificationListener
的帮助下完成这项工作。 以下是我的相同代码-

import 'dart:math';
import 'package:flutter/material.dart';        
const SCALE_FRACTION = 0.9;
        const FULL_SCALE = 1.0;
        final PAGER_HEIGHT = SizeConfig.screenHeight*0.32;
        const PAGER_WIDTH = double.infinity;

        class PaymentWidget extends StatefulWidget {
          @override
          State<StatefulWidget> createState() => _PaymentState();
        }

        class _PaymentState extends State<PaymentWidget> {
          double viewPortFraction = 0.9;
          int currentPage = 1;
          double page = 2.0;

          PageController pageController;

          final List<String> _cardsImages = ['image/path1', 'image/path2',
            'image/path3', 'image/path4'];

          @override
          void initState() {
            pageController = PageController(
                initialPage: currentPage, viewportFraction: viewPortFraction);
            super.initState();
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: null,
              body: _creditCardsList()
        );
        }

       Widget _creditCardsList() {
            return ListView(
              shrinkWrap: true,
                  children: <Widget>[
                    Container(
                      height: PAGER_HEIGHT,
                      child: NotificationListener<ScrollNotification>(
                        onNotification: (ScrollNotification notification) {
                          if (notification is ScrollUpdateNotification) {
                            setState(() {
                              page = pageController.page;
                            });
                          }
                        },
                        child: PageView.builder(
                          onPageChanged: (pos) {
                            setState(() {
                              currentPage = pos;
                            });
                          },
                          physics: BouncingScrollPhysics(),
                          controller: pageController,
                          itemCount: _cardsImages.length,
                          itemBuilder: (context, index) {
                            final scale =
                            max(SCALE_FRACTION, (FULL_SCALE - (index - page).abs()) + viewPortFraction);
                            return CreditCardTile(
                                _cardsImages[index], scale);
                          },
                        ),
                      ),
                    ),
                  ],
            );

          }

        Widget CreditCardTile(String image, double scale) {
            return Align(
              alignment: Alignment.bottomCenter,
              child:Container(
                  height: PAGER_HEIGHT * scale,
                  width: PAGER_WIDTH * scale,
                  child: Card(
                    elevation: 5,
                    shadowColor: constColors.blueWhiteShade,
                    shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10.0)
                    ),
                    clipBehavior: Clip.antiAlias,
                    child: Image.asset(
                      image,
                      fit: BoxFit.cover,
                    ),
                  )
              ) ,
            );

          }
import'dart:math';
进口“包装:颤振/材料.省道”;
常数刻度_分数=0.9;
常数满刻度=1.0;
最终寻呼机高度=SizeConfig.屏幕高度*0.32;
常数寻呼机_宽度=double.infinity;
类PaymentWidget扩展StatefulWidget{
@凌驾
State createState()=>\u PaymentState();
}
类_PaymentState扩展状态{
双视口分数=0.9;
int currentPage=1;
双页=2.0;
页面控制器;
最终列表_cardsImages=['image/path1'、'image/path2',
'图像/路径3','图像/路径4'];
@凌驾
void initState(){
pageController=pageController(
initialPage:currentPage,viewportFraction:viewportFraction);
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:null,
正文:_creditCardsList()
);
}
Widget_creditCardsList(){
返回列表视图(
收缩膜:对,
儿童:[
容器(
高度:寻呼机高度,
孩子:NotificationListener(
onNotification:(滚动通知){
如果(通知为ScrollUpdateNotification){
设置状态(){
page=pageController.page;
});
}
},
子项:PageView.builder(
onPageChanged:(pos){
设置状态(){
当前页面=位置;
});
},
物理:弹跳CrollPhysics(),
控制器:页面控制器,
itemCount:_cardsImages.length,
itemBuilder:(上下文,索引){
最终比例尺=
最大值(比例分数,(满比例-(索引页).abs())+视口分数);
返回信用卡磁砖(
_cardsImages[索引]、比例);
},
),
),
),
],
);
}
小部件CreditCardTile(字符串图像,双刻度){
返回对齐(
对齐:对齐.bottomCenter,
子:容器(
高度:寻呼机高度*刻度,
宽度:寻呼机宽度*比例,
孩子:卡片(
标高:5,
shadowColor:constColors.blueWhiteShade,
形状:圆形矩形边框(
边界半径:边界半径。圆形(10.0)
),
clipBehavior:Clip.antiAlias,
子:Image.asset(
形象,,
适合:BoxFit.cover,
),
)
) ,
);
}

使用变换。旋转

您可以使用内置的ListWheelScrollView将其与旋转框配对来执行此操作

RotatedBox(
   quarterTurns: -1,
   child: ListWheelScrollView(
   onSelectedItemChanged: (x) {
                  setState(() {
                    selected = x;
                  });
   },
   controller: _scrollController,
   children: List.generate(
                    itemCount,
                    (x) => RotatedBox(
                        quarterTurns: 1,
                        child: AnimatedContainer(
                            duration: Duration(milliseconds: 400),
                            width: x == selected ? 60 : 50,
                            height: x == selected ? 60 : 50,
                            alignment: Alignment.center,
                            decoration: BoxDecoration(
                                color: x == selected ? Colors.red : Colors.grey,
                                shape: BoxShape.circle),
                            child: Text('$x')))),
                itemExtent: itemWidth,
              )),
    );

我建议使用这种方法,直到问题得到解决

这是输出

我正在寻找类似的东西,不知道您是否有实现上述代码的示例?@Vlad您可以像使用ListWheelScrollView小部件一样使用它。但我添加了
scrollDirection
,您可以将其设置为Axis.horizontalBTW我已将其推到包中,此包与dart 2.0不兼容:(@B.shruti我现在已经更新了我的答案。请再看一看。
RotatedBox(
   quarterTurns: -1,
   child: ListWheelScrollView(
   onSelectedItemChanged: (x) {
                  setState(() {
                    selected = x;
                  });
   },
   controller: _scrollController,
   children: List.generate(
                    itemCount,
                    (x) => RotatedBox(
                        quarterTurns: 1,
                        child: AnimatedContainer(
                            duration: Duration(milliseconds: 400),
                            width: x == selected ? 60 : 50,
                            height: x == selected ? 60 : 50,
                            alignment: Alignment.center,
                            decoration: BoxDecoration(
                                color: x == selected ? Colors.red : Colors.grey,
                                shape: BoxShape.circle),
                            child: Text('$x')))),
                itemExtent: itemWidth,
              )),
    );