import 'package:flutter/material.dart';
import 'package:simple_animations/simple_animations/controlled_animation.dart';
import 'package:simple_animations/simple_animations/multi_track_tween.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
fontFamily: 'Nunito',
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
PageController _pageController;
@override
void initState() {
_pageController = PageController(initialPage: 0);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: PageView(
controller: _pageController,
children: <Widget>[
makePage(
index: 1,
image: 'assets/images/one.jpg',
title: 'Yosemite National Park',
description:
'Yosemite National Park is in California’s Sierra Nevada mountains. It’s famed for its giant, ancient sequoia trees, and for Tunnel View, the iconic vista of towering Bridalveil Fall and the granite cliffs of El Capitan and Half Dome.'),
makePage(
index: 2,
image: 'assets/images/two.jpg',
title: 'Golden Gate Bridge',
description:
'The Golden Gate Bridge is a suspension bridge spanning the Golden Gate, the one-mile-wide strait connecting San Francisco Bay and the Pacific Ocean.'),
makePage(
index: 3,
image: 'assets/images/three.jpg',
title: 'Sedona',
description:
"Sedona is regularly described as one of America's most beautiful places. Nowhere else will you find a landscape as dramatically colorful."),
makePage(
index: 4,
image: 'assets/images/four.jpg',
title: 'Savannah',
description:
"Savannah, with its Spanish moss, Southern accents and creepy graveyards, is a lot like Charleston, South Carolina. But this city about 100 miles to the south has an eccentric streak."),
],
),
),
);
}
}
Widget makePage({image, title, description, index}) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(fit: BoxFit.cover, image: AssetImage(image))),
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(begin: Alignment.bottomLeft, stops: [
0.3,
0.5
], colors: [
Colors.black.withOpacity(.9),
Colors.black.withOpacity(.3)
])),
child: Padding(
padding: EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
children: <Widget>[
Text(
index.toString(),
style: TextStyle(
color: Colors.white,
fontSize: 30,
fontWeight: FontWeight.bold),
),
Text(
'/4',
style: TextStyle(color: Colors.white, fontSize: 15),
)
],
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
FadeIn(
2,
Text(
title,
style: TextStyle(
color: Colors.white,
fontSize: 50,
fontWeight: FontWeight.bold),
)),
SizedBox(
height: 20,
),
FadeIn(
2,
Row(
children: <Widget>[
star(Colors.yellow),
star(Colors.yellow),
star(Colors.yellow),
star(Colors.yellow),
star(Colors.grey),
Text(
'4.0',
style: TextStyle(color: Colors.white70),
),
Text(
'(2300)',
style: TextStyle(color: Colors.white38, fontSize: 12),
),
],
),
),
SizedBox(
height: 20,
),
FadeIn(
2,
Padding(
padding: EdgeInsets.only(right: 50),
child: Text(
description,
style: TextStyle(
color: Colors.white.withOpacity(.7),
height: 2.0,
fontSize: 15),
),
),
),
SizedBox(
height: 20,
),
FadeIn(
2,
Text(
"READ MORE",
style: TextStyle(color: Colors.white),
),
)
],
),
)
],
),
),
),
);
}
Widget star(Color color) {
return Container(
margin: EdgeInsets.only(right: 3),
child: Icon(
Icons.star,
color: color,
size: 15,
),
);
}
class FadeIn extends StatelessWidget {
final double delay;
final Widget child;
FadeIn(this.delay, this.child);
@override
Widget build(BuildContext context) {
final tween = MultiTrackTween([
Track("opacity")
.add(Duration(milliseconds: 500), Tween(begin: 0.0, end: 1.0)),
Track("translateX").add(
Duration(milliseconds: 500), Tween(begin: 130.0, end: 0.0),
curve: Curves.easeOut)
]);
return ControlledAnimation(
delay: Duration(milliseconds: (300 * delay).round()),
duration: tween.duration,
tween: tween,
child: child,
builderWithChild: (context, child, animation) => Opacity(
opacity: animation["opacity"],
child: Transform.translate(
offset: Offset(animation["translateX"], 0), child: child),
),
);
}
}
name: flutter_app_pageview
description: A new Flutter application.
version: 1.0.0+1
environment:
sdk: ">=2.1.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
simple_animations: ^1.3.9
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
assets:
- assets/images/
fonts:
- family: Nunito
fonts:
- asset: assets/fonts/Nunito-Black.ttf
- asset: assets/fonts/Nunito-Bold.ttf
- asset: assets/fonts/Nunito-Regular.ttf
网友评论