养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子
学着写一下滑动页面
pageview实现左右滑动视图
class SlidingContainer extends StatefulWidget { const SlidingContainer({super.key}); @override State createState() => _SlidingContainerState();}class _SlidingContainerState extends State { late PageController pageController; double pageOffset = 0; @override void initState() { // TODO: implement initState super.initState(); pageController = PageController(viewportFraction: 0.84); pageController.addListener(() { setState(() => pageOffset = pageController.page!); }); } @override void dispose() { // TODO: implement dispose super.dispose(); } Widget build(BuildContext context) { return SizedBox( height: MediaQuery.of(context).size.height * 0.55, child: PageView( controller: pageController, children: List.generate(movies.length, (index) { return SlidingCard( offset: pageOffset - index, movie: movies[index], ); }), ), ); }}
运用Card来绘制图层,简单又方便
class SlidingCard extends StatelessWidget { final double offset; final Movie movie; const SlidingCard({super.key, required this.offset, required this.movie}); @override Widget build(BuildContext context) { double gauss = math.exp(-(math.pow((offset.abs() - 0.5), 2) / 0.08)); return Transform.translate( offset: Offset(-32 * gauss * offset.sign, 0), child: Card( margin: EdgeInsets.only(left: 8, right: 8, bottom: 8), elevation: 8, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(32), ), child: Column( children: [ ClipRRect( borderRadius: BorderRadius.vertical( top: Radius.circular(32), ), child: Image.asset( '${movie.pic}', // height: MediaQuery.of(context).size.height * 0.3, alignment: Alignment(-offset.abs(), 0), fit: BoxFit.cover, ), ), SizedBox( height: 8, ), Expanded( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '${movie.name}', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), SizedBox( height: 10, ), Text( '上架时间: ${movie.date}', style: TextStyle( fontSize: 14, fontWeight: FontWeight.normal), ), Text( '${movie.intor}', style: TextStyle( fontSize: 14, fontWeight: FontWeight.normal, ), ), Spacer(), Row( children: [ SizedBox(width: 16,), Text( '${movie.price}', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold), ), Spacer(), MaterialButton( onPressed: () {}, color: Colors.black, child: Text('购买'), textColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(32), ), ), SizedBox(width: 16,), ], ), ], ), ), ), ], ), ), ); }}class $ {}