Я хотел бы сделать кнопку с эффектом круглой ряби с помощью значка, я видел что-то в Интернете, но не могу этого сделать. Это не так прямолинейно, как должно быть. Пробую сейчас с этим кодом.
InkWell(
onTap: () {},
splashColor: Colors.red,
highlightColor: Colors.white,
child: new Icon(
FontAwesomeIcons.chevronCircleUp,
size: 100,
),
)
Еще одна попытка была с этим, но я не могу понять, почему они не идеально центрируются друг с другом.
Container(
margin: EdgeInsets.all(0.0),
height: 100.0,
width: 100.0,
child: new RaisedButton(
padding: EdgeInsets.all(0.0),
elevation: 100.0,
color: Colors.black,
highlightElevation: 0.0,
onPressed: () {},
splashColor: Colors.red,
highlightColor: Colors.red,
//shape: RoundedRectangleBorder e tutto il resto uguale
shape: CircleBorder(
side: BorderSide(color: Colors.black, width: 5),
),
child: Icon(
FontAwesomeIcons.chevronCircleUp,
color: Colors.white.withOpacity(.8),
size: 80,
)),
),
Спасибо за помощь
Я просто хочу, чтобы эффект ряби применялся по кругу, а не в квадрате, как сейчас. И я не понимаю, почему во втором коде он не идеально центрирует ребенка.

Оберните виджет InkWell виджетом Material, а виджет material должен иметь цвет.
Material( color: Colors.transparent,
child: InkWell( onTap: () { print("tapped"); }, ) );
Можете ли вы сказать мне, почему во втором коде они тоже не центрируются идеально?
Также эффект ряби применяется к квадратной рамке, а не к кругу, как хотелось бы.
@FlorisMarpepa: эффект чернил начинается с места касания, а не с центра.
В первом фрагменте кода, который вы завернули в InkWell, эффект не круговой, я думаю, вам нужен круговой эффект.
Вы можете напрямую использовать IconButton, а не обертывать его InkWell.
IconButton(
icon: Icon(FontAwesomeIcons.chevronCircleUp),
iconSize: 100,
onPressed: () {},
splashColor: Colors.blue,
),
Да, я пробовал этот способ, но он не работает. Я только что скопировал и вставил ваш точный код, и он показывает только значок, а не волновой эффект.
Хорошо, но есть ли у этой гифки тот же эффект, которого вы пытаетесь достичь? @ФлорисМарпепа
да, а как можно задать размеры эффекта? Однако не знаю, почему это не работает со мной, но да с вами. Я просто скопировал вставил код..
Я думаю, что у вас должен быть виджет MaterialApp в качестве предков, чтобы использовать некоторые функции дизайна материалов. Так ли это? Кстати, насколько я знаю, IconButton не имеет свойств, связанных с размерами эффекта. Это просто начинается с того места, где вы нажимаете, и идете по кругу.
Моя страница является домом для MaterialApp, я пытался обернуть ваш код в материал. Это дает мне эффект, но также белый квадрат на заднем плане. Итак, я сделал аргумент цвета = Colors.transparent, теперь все в порядке, но пульсация становится квадратной, а не круглой. }, splashColor: Colors.blue, ), ),
Я думаю, что если у вас есть контейнер с установленным фоном, пульсация находится за этим фоном. Это насколько я понял
Я вижу, что вы хотели бы детально контролировать размер ряби. В итоге я использовал код ниже.
Padding(
padding: EdgeInsets.all(8.0),
child: InkWell(
customBorder: new CircleBorder(),
onTap: () {},
splashColor: Colors.red,
child: new Icon(
Icons.arrow_back,
size: 24,
color: Colors.black,
),
),
)
Эффект InkWell отображает квадрат, однако использование CircleBorder обрезает его до круглой формы.
По умолчанию эффект пытается заполнить пространство, поэтому, чтобы изменить размер, я добавил отступы со всех сторон, обрезав эффект. Если у вас по-прежнему возникают проблемы с тем, что волновой эффект вообще не отображается, обертывание вашего кода в Material() должно решить большинство проблем или взгляните на тему приложения.
customBorder: CircleBorder() это настоящее лаконичное решение
Я бы добавил, что Material является требованием, если пульсация рендерится где-то ниже, как в случае с TextField с использованием filled=true украшения.
Я использовал FAB без фона.
FloatingActionButton(
onPressed: () {},
backgroundColor: Colors.transparent,
mini: true,
child: Icon(
Icons.more_vert,
color: Colors.white,
),
)
добавьте «высоту: 0,0», чтобы удалить тень.
https://github.com/флюттер/флаттер/issues/3782
Если у вас не работает IconButton, вот объяснение.
TLDR: не устанавливайте фон для своего родительского контейнера и позволяйте материалу делать свою работу, рисуя рябь на фоне.
Вы можете просто использовать СыройМатериалКнопка со свойствами constraints и shapeчтобы создать значок с оттенком цвета и круглым фоном.
Также вы можете отключить свойство shape, чтобы кнопка была прямоугольной.
Примечание:
Здесь я использовал SVG-плагин, чтобы использовать желаемую иконку SVG (помещенную в папку assets/icons), но вы также можете просто использовать любой виджет Icon вместо него.
Пример:
RawMaterialButton(
onPressed: () {}, //do your action
elevation: 1.0,
constraints: BoxConstraints(), //removes empty spaces around of icon
shape: CircleBorder(), //circular button
fillColor: Color(0xffff6464), //background color
splashColor: Colors.amber,
highlightColor: Colors.amber,
child: SvgPicture.asset(
"assets/icons/heart.svg",
width: 24,
height: 24,
),
padding: EdgeInsets.all(8),
)
Material(
child: IconButton(
icon: Icon(
FontAwesomeIcons.search,
),
onPressed: () {},
),
)
Добавление виджета материала в качестве парета работает для меня
Привет и добро пожаловать в SO! Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. Прочтите тур и Как написать хороший ответ?
Это сработало для меня, все вышеперечисленное решение сделало квадратную тень, а не круг
Material(
color: Colors.transparent,
shape: CircleBorder(),
clipBehavior: Clip.hardEdge,
child : Icon() )
Вам нужно обернуть его материальным виджетом с прозрачным цветом фона:
Container(
child:Material(
color: Colors.transparent
child: IconButton(
icon: Icon(Icons.heart),
onPressed: (){}
),
),
);
Ссылка на источник: https://github.com/flutter/flutter/issues/61811#issuecomment-660630611
У меня были проблемы с волновым эффектом, который не работал для ответа IconButton, а также для ответа Inkwell.
Оказалось, что это не связано с цветами фона, но что-то в моем обработчике onPressed отменяло эффект ряби. Может быть, другая анимация.
Это можно было подтвердить, поместив задержку в 200 мс внутри onPressed, и эффект пульсации вернулся.
Можете ли вы отредактировать свой вопрос с примером того, что вы ищете?