web-dev-qa-db-ja.com

Flutter GestureDetector:2本の指を使ってイン/アウトするかズームイン/ズームアウトする方法?

テキストやリッチテキストのようなテキストフィールドを作成しています。その後、ピンチを使用してテキストのサイズをズームイン/アウトしたいです。今のところ、GestureDetectorを実装しましたが、1本の指でズームイン/ズームインしました。そしてピンチの検出を目指すのは本当に困難です。時々凍っている。私はそれが凍結した後に示すビデオを追加しました、そして突然大きくなる。 2番目のビデオは、1本の指でテキストをタップして左隅に移動したときにのみ画像をズームインする場合があります。理想的な実装は、ピンチを検出し、すべてのテキストエリアを展開/ズームアウトすることです。 1本だけを使用するとズームを無効にします。あなたは私にいくつかのヒント、リンク、コードを解決する方法や解決方法の検索の場所を送ってもらえますか?

body: GestureDetector(
  onScaleUpdate: (details) {
    setState(() {
      _textSize =
          _initTextSize + (_initTextSize * (details.scale * .35));
    });
  },
  onScaleEnd: (ScaleEndDetails details) {
    setState(() {
      _initTextSize = _textSize;
    });
  },
  child: Center(
      child: SizedBox(
    height: _textSize,
    child: FittedBox(
      child: Text("Test"),
    ),
  ))),
 _
6
mkubasz

フルコードそれが役に立てば幸い。

import 'package:flutter/material.Dart';
import 'package:flutter/foundation.Dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appTitle = 'Demo';

    return MaterialApp(
      title: appTitle,
      home: MyHomePage(title: appTitle),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: TransformText());
  }
}

class TransformText extends StatefulWidget {
  TransformText({Key key}) : super(key: key); // changed

  @override
  _TransformTextState createState() => _TransformTextState();
}

class _TransformTextState extends State<TransformText> {
  double scale = 0.0;
  double _scaleFactor = 1.0;
  double _baseScaleFactor = 1.0;
  double _savedVal = 1.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GestureDetector Test'), // changed
      ),
      body: Column(
        children: <Widget>[
          RaisedButton(
              child: Text('get'),
              onPressed: () {
                _savedVal = _scaleFactor;
              }),
          RaisedButton(
              child: Text('set'),
              onPressed: () {
                setState(() {
                  _scaleFactor = _savedVal;
                });
              }),
          Expanded(
            child: Center(
                child: GestureDetector(
              behavior: HitTestBehavior.translucent,
              onScaleStart: (details) {
                _baseScaleFactor = _scaleFactor;
              },
              onScaleUpdate: (details) {
                setState(() {
                  _scaleFactor = _baseScaleFactor * details.scale;
                });
              },
              child: Container(
                height: MediaQuery.of(context).size.height,
                width: MediaQuery.of(context).size.width,
                child: Center(
                  child: Text(
                    'Test',
                    textScaleFactor: _scaleFactor,
                  ),
                ),
              ),
            )),
          ),
        ],
      ),
    );
  }
}
 _
0
live-love

解決策:2本の指ズームインとズームアウト。

  import 'package:flutter/material.Dart';
  import 'package:matrix_gesture_detector/matrix_gesture_detector.Dart';

  class TransformText extends StatefulWidget {
    TransformText({Key key}) : super(key: key); // changed

    @override
    _TransformTextState createState() => _TransformTextState();
  }

  class _TransformTextState extends State<TransformText> {
    double scale = 0.0;

    @override
    Widget build(BuildContext context) {
      final ValueNotifier<Matrix4> notifier = ValueNotifier(Matrix4.identity());

      return Scaffold(
        appBar: AppBar(
          title: Text('Single finger Rotate text'), // changed
        ),
        body: Center(
          child: MatrixGestureDetector(
            onMatrixUpdate: (m, tm, sm, rm) {
              notifier.value = m;
            },
            child: AnimatedBuilder(
              animation: notifier,
              builder: (ctx, child) {
                return Transform(
                  transform: notifier.value,
                  child: Center(
                    child: Stack(
                      children: <Widget>[
                        Container(
                          color: Colors.red,
                          padding: EdgeInsets.all(10),
                          margin: EdgeInsets.only(top: 50),
                          child: Transform.scale(
                            scale:
                                1, // make this dynamic to change the scaling as in the basic demo
                            Origin: Offset(0.0, 0.0),
                            child: Container(
                              height: 100,
                              child: Text(
                                "Two finger to zoom!!",
                                style:
                                    TextStyle(fontSize: 26, color: Colors.white),
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                );
              },
            ),
          ),
        ),
      );
    }
  }
 _
0
jazzbpn