2017-05-03 15 views
3

温度を設定するためのフラッターウィジェットを作成しようとしています。これはサーモスタットのようなものです。私はCustomPainterを実際に画面上に描画するように拡張しましたが、今はユーザが回転できるようにグラブ機能を設定しようとしています。ウィジェットに対してタップ位置を取得する

GestureDetectorウィジェットを使用して、ユーザーが画面に触れるとコールバックを取得できますが、ノブの中心からの相対的な位置を知る必要があります。残念ながら、GestureDetectorによって提供される位置は絶対座標であり、キャンバスはウィジェットの起点に対して相対的に動作します。これらの座標の1つを他の座標に変換する方法はありますか?私は必要手段

いずれか:

1)CustomPainterウィジェット

Iの絶対位置を取得する方法をCustomPainterウィジェット

2)のタップ位置を取得する方法これらのいずれかを提供するAPIを見つけることができません。そのようなAPIは存在しますか?

コンテキスト:https://github.com/dgp1130/thermo/blob/master/lib/widgets/temp_picker.dart

それは現在、サーモスタットを回転すると動作しますされている方法が、タッチの「センター」は、約途中ためのアプリバーの高さの本当の中心地の上に実際にあります。

おかげ

答えて

1

あなたはRenderBox.globalToLocalメソッドを使用して、ローカル座標にグローバル座標に変換することができます。 RenderBoxを取得するには、BuildContextfindRenderObjectと電話することができます。

--- a/lib/widgets/temp_picker.dart 
+++ b/lib/widgets/temp_picker.dart 
@@ -41,7 +41,12 @@ class _TempPickerState extends State<TempPicker> { 
    return new Container(
     constraints: new BoxConstraints.expand(), 
     child: new GestureDetector(
-  onPanUpdate: (details) => setState(() => _tapPos = details.globalPosition), 
+  onPanUpdate: (details) { 
+   setState(() { 
+   RenderBox box = context.findRenderObject(); 
+   _tapPos = box.globalToLocal(details.globalPosition); 
+   }); 
+  }, 
     child: new CustomPaint(
      painter: new _TempPainter(
      minValue: widget.minValue, 

デバイスが回転すると、あなたのTempPickerウィジェットのサイズが変更するとき、それは予期しない動作をする可能性があるため、これは、しかしかなり右ではありません。 _tapPosにローカルオフセットを格納する代わりに、の結果を計算してonPanUpdateに保存し、その角度値を_TempPainterコンストラクタに渡すことをお勧めします。この方法では、ユーザーが現在画面に触れていない限り、画面のサイズが変更されても角度は変更されません。

+0

'RenderBox'リファレンスをお寄せいただき、ありがとうございます。私は 'getAngleFromPosition()'を_TempPickerState自身で計算したいと思っていましたが、これははるかに意味がありますが、 'paint()'メソッド内でのみ提供される中心を知る必要があるのでできません。 _TempPickerStateにもセンターを取得する方法はありますか?ウィジェットがまだレイアウトされていないため、BuildContextから取得しようとしましたが失敗しました。 –

+0

'RenderBox'がそのトリックをしました。 –

関連する問題