作者:刘诗宪668964 | 来源:互联网 | 2023-09-05 06:34
main
import ‘package:flutter/material.dart‘;
import ‘screen.dart‘;
main() => runApp(MaterialApp(
home: MyApp(),
));
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
var x = MediaQuery.of(context).size;
print(‘original size: $x‘);
GrantScreen screen = GrantScreen(222, 444, context);
return RootWidget(
child: HomePage(),
screen: screen,
);
}
}
class RootWidget extends InheritedWidget {
RootWidget({Key key, @required this.child, this.screen}):super(key:key);
final GrantScreen screen;
final Widget child;
static RootWidget of(BuildContext context){
return context.inheritFromWidgetOfExactType(RootWidget);
}
@override
bool updateShouldNotify(InheritedWidget oldWidget) {
return true;
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var s = RootWidget.of(context).screen;
return Scaffold(
appBar: AppBar(title: Text(‘ABC‘, style: TextStyle(fontSize: 22),),),
body: GestureDetector(
onPanDown: (DragDownDetails details){
print(‘mmmmmmmmmmmmmmmmmmmmmm‘);
print(details);
print(s.getGlobalPosition(details));
print(‘new top: ${s.top}‘);
print(MediaQuery.of(context).padding.top);
print(‘mmmmmmmmmmmmmmmmmmmmmmmm‘);
},
child: Container(
width: double.infinity,height: double.infinity,
color: Colors.grey,
child: Column(
children: [
Text(‘Text‘, style: TextStyle(fontSize: s.setFontSize(44, true)),),
Text(‘Text‘, style: TextStyle(fontSize: s.setFontSize(44, false)),),
Text(‘Text‘, style: TextStyle(fontSize: 44),),
],
),
),),
);
}
}
screen:
import ‘package:flutter/material.dart‘;
class GrantScreen {
static double _width, _height;
static double _physicalWidth, _physicalHeight;
static double _top, _bottom;
static double _scaleWidth, _scaleHeight;
static double _textScale;
static double _pixelRatio;
GrantScreen(double w, double h, BuildContext context){
_physicalWidth = MediaQuery.of(context).size.width;
_physicalHeight = MediaQuery.of(context).size.height;
_top = MediaQuery.of(context).padding.top;
_bottom = MediaQuery.of(context).padding.bottom;
_textScale = MediaQuery.of(context).textScaleFactor;
_width = w;
_height = h;
_scaleWidth = _physicalWidth / w;
_scaleHeight = _physicalHeight / h;
_pixelRatio = MediaQuery.of(context).devicePixelRatio;
}
get top => _top / _scaleHeight;
get bottom => _bottom / _scaleHeight;
get scaleWidth => _scaleWidth;
get scaleHeight => _scaleHeight;
get width => _width;
get height => _height;
get pixelRatio => _pixelRatio;
get physicalWidth => _physicalWidth;
get physicalHeight => _physicalHeight;
setWidth(double w) => w * _scaleWidth;
setHeight(double h) => h * _scaleHeight;
setFontSize(double f, [bool allowScale=true]) =>
allowScale? setWidth(f)/_textScale : f/_textScale;
getGlobalPosition(DragDownDetails details){
double dx = details.globalPosition.dx / _scaleWidth;
double dy = details.globalPosition.dy / _scaleHeight;
return DragDownDetails(globalPosition: Offset(dx, dy));
}
}