Сделайте свое приложение более привлекательным с помощью этого простого урока по градиентному дизайну.

Градиенты - это красивые элементы дизайна, которые переживают возрождение в мире дизайна. Крупные компании, в том числе Hulu и Spotify, часто используют такой дизайн в своих продуктах. В этой статье вы узнаете, как добавлять и настраивать эти градиентные конструкции в ваше приложение Flutter.

Линейные градиенты

Согласно своему названию, этот градиент проходит по простому линейному участку. На этом участке происходит плавный переход цвета. Пример ниже:

Как видите, цвет меняется линейно слева направо. Линейные градиенты можно изменить, чтобы этот цветовой переход происходил в другом направлении. В следующем примере демонстрируется линейный градиент, который выравнивается от bottomLeft до topRight:

Вот как закодировать линейный градиент во Flutter:

Container(
  decoration: BoxDecoration(
    gradient: LinearGradient(
      begin: Alignment.centerLeft,
      end: Alignment.centerRight,
      colors: [Colors.purple, Colors.blue])
  ),
)

Если вы не укажете свойство «begin» или «end» в конструкторе, значение по умолчанию будет от centerLeft до centerRight, как в первом примере в этом разделе.

Вот полный код примера приложения с простым линейным градиентом:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
              child: Container(
                  decoration: BoxDecoration(
                      gradient: LinearGradient(
                          begin: Alignment.centerLeft,
                          end: Alignment.centerRight,
                          colors: [Colors.purple, Colors.blue])))),
    ));
  }
}

Есть несколько способов настроить градиент. Начнем с добавления еще двух цветов и изменения направления градиента:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
              child: Container(
                  decoration: BoxDecoration(
                      gradient: LinearGradient(
                          begin: Alignment.bottomLeft,
                          end: Alignment.topRight,
                          colors: [Colors.red, Colors.yellow, Colors.blue, Colors.purple])))),
        ));
  }
}

Вышеупомянутый линейный градиент следует равномерному распределению; добавляя остановки в наш код, мы можем настроить распределение каждого цвета в градиенте. Каждое значение в массиве конечных значений определяет, насколько преобладает каждый цвет в градиенте. Вот код того же линейного градиента с некоторыми конечными значениями:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
              child: Container(
                  decoration: BoxDecoration(
                      gradient: LinearGradient(
                          begin: Alignment.bottomLeft,
                          end: Alignment.topRight,
                          // Add one stop for each color 
                          // Values should increase from 0.0 to 1.0
                          stops: [0.1, 0.5, 0.8, 0.9],
                          colors: [Colors.red, Colors.yellow, Colors.blue, Colors.purple])))),
        ));
  }
}

Соответствующий линейный градиент:

Радиальные градиенты

Эти типы градиентов меняют цвет в зависимости от местоположения пикселя от центральной точки, отсюда и название «радиальный».

Вот как закодировать базовый радиальный градиент во Flutter:

Container(
  decoration: BoxDecoration(
      gradient: RadialGradient(
        colors: [Colors.yellow, Colors.deepPurple],
    ),
  ),
),

Вот полный код примера приложения с простым радиальным градиентом:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
              child: Container(
                decoration: BoxDecoration(
                  gradient: RadialGradient(
                    colors: [Colors.yellow, Colors.deepPurple],
                  ),
                ),
              ),
          ),
        ));
  }
}

Подобно линейным градиентам, радиальные градиенты также можно настроить множеством методов:

Цвета и стопы

Как мы сделали с линейными градиентами, мы можем добавить несколько цветов или добавить остановки к нашим радиальным градиентам. В этом случае остановки указывают десятичные значения радиуса от 0,0 до 1,0, давая концентрические кольца для каждого цвета. Если стопы не указаны, предполагается равномерное распределение. Вот пример разноцветного радиального градиента с остановками:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
            child: Container(
              decoration: BoxDecoration(
                gradient: RadialGradient(
                 colors: [Colors.yellow, Colors.red, Colors.purple],
                 // Add one stop for each color 
                 // Values should increase from 0.0 to 1.0
                 stops: [0.1, 0.5, 0.75]
                ),
              ),
            ),
          ),
        ));
  }
}

Центр

В приведенных выше примерах центральная точка радиального градиента находилась в середине экрана. Если вы хотите изменить центр градиента, вы должны указать свойство center в конструкторе Radial Gradient. Помните, что если вы не определяете это свойство, по умолчанию градиент помещается в центр экрана.

