restore2DeviceValue method

double restore2DeviceValue(
  1. double dpValue
)

Implementation

BlueprintsRectangle _uiBlueprints = const BlueprintsRectangle(0, 0);double restore2DeviceValue(double dpValue) {return dpValue * Info.instance.restoreRatio;}EdgeInsets restore2DeviceEdgeInsets(EdgeInsets dpEdgeInsets) {return dpEdgeInsets * Info.instance.restoreRatio;}Size restore2DeviceSize(Size dpSize) {return dpSize * Info.instance.restoreRatio;}TransitionBuilder FxTransitionBuilder({TransitionBuilder? builder}) {return (BuildContext context, Widget? child) {assert(WidgetsBinding.instance != null, "未初始化ui");var old = MediaQuery.of(context);var deviceShortWidth =ui.window.physicalSize.width <= ui.window.physicalSize.height? ui.window.physicalSize.width: ui.window.physicalSize.height;if (deviceShortWidth == 0)deviceShortWidth = old.size.width < old.size.height? old.size.width * old.devicePixelRatio: old.size.height * old.devicePixelRatio;double actualPixelRatio = deviceShortWidth / _uiBlueprints.width;Info.init(actualPixelRatio: actualPixelRatio, uiBlueprints: _uiBlueprints).onScreenMetricsChange(old);print("Info=${Info.instance}");return MediaQuery(data: old.copyWith(textScaleFactor: 1,size: (old.size / actualPixelRatio) * old.devicePixelRatio,devicePixelRatio: actualPixelRatio,padding: restore2DeviceEdgeInsets(old.padding),viewPadding: restore2DeviceEdgeInsets(old.viewPadding),viewInsets: restore2DeviceEdgeInsets(old.viewInsets),systemGestureInsets: restore2DeviceEdgeInsets(old.systemGestureInsets),),child: builder == null ? child! : builder(context, child),);};}class FxWidgetsFlutterBinding extends WidgetsFlutterBinding {static WidgetsBinding ensureInitialized({required BlueprintsRectangle uiBlueprints, bool enableLog = false}) {assert(uiBlueprints.width > 0);Info.enableLog = enableLog;_uiBlueprints = uiBlueprints;FxWidgetsFlutterBinding();return WidgetsBinding.instance;}@protected void scheduleAttachRootWidget(Widget rootWidget) {Timer.run(() {attachRootWidget(_RoorRenderObjectWidget(rootWidget));});}@override ViewConfiguration createViewConfiguration() {return ViewConfiguration(size: window.physicalSize / adapterDevicePixelRatio,devicePixelRatio: adapterDevicePixelRatio,);}@override void initInstances() {super.initInstances();ui.window.onPointerDataPacket = _handlePointerDataPacket;}@override void unlocked() {super.unlocked();_flushPointerEventQueue();}final Queue<PointerEvent> _pendingPointerEvents = Queue<PointerEvent>();void _handlePointerDataPacket(ui.PointerDataPacket packet) {_pendingPointerEvents.addAll(PointerEventConverter.expand(packet.data, adapterDevicePixelRatio));if (!locked) _flushPointerEventQueue();}@override void cancelPointer(int pointer) {if (_pendingPointerEvents.isEmpty && !locked)scheduleMicrotask(_flushPointerEventQueue);_pendingPointerEvents.addFirst(PointerCancelEvent(pointer: pointer));}void _flushPointerEventQueue() {assert(!locked);while (_pendingPointerEvents.isNotEmpty)handlePointerEvent(_pendingPointerEvents.removeFirst());}final Map<int, HitTestResult> _hitTests = <int, HitTestResult>{};void _handleSampleTimeChanged() {if (!locked) {if (resamplingEnabled) {_resampler.sample(samplingOffset, _samplingClock);} else {_resampler.stop();}}}SamplingClock get _samplingClock {SamplingClock value = SamplingClock();assert(() {final SamplingClock? debugValue = debugSamplingClock;if (debugValue != null) value = debugValue;return true;}());return value;}late final _Resampler _resampler = _Resampler(_handlePointerEventImmediately,_handleSampleTimeChanged,_samplingInterval,);void handlePointerEvent(PointerEvent event) {assert(!locked);if (resamplingEnabled) {_resampler.addOrDispatch(event);_resampler.sample(samplingOffset, _samplingClock);return;}_resampler.stop();_handlePointerEventImmediately(event);}void _handlePointerEventImmediately(PointerEvent event) {HitTestResult? hitTestResult;if (event is PointerDownEvent ||event is PointerSignalEvent ||event is PointerHoverEvent) {assert(!_hitTests.containsKey(event.pointer));hitTestResult = HitTestResult();hitTest(hitTestResult, event.position);if (event is PointerDownEvent) {_hitTests[event.pointer] = hitTestResult;}assert(() {if (debugPrintHitTestResults) debugPrint('$event: $hitTestResult');return true;}());} else if (event is PointerUpEvent || event is PointerCancelEvent) {hitTestResult = _hitTests.remove(event.pointer);} else if (event.down) {hitTestResult = _hitTests[event.pointer];}assert(() {if (debugPrintMouseHoverEvents && event is PointerHoverEvent)debugPrint('$event');return true;}());if (hitTestResult != null ||event is PointerAddedEvent ||event is PointerRemovedEvent) {assert(event.position != null);dispatchEvent(event, hitTestResult);}}double get adapterDevicePixelRatio {if (Info.initialed) return Info.instance.actualPixelRatio;double _adapterDevicePixelRatio;var deviceShortWidth =ui.window.physicalSize.width <= ui.window.physicalSize.height? ui.window.physicalSize.width: ui.window.physicalSize.height;_adapterDevicePixelRatio = deviceShortWidth / _uiBlueprints.width;return _adapterDevicePixelRatio;}}class _RoorRenderObjectWidget extends SingleChildRenderObjectWidget {_RoorRenderObjectWidget(Widget rootChild) : super(child: rootChild);@override RenderObject createRenderObject(BuildContext context) {_assertOnFuture(() => !Info.initialed,errorMsg: "\nError:'FxTransitionBuilder' is not configured""\nMaterialApp(""\n  ......""\n  builder: FxTransitionBuilder(builder: null),""\n  ......""\n);");return RenderPadding(padding: EdgeInsets.all(0));}void _assertOnFuture(ValueGetter<bool> conditions,{String errorMsg = "", int time = 1000}) {if (Info.isRelease) return;Future.delayed(Duration(milliseconds: time), () {if (conditions.call()) throw FormatException(errorMsg);});Future.delayed(Duration(milliseconds: (time * 1.5).toInt()), () {if (conditions.call()) SystemNavigator.pop();});}}const Duration _defaultSamplingOffset = Duration(milliseconds: -38);const Duration _samplingInterval = Duration(microseconds: 16667);typedef _HandleSampleTimeChangedCallback = void Function();class _Resampler {_Resampler(this._handlePointerEvent, this._handleSampleTimeChanged,this._samplingInterval);final Map<int, PointerEventResampler> _resamplers =<int, PointerEventResampler>{};bool _frameCallbackScheduled = false;Duration _frameTime = Duration.zero;Stopwatch _frameTimeAge = Stopwatch();Duration _lastSampleTime = Duration.zero;Duration _lastEventTime = Duration.zero;final HandleEventCallback _handlePointerEvent;final _HandleSampleTimeChangedCallback _handleSampleTimeChanged;final Duration _samplingInterval;Timer? _timer;void addOrDispatch(PointerEvent event) {final SchedulerBinding? scheduler = SchedulerBinding.instance;assert(scheduler != null);if (event.kind == PointerDeviceKind.touch) {_lastEventTime = event.timeStamp;final PointerEventResampler resampler = _resamplers.putIfAbsent(event.device,() => PointerEventResampler(),);resampler.addEvent(event);} else {_handlePointerEvent(event);}}void sample(Duration samplingOffset, SamplingClock clock) {final SchedulerBinding? scheduler = SchedulerBinding.instance;assert(scheduler != null);if (_frameTime == Duration.zero) {_frameTime = Duration(milliseconds: clock.now().millisecondsSinceEpoch);_frameTimeAge = clock.stopwatch()..start();}if (_timer?.isActive != true) {_timer = Timer.periodic(_samplingInterval, (_) => _onSampleTimeChanged());}final int samplingIntervalUs = _samplingInterval.inMicroseconds;final int elapsedIntervals =_frameTimeAge.elapsedMicroseconds ~/ samplingIntervalUs;final int elapsedUs = elapsedIntervals * samplingIntervalUs;final Duration frameTime = _frameTime + Duration(microseconds: elapsedUs);final Duration sampleTime = frameTime + samplingOffset;final Duration nextSampleTime = sampleTime + _samplingInterval;for (final PointerEventResampler resampler in _resamplers.values) {resampler.sample(sampleTime, nextSampleTime, _handlePointerEvent);}_resamplers.removeWhere((int key, PointerEventResampler resampler) {return !resampler.hasPendingEvents && !resampler.isDown;});_lastSampleTime = sampleTime;if (_resamplers.isEmpty) {_timer!.cancel();return;}if (!_frameCallbackScheduled) {_frameCallbackScheduled = true;scheduler?.addPostFrameCallback((_) {_frameCallbackScheduled = false;_frameTime = scheduler.currentSystemFrameTimeStamp;_frameTimeAge.reset();_timer?.cancel();_timer =Timer.periodic(_samplingInterval, (_) => _onSampleTimeChanged());_onSampleTimeChanged();});}}void stop() {for (final PointerEventResampler resampler in _resamplers.values) {resampler.stop(_handlePointerEvent);}_resamplers.clear();_frameTime = Duration.zero;}void _onSampleTimeChanged() {assert(() {if (debugPrintResamplingMargin) {final Duration resamplingMargin = _lastEventTime - _lastSampleTime;debugPrint('$resamplingMargin');}return true;}());_handleSampleTimeChanged();}}class BlueprintsRectangle {final double width;final double length;const BlueprintsRectangle(this.width, this.length);double get aspectRatio {if (length != 0.0) return width / length;if (width > 0.0) return double.infinity;if (width < 0.0) return double.negativeInfinity;return 0.0;}@override String toString() {return '${width}x$length,Ratio=$aspectRatio}';}}class Info {static bool initialed = false;static bool enableLog = false;static Info? _instance;static Info get instance {assert(initialed, "未初始化完成");return _instance!;}final double actualPixelRatio;final BlueprintsRectangle uiBlueprints;double deltaLength = -1;EdgeInsets _deltaPadding = EdgeInsets.zero;double _bodyMaxLength = -1;Info._({required this.actualPixelRatio, required this.uiBlueprints});factory Info.init({required double actualPixelRatio,required BlueprintsRectangle uiBlueprints}) {if (_instance == null) {_instance = Info._(actualPixelRatio: actualPixelRatio, uiBlueprints: uiBlueprints);}initialed = true;return _instance!;}double get devicePixelRatio => ui.window.devicePixelRatio;double get bodyMaxLength => _bodyMaxLength;EdgeInsets get deltaPadding => _deltaPadding;Size get actualDpSize => ui.window.physicalSize / actualPixelRatio;double get restoreRatio => devicePixelRatio / actualPixelRatio;double restore2DeviceValue(double dpValue) {return dpValue * restoreRatio;}