Виджет InteractiveViewer
Виджет InteractiveViewer оборачивает child
и даёт жесты масштаба и прокрутки.
Минимум и максимум зума задают minScale и maxScale.
Пан и pinch включают panEnabled и scaleEnabled.
За пределы экрана не даёт вылезти boundaryMargin.
Синтаксис
InteractiveViewer(
minScale: 0.5,
maxScale: 4,
child: child,
)
Параметры
| Параметр | Описание |
|---|---|
child |
Дочерний виджет, который масштабируют и двигают. |
minScale |
Минимальный коэффициент масштаба. |
maxScale |
Максимальный коэффициент масштаба. |
panEnabled |
Разрешить сдвиг содержимого. |
scaleEnabled |
Разрешить pinch zoom. |
boundaryMargin |
Запас за границами, куда можно увести child. |
Пример
Давайте увеличим большую картинку-заглушку:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: InteractiveViewer(
minScale: 0.8,
maxScale: 3,
child: Container(
width: 600,
height: 400,
color: Colors.blueGrey,
alignment: Alignment.center,
child: const Text(
'abcde',
style: TextStyle(
fontSize: 48,
color: Colors.white,
),
),
),
),
),
),
);
}
На экране серая область больше окна; pinch увеличивает текст, pan сдвигает панораму.
Пример
Давайте отключим масштаб и оставим только сдвиг:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: InteractiveViewer(
scaleEnabled: false,
panEnabled: true,
child: SizedBox(
width: 800,
height: 200,
child: Row(
children: List.generate(
5,
(i) => Expanded(
child: Container(
color: Colors.primaries[i],
alignment: Alignment.center,
child: Text('12345'),
),
),
),
),
),
),
),
),
);
}
На экране широкая полоса из цветных блоков; её можно тянуть в стороны, zoom не работает.
Смотрите также
-
виджет
GestureDetector,
который двигает один виджет без масштаба -
виджет
Dismissible,
который смахивает пункт списка -
виджет
Listener,
который получает сырые события указателя -
виджет
IgnorePointer,
который блокирует жесты для поддерева