center: Alignment(0.x, 0.y)

Вот полезное изображение, объясняющее выравнивание во Flutter:

Вот пример радиального градиента с отрегулированным центром:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
            child: Container(
              decoration: BoxDecoration(
                gradient: RadialGradient(
                 colors: [Colors.yellow, Colors.red, Colors.purple],
                 center: Alignment(1.0, 1.0),
                ),
              ),
            ),
          ),
        ));
  }
}

Если вы посмотрите на график, выравнивание центра радиального градиента означает, что его нужно сместить в правый нижний угол.

Мы также можем настроить фокус градиента в пределах радиуса, определив другое свойство в конструкторе RadialGradient:

focal: Alignment(0.x, 0.y),

Вот полный код примера приложения с радиальным градиентом, у которого есть настроенная точка фокусировки:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
            child: Container(
              decoration: BoxDecoration(
                gradient: RadialGradient(
                  colors: [Colors.yellow, Colors.red,Colors.purple],
                  center: Alignment(0.6, -0.3),
                  focal: Alignment(0.3, -0.1),
                ),
              ),
            ),
          ),
        ));
  }
}

Чтобы настроить радиус фокальной точки в середине радиального градиента, нам нужно определить свойство focalRadius в конструкторе RadialGradient:

decoration: BoxDecoration(
      gradient: RadialGradient(
        colors: [Colors.yellow, Colors.red,Colors.purple],
        ...
        focalRadius: 1.0,
   ),
 ),

Вот код предыдущего радиального градиента с измененным фокусным радиусом:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
            child: Container(
              decoration: BoxDecoration(
                gradient: RadialGradient(
                  colors: [Colors.yellow, Colors.red,Colors.purple],
                  center: Alignment(0.6, -0.3),
                  focal: Alignment(0.3, -0.1),
                  focalRadius: 1.0,
                ),
              ),
            ),
          ),
        ));
  }
}

Градиенты развертки:

Это тип градиента, который «обтекает» фокусную точку, образуя цветовой градиент. Вот пример:

Вот код для градиента развертки выше:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
            child: Container(
              decoration: BoxDecoration(
                gradient: SweepGradient(
                  colors: [Colors.yellow,Colors.green, Colors.blue],
                ),
              ),
            ),
          ),
        ));
  }
}

Как видите, мы уже добавили несколько цветов в градиент развертки. Как и в примерах, которые мы видели, мы также можем настроить этот градиент, добавив остановки:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
            child: Container(
              decoration: BoxDecoration(
                gradient: SweepGradient(
                  colors: [Colors.yellow, Colors.green,Colors.blue],
                  stops: [0.1, 0.6, 0.9],
                ),
              ),
            ),
          ),
        ));
  }
}

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

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Flutter Gradient Demo'),
          ),
          body: Center(
            child: Container(
              decoration: BoxDecoration(
                gradient: SweepGradient(
                  colors: [Colors.yellow, Colors.green,Colors.blue],
                  stops: [0.1, 0.6, 0.9],
                  startAngle: 0.9,
                  endAngle: 1.2,
                ),
              ),
            ),
          ),
        ));
  }
}

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

Бонус

Все градиенты и настройки, которые мы обсуждали, также могут быть применены к AppBar с помощью свойства flexibleSpace конструктора AppBar. Вот пример:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Gradient Demo',
        home: Scaffold(
          appBar: AppBar(
            title: Text('Gradient App Bar'),
            flexibleSpace: Container(
              decoration: BoxDecoration(
                gradient: LinearGradient(
                  colors: [Colors.red, Colors.orange],
                ),
              ),
            ),
          )
        ));
  }
}

Этот трюк не ограничивается только линейными градиентами; Вы также можете добавлять и настраивать радиальные и сдвиговые градиенты по своему желанию. Однако линейные градиенты, как правило, являются наиболее подходящими при настройке панели приложения.

Я надеюсь, что вы смогли найти эту статью полезной, научив вас добавлять градиенты в ваше приложение Flutter, а также различные способы настройки каждого типа градиента.

Весь код, использованный в этой статье (и других статьях), можно найти в моем репозитории GitHub.

Если вы нашли эту статью полезной, нажмите кнопку 👏 и хлопните в ладоши! Подпишитесь на меня, чтобы увидеть больше статей о Flutter и оставить отзывы или комментарии ниже!