mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-06-28 12:29:51 +00:00
Add parallax effect to home screen background (demo)
This commit is contained in:
parent
2a869e5349
commit
b2ae3883eb
3 changed files with 76 additions and 25 deletions
BIN
assets/images/background_test.png
Normal file
BIN
assets/images/background_test.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.8 MiB |
|
@ -197,22 +197,22 @@ class _DashboardPageView extends BasePage {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget body(BuildContext context) {
|
Widget body(BuildContext context) {
|
||||||
final controller = PageController(initialPage: initialPage);
|
parallaxController = PageController(initialPage: initialPage);
|
||||||
|
|
||||||
reaction(
|
reaction(
|
||||||
(_) => dashboardViewModel.shouldShowMarketPlaceInDashboard,
|
(_) => dashboardViewModel.shouldShowMarketPlaceInDashboard,
|
||||||
(bool value) {
|
(bool value) {
|
||||||
if (!dashboardViewModel.shouldShowMarketPlaceInDashboard) {
|
if (!dashboardViewModel.shouldShowMarketPlaceInDashboard) {
|
||||||
controller.jumpToPage(0);
|
parallaxController.jumpToPage(0);
|
||||||
}
|
}
|
||||||
pages.clear();
|
pages.clear();
|
||||||
_isEffectsInstalled = false;
|
_isEffectsInstalled = false;
|
||||||
_setEffects(context);
|
_setEffects(context);
|
||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
controller.jumpToPage(1);
|
parallaxController.jumpToPage(1);
|
||||||
} else {
|
} else {
|
||||||
controller.jumpToPage(0);
|
parallaxController.jumpToPage(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -230,7 +230,7 @@ class _DashboardPageView extends BasePage {
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return PageView.builder(
|
return PageView.builder(
|
||||||
key: ValueKey('dashboard_page_view_key'),
|
key: ValueKey('dashboard_page_view_key'),
|
||||||
controller: controller,
|
controller: parallaxController,
|
||||||
itemCount: pages.length,
|
itemCount: pages.length,
|
||||||
itemBuilder: (context, index) => pages[index],
|
itemBuilder: (context, index) => pages[index],
|
||||||
);
|
);
|
||||||
|
@ -247,7 +247,7 @@ class _DashboardPageView extends BasePage {
|
||||||
hint: 'Swipe to change page',
|
hint: 'Swipe to change page',
|
||||||
excludeSemantics: true,
|
excludeSemantics: true,
|
||||||
child: SmoothPageIndicator(
|
child: SmoothPageIndicator(
|
||||||
controller: controller,
|
controller: parallaxController,
|
||||||
count: pages.length,
|
count: pages.length,
|
||||||
effect: ColorTransitionEffect(
|
effect: ColorTransitionEffect(
|
||||||
spacing: 6.0,
|
spacing: 6.0,
|
||||||
|
|
|
@ -1,30 +1,81 @@
|
||||||
import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
|
import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class GradientBackground extends StatelessWidget {
|
late PageController parallaxController;
|
||||||
|
|
||||||
|
class GradientBackground extends StatefulWidget {
|
||||||
const GradientBackground({required this.scaffold});
|
const GradientBackground({required this.scaffold});
|
||||||
|
|
||||||
final Widget scaffold;
|
final Widget scaffold;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<GradientBackground> createState() => _GradientBackgroundState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _GradientBackgroundState extends State<GradientBackground> {
|
||||||
|
late double _pageOffset;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_pageOffset = 0;
|
||||||
|
parallaxController = PageController(initialPage: 0);
|
||||||
|
parallaxController.addListener(
|
||||||
|
() => setState(() => _pageOffset = parallaxController.page ?? 0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
parallaxController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Stack(
|
||||||
decoration: BoxDecoration(
|
children: [
|
||||||
gradient: LinearGradient(
|
DataImage(
|
||||||
colors: [
|
pageCount: 4,
|
||||||
Theme.of(context)
|
screenSize: MediaQuery.of(context).size,
|
||||||
.extension<DashboardPageTheme>()!
|
offset: _pageOffset,
|
||||||
.firstGradientBackgroundColor,
|
),
|
||||||
Theme.of(context)
|
widget.scaffold,
|
||||||
.extension<DashboardPageTheme>()!
|
],
|
||||||
.secondGradientBackgroundColor,
|
);
|
||||||
Theme.of(context)
|
}
|
||||||
.extension<DashboardPageTheme>()!
|
}
|
||||||
.thirdGradientBackgroundColor,
|
|
||||||
],
|
class DataImage extends StatelessWidget {
|
||||||
begin: Alignment.topRight,
|
const DataImage({
|
||||||
end: Alignment.bottomLeft,
|
Key? key,
|
||||||
)),
|
required this.pageCount,
|
||||||
child: scaffold);
|
required this.screenSize,
|
||||||
|
required this.offset,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final Size screenSize;
|
||||||
|
final int pageCount;
|
||||||
|
final double offset;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
int lastPageIdx = pageCount - 1;
|
||||||
|
int firstPageIdx = 0;
|
||||||
|
int alignmentMax = 1;
|
||||||
|
int alignmentMin = -1;
|
||||||
|
int pageRange = (lastPageIdx - firstPageIdx) - 1;
|
||||||
|
int alignmentRange = (alignmentMax - alignmentMin);
|
||||||
|
double alignment = (((offset - firstPageIdx) * alignmentRange) / pageRange) + alignmentMin;
|
||||||
|
|
||||||
|
return SizedBox(
|
||||||
|
height: screenSize.height,
|
||||||
|
width: screenSize.width,
|
||||||
|
child: Image(
|
||||||
|
image: const AssetImage('assets/images/background_test.png'),
|
||||||
|
alignment: Alignment(alignment, 0),
|
||||||
|
fit: BoxFit.fitHeight,
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue