Flutter - Как изменить точку вращения виджета контейнера? - PullRequest
0 голосов
/ 18 июня 2020

Я использую свойство transform виджета Container, чтобы повернуть его вокруг оси Z, вот так:

transform: Matrix4.rotationZ(10 * pi/180)

в следующем фрагменте:

Scaffold(
  resizeToAvoidBottomInset: false,
  body: Stack(
    children: <Widget>[
      Container(

//            margin: EdgeInsets.symmetric(vertical: 20.0,horizontal: 10.0),
        decoration: BoxDecoration(
          image: DecorationImage(
            image: AssetImage(
              "assets/img/women.png",
            ),
            fit: BoxFit.scaleDown,
          ),
        ),
      ),
      SingleChildScrollView(
        child: Container(
          width: deviceSize.width,
          height: deviceSize.height,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              Flexible(
                child: Container(
                  margin: EdgeInsets.only(bottom: 90.0),
                  padding:
                      EdgeInsets.symmetric(vertical: 10.0, horizontal: 15),
                  transform: Matrix4.rotationZ(10 * pi / 180)
                    ..translate(10.0),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(25),
                    color: Colors.orange,
                    boxShadow: [
                      BoxShadow(
                        blurRadius: 20.0,
                        color: Colors.orange,
                        offset: Offset(5, 7),
                      )
                    ],
                  ),
                  child: Text(
                    'Shopping Universe',
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 60.0,
                      fontFamily: 'Piedra',
                      fontWeight: FontWeight.w200,
                    ),
                  ),
                ),
              ),
              Flexible(
                child: AuthCard(),
              ),
            ],
          ),
        ),
      ),
    ],
  ),
);

Как изменить точку вращения и установить ее на center of gravity из container?

После этого я мог бы изменить ее положение с помощью translate, что-то вроде этого Matrix4.rotationZ(15 * pi/180)..translate(10.0)

Но я не доволен этим методом,

Кто-нибудь может мне помочь, пожалуйста?

Любые предложения или советы будут оценены. Спасибо.

1 Ответ

1 голос
/ 18 июня 2020

Вы можете обернуть Container виджетом Transform и установить свойство origin на все, что вы sh.

Если вы хотите, чтобы origin находился в центре Container, вам нужно сделать что-то вроде origin: Offset(containerWidth/2, containerHeight/2).

И поскольку ваш Container не имеет a specifici c height (известна только ширина как его родительский элемент), вам нужно найти его размер. Для этого можно использовать RenderBox. Здесь вы можете найти руководство о том, как этого добиться.

import 'package:flutter/material.dart';
import 'auth_card.dart';
import 'dart:math' as Math;

class Test extends StatefulWidget {
  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> {
  GlobalKey _containerKey = GlobalKey();
  Size _containerSize = Size(0, 0);

  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
    super.initState();
  }

  Size _getSize() {
    final RenderBox renderBoxRed =
    _containerKey.currentContext.findRenderObject();
    return renderBoxRed.size;
  }

  _afterLayout(_) {
    _containerSize = _getSize();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    Size deviceSize = MediaQuery.of(context).size;
    return Scaffold(
      resizeToAvoidBottomInset: false,
      body: Stack(
        children: <Widget>[
          Container(

//            margin: EdgeInsets.symmetric(vertical: 20.0,horizontal: 10.0),
            decoration: BoxDecoration(
              image: DecorationImage(
                image: AssetImage(
                  "assets/img/women.png",
                ),
                fit: BoxFit.scaleDown,
              ),
            ),
          ),
          SingleChildScrollView(
            child: Container(
              width: deviceSize.width,
              height: deviceSize.height,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Flexible(
                    child: Transform(
                      transform: Matrix4.rotationZ(10 * Math.pi / 180),
                      origin: Offset(
                          _containerSize.width / 2, _containerSize.height / 2),
                      child: Container(
                        key: _containerKey,
                        margin: EdgeInsets.only(bottom: 20.0),
                        padding: EdgeInsets.symmetric(
                            vertical: 20.0, horizontal: 15),
                        decoration: BoxDecoration(
                          borderRadius: BorderRadius.circular(25),
                          color: Colors.orange,
                          boxShadow: [
                            BoxShadow(
                              blurRadius: 20.0,
                              color: Colors.orange,
                              offset: Offset(5, 7),
                            )
                          ],
                        ),
                        child: Text(
                          'Shopping Universe',
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 60.0,
                            fontFamily: 'Piedra',
                            fontWeight: FontWeight.w200,
                          ),
                        ),
                      ),
                    ),
                  ),
                  Flexible(
                    child: AuthCard()
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}

Но учтите, что:

Установка начала координат эквивалентна сопряжению матрицы преобразования переводом. Это свойство предоставлено исключительно для удобства.

...