Как получить эффект пульсации круга на IconButton?

Я хотел бы сделать кнопку с эффектом круглой ряби с помощью значка, я видел что-то в Интернете, но не могу этого сделать. Это не так прямолинейно, как должно быть. Пробую сейчас с этим кодом.

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,
                          )),
                    ),

Спасибо за помощь

Можете ли вы отредактировать свой вопрос с примером того, что вы ищете?

Miguel Ruivo 28.02.2019 18:47

Я просто хочу, чтобы эффект ряби применялся по кругу, а не в квадрате, как сейчас. И я не понимаю, почему во втором коде он не идеально центрирует ребенка.

Floris Marpepa 28.02.2019 19:00
5 дизайнов темных кнопок с использованием HTML и CSS
5 дизайнов темных кнопок с использованием HTML и CSS
Здесь представлены пять дизайнов темных кнопок с кодом с использованием HTML и CSS:
14
2
20 071
11

Ответы 11

Оберните виджет InkWell виджетом Material, а виджет material должен иметь цвет.

 Material( color: Colors.transparent,
 child: InkWell( onTap: () { print("tapped"); }, ) );

Можете ли вы сказать мне, почему во втором коде они тоже не центрируются идеально?

Floris Marpepa 28.02.2019 18:39

Также эффект ряби применяется к квадратной рамке, а не к кругу, как хотелось бы.

Floris Marpepa 28.02.2019 18:45

@FlorisMarpepa: эффект чернил начинается с места касания, а не с центра.

Andrei Volgin 18.01.2020 21:37

В первом фрагменте кода, который вы завернули в InkWell, эффект не круговой, я думаю, вам нужен круговой эффект.

Вы можете напрямую использовать IconButton, а не обертывать его InkWell.

IconButton(
        icon: Icon(FontAwesomeIcons.chevronCircleUp),
        iconSize: 100,
        onPressed: () {},
        splashColor: Colors.blue,
      ),

Effect gif

Да, я пробовал этот способ, но он не работает. Я только что скопировал и вставил ваш точный код, и он показывает только значок, а не волновой эффект.

Floris Marpepa 28.02.2019 20:10

Хорошо, но есть ли у этой гифки тот же эффект, которого вы пытаетесь достичь? @ФлорисМарпепа

mirkancal 28.02.2019 20:39

да, а как можно задать размеры эффекта? Однако не знаю, почему это не работает со мной, но да с вами. Я просто скопировал вставил код..

Floris Marpepa 28.02.2019 20:46

Я думаю, что у вас должен быть виджет MaterialApp в качестве предков, чтобы использовать некоторые функции дизайна материалов. Так ли это? Кстати, насколько я знаю, IconButton не имеет свойств, связанных с размерами эффекта. Это просто начинается с того места, где вы нажимаете, и идете по кругу.

mirkancal 28.02.2019 20:49

Моя страница является домом для MaterialApp, я пытался обернуть ваш код в материал. Это дает мне эффект, но также белый квадрат на заднем плане. Итак, я сделал аргумент цвета = Colors.transparent, теперь все в порядке, но пульсация становится квадратной, а не круглой. }, splashColor: Colors.blue, ), ),

Floris Marpepa 01.03.2019 17:23

Я думаю, что если у вас есть контейнер с установленным фоном, пульсация находится за этим фоном. Это насколько я понял

Boy 30.08.2019 20:35

Я вижу, что вы хотели бы детально контролировать размер ряби. В итоге я использовал код ниже.

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() это настоящее лаконичное решение
Ruslanbek0809 18.09.2021 08:38

Я бы добавил, что Material является требованием, если пульсация рендерится где-то ниже, как в случае с TextField с использованием filled=true украшения.

Volodymyr Buberenko 17.11.2021 13:53

Я использовал FAB без фона.

FloatingActionButton(
  onPressed: () {},
  backgroundColor: Colors.transparent,
  mini: true,
  child: Icon(
    Icons.more_vert,
    color: Colors.white,
  ),
)

добавьте «высоту: 0,0», чтобы удалить тень.

Ashish Khurange 07.06.2020 16:49
            CircleAvatar(
                backgroundColor: Colors.grey[200],
                child: IconButton(
                  icon: Icon(
                    Icons.search,
                    color: Colors.black,
                  ),
                  onPressed: () {},
                ),
              ),

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! Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. Прочтите тур и Как написать хороший ответ?

Tomer Shetah 27.12.2020 14:55

Это сработало для меня, все вышеперечисленное решение сделало квадратную тень, а не круг

 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, и эффект пульсации вернулся.

Другие вопросы по теме