Skip to content

Commit 723a80e

Browse files
Merge pull request #25 from SpencerLindemuth/master
Scale MediaQuery view insets to account for scaled height and width
2 parents 7724666 + 1ca3c08 commit 723a80e

File tree

1 file changed

+103
-2
lines changed

1 file changed

+103
-2
lines changed

lib/responsive_wrapper.dart

Lines changed: 103 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:math';
2+
13
import 'package:flutter/widgets.dart';
24

35
import 'utils/responsive_utils.dart';
@@ -280,6 +282,94 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
280282
activeBreakpointSegment.responsiveBreakpoint.scaleFactor;
281283
}
282284

285+
/// Simulated view inset calculations.
286+
///
287+
/// The [viewInset] is dependent upon the
288+
/// [scaledWidth] and [scaledHeight] respectively.
289+
/// If the screen is scaled, the view insets should
290+
/// be scaled to preserve the aspect ratio.
291+
/// The [scaledViewInsets] are computed with the
292+
/// following algorithm:
293+
/// 1. Find the percentage of screen height the original view insets are
294+
/// 2. Calculate the number of pixels the same percentage of the scaled height is.
295+
/// 4. Return calculated proportional insets
296+
EdgeInsets scaledViewInsets;
297+
EdgeInsets getScaledViewInsets() {
298+
double leftInsetFactor;
299+
double topInsetFactor;
300+
double rightInsetFactor;
301+
double bottomInsetFactor;
302+
double scaledLeftInset;
303+
double scaledTopInset;
304+
double scaledRightInset;
305+
double scaledBottomInset;
306+
307+
if(widget.mediaQueryData != null) {
308+
leftInsetFactor = widget.mediaQueryData.viewInsets.left / screenWidth;
309+
topInsetFactor = widget.mediaQueryData.viewInsets.top / screenHeight;
310+
rightInsetFactor = widget.mediaQueryData.viewInsets.right / screenWidth;
311+
bottomInsetFactor = widget.mediaQueryData.viewInsets.bottom / screenHeight;
312+
} else {
313+
leftInsetFactor = MediaQuery.of(context).viewInsets.left / screenWidth;
314+
topInsetFactor = MediaQuery.of(context).viewInsets.top / screenHeight;
315+
rightInsetFactor = MediaQuery.of(context).viewInsets.right / screenWidth;
316+
bottomInsetFactor = MediaQuery.of(context).viewInsets.bottom / screenHeight;
317+
}
318+
319+
scaledLeftInset = leftInsetFactor * scaledWidth;
320+
scaledTopInset = topInsetFactor * scaledHeight;
321+
scaledRightInset = rightInsetFactor * scaledWidth;
322+
scaledBottomInset = bottomInsetFactor * scaledHeight;
323+
324+
return EdgeInsets.fromLTRB(scaledLeftInset, scaledTopInset, scaledRightInset, scaledBottomInset);
325+
}
326+
327+
EdgeInsets scaledViewPadding;
328+
EdgeInsets getScaledViewPadding() {
329+
double leftPaddingFactor;
330+
double topPaddingFactor;
331+
double rightPaddingFactor;
332+
double bottomPaddingFactor;
333+
double scaledLeftPadding;
334+
double scaledTopPadding;
335+
double scaledRightPadding;
336+
double scaledBottomPadding;
337+
338+
if(widget.mediaQueryData != null) {
339+
leftPaddingFactor = widget.mediaQueryData.viewPadding.left / screenWidth;
340+
topPaddingFactor = widget.mediaQueryData.viewPadding.top / screenHeight;
341+
rightPaddingFactor = widget.mediaQueryData.viewPadding.right / screenWidth;
342+
bottomPaddingFactor = widget.mediaQueryData.viewPadding.bottom / screenHeight;
343+
} else {
344+
leftPaddingFactor = MediaQuery.of(context).viewPadding.left / screenWidth;
345+
topPaddingFactor = MediaQuery.of(context).viewPadding.top / screenHeight;
346+
rightPaddingFactor = MediaQuery.of(context).viewPadding.right / screenWidth;
347+
bottomPaddingFactor = MediaQuery.of(context).viewPadding.bottom / screenHeight;
348+
}
349+
350+
scaledLeftPadding = leftPaddingFactor * scaledWidth;
351+
scaledTopPadding = topPaddingFactor * scaledHeight;
352+
scaledRightPadding = rightPaddingFactor * scaledWidth;
353+
scaledBottomPadding = bottomPaddingFactor * scaledHeight;
354+
355+
return EdgeInsets.fromLTRB(scaledLeftPadding, scaledTopPadding, scaledRightPadding, scaledBottomPadding);
356+
}
357+
358+
EdgeInsets scaledPadding;
359+
EdgeInsets getScaledPadding() {
360+
double scaledLeftPadding;
361+
double scaledTopPadding;
362+
double scaledRightPadding;
363+
double scaledBottomPadding;
364+
365+
scaledLeftPadding = max(0.0, getScaledViewPadding().left - getScaledViewInsets().left);
366+
scaledTopPadding = max(0.0, getScaledViewPadding().top - getScaledViewInsets().top);
367+
scaledRightPadding = max(0.0, getScaledViewPadding().right - getScaledViewInsets().right);
368+
scaledBottomPadding = max(0.0, getScaledViewPadding().bottom - getScaledViewInsets().bottom);
369+
370+
return EdgeInsets.fromLTRB(scaledLeftPadding, scaledTopPadding, scaledRightPadding, scaledBottomPadding);
371+
}
372+
283373
double get activeScaleFactor =>
284374
activeBreakpointSegment.responsiveBreakpoint.scaleFactor;
285375

@@ -296,6 +386,9 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
296386
screenHeight = getScreenHeight();
297387
scaledWidth = getScaledWidth();
298388
scaledHeight = getScaledHeight();
389+
scaledViewInsets = getScaledViewInsets();
390+
scaledViewPadding = getScaledViewPadding();
391+
scaledPadding = getScaledPadding();
299392
}
300393

301394
/// Set [activeBreakpointSegment].
@@ -410,12 +503,20 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
410503
if (widget.mediaQueryData != null) {
411504
return widget.mediaQueryData.copyWith(
412505
size: Size(scaledWidth, scaledHeight),
413-
devicePixelRatio: devicePixelRatio * activeScaleFactor);
506+
devicePixelRatio: devicePixelRatio * activeScaleFactor,
507+
viewInsets: scaledViewInsets,
508+
viewPadding: scaledViewPadding,
509+
padding: scaledPadding
510+
);
414511
}
415512

416513
return MediaQuery.of(context).copyWith(
417514
size: Size(scaledWidth, scaledHeight),
418-
devicePixelRatio: devicePixelRatio * activeScaleFactor);
515+
devicePixelRatio: devicePixelRatio * activeScaleFactor,
516+
viewInsets: scaledViewInsets,
517+
viewPadding: scaledViewPadding,
518+
padding: scaledPadding
519+
);
419520
}
420521
}
421522

0 commit comments

Comments
 (0)