我想获得容器,小部件,堆栈等的“ y”位置。当它显示在屏幕中央时,我想从图像(视频预览图像)更改为视频文件。我能怎么做?
我发现屏幕高度。我计算了屏幕中心。我找不到容器的地方。
我创建了这样的样本,但该项目不在中间。可能我在这里犯了算法错误?
class _DedectCenterState extends State<DedectCenter> { Size _wSize; int listSize = 4; List<GlobalKey> _key = []; ScrollController _sController; _scrollListener() { print("scrolling : " + _sController.offset.toString()); setState(() { getPosition(); });} @override void initState() { for(int i=0; i < listSize; i++) { _key[i] = new GlobalKey(); } _sController = ScrollController(); _sController.addListener(_scrollListener); super.initState(); } void getPosition(){ double _wCenterTop = (_wSize.height / 2) - 150.0; double _wCenterBottom = (_wSize.height / 2) + 150.0; print("center bottom: " + _wCenterBottom.toString()); print("center top: " + _wCenterTop.toString()); for(int i=0; i < listSize; i++) { //add key to your widget, which position you need to find RenderBox box = _key[i].currentContext.findRenderObject(); Offset position = box.localToGlobal(Offset.zero); //this is global position double y = position.dy; //this is y - I think it's what you want print("key $i y position: " + y.toString()); if(y < _wCenterTop && y > _wCenterBottom) print("key $i center: " + y.toString()); }} Widget build(BuildContext context) { _wSize = MediaQuery.of(context).size; return new Scaffold( appBar: null, body: new ListView( controller: _sController, children: <Widget>[ Row( children: <Widget>[ Column( children: <Widget>[ Container( key: _key[0], margin: EdgeInsets.only(top:100.0), height: 140.0, width: _wSize.width, child: new Image.asset('assets/images/physical/a1.png'), )],)], ), Row( children: <Widget>[ Column( children: <Widget>[ Container( key: _key[1], margin: EdgeInsets.only(top:100.0), height: 140.0, width: _wSize.width, child: new Image.asset('assets/images/physical/a2.png'), ),],)], ), Row( children: <Widget>[ Column( children: <Widget>[ Container( margin: EdgeInsets.only(top:100.0), key: _key[2], height: 140.0, width: _wSize.width, child: new Image.asset('assets/images/physical/a3.png'), ),],)],), Row( children: <Widget>[ Column( children: <Widget>[ Container( margin: EdgeInsets.only(top:100.0), key: _key[3], width: _wSize.width, height: 140.0, child: new Image.asset('assets/images/physical/a4.png'), ), ], ) ],),]));}}
您可以GlobalKey用来获取小部件的大小或位置
GlobalKey
GlobalKey key = GlobalKey(); Container(key: key,...); //add key to your widget, which position you need to find RenderBox box = key.currentContext.findRenderObject(); Offset position = box.localToGlobal(Offset.zero); //this is global position double y = position.dy; //this is y - I think it's what you want