Flutter色彩空间转换插件oklch的使用

Flutter色彩空间转换插件oklch的使用

该插件旨在模拟OKLCH色彩空间并简化在Flutter应用中使用OKLCH的过程。

参考了以下网站进行开发:https://lch.oklch.com/#50,84.7,42.57,100

请注意,该插件的结果可能与上述网站不同,但未来会逐渐改进以提供相同的结果。

特性

  • ✅ 将RGB转换为OKLCH
  • ✅ 将OKLCH转换为RGB
  • ✅ 基于OKLCH的颜色选择器

使用示例

以下是使用oklch插件的完整示例代码:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:oklch/oklch.dart';
import 'package:url_launcher/url_launcher.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({
    super.key,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'OKLCH Color Picker Example',
      home: ColorPickerDemo(),
    );
  }
}

class ColorPickerDemo extends StatefulWidget {
  const ColorPickerDemo({
    super.key,
  });

  [@override](/user/override)
  _ColorPickerDemoState createState() => _ColorPickerDemoState();
}

class _ColorPickerDemoState extends State<ColorPickerDemo> {
  static Color startColor = Colors.blue;
  Color _selectedColor = startColor;
  TextEditingController rgbController = TextEditingController();
  TextEditingController oklchController = TextEditingController();
  TextEditingController hexController = TextEditingController();

  OKLCHColor _oKLCHColor = OKLCHColor.fromColor(startColor);

  [@override](/user/override)
  void initState() {
    super.initState();
    _updateColorControllers(_selectedColor);
  }

  void _updateColorControllers(Color color) {
    _oKLCHColor = OKLCHColor.fromColor(color);
    rgbController.text = 'RGB(${color.red}, ${color.green}, ${color.blue})';
    oklchController.text = _oKLCHColor.textDescription;
    hexController.text = _oKLCHColor.rgbHex;
  }

  String _generateOKLCHUrl() {
    return 'https://oklch.com/#${_oKLCHColor.lightness.toStringAsFixed(2)},${_oKLCHColor.chroma.toStringAsFixed(2)},${_oKLCHColor.hue.toStringAsFixed(2)},100';
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('OKLCH Color Picker Demo'),
        actions: [
          IconButton(
            icon: const Icon(Icons.open_in_new),
            onPressed: () {
              final String url = _generateOKLCHUrl();
              debugPrint(url);
              launchUrl(Uri.parse(url));
            },
          ),
        ],
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            Container(
              height: 200,
              color: _selectedColor,
              child: const Center(
                child: Text(
                  'Background Color',
                  style: TextStyle(color: Colors.white, fontSize: 24),
                ),
              ),
            ),
            OKLCHColorPickerWidget(
              color: _selectedColor,
              onColorChanged: (color) {
                setState(() {
                  _selectedColor = color;
                  _updateColorControllers(color);
                });
              },
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextFormField(
                controller: rgbController,
                decoration: const InputDecoration(labelText: 'RGB Value'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextFormField(
                controller: oklchController,
                decoration: const InputDecoration(labelText: 'OKLCH Value'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextFormField(
                controller: hexController,
                decoration: const InputDecoration(labelText: 'Hex Value'),
              ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                MaterialButton(
                  child: const Text('Copy RGB'),
                  onPressed: () {
                    Clipboard.setData(ClipboardData(text: rgbController.text));
                  },
                ),
                MaterialButton(
                  child: const Text('Copy OKLCH'),
                  onPressed: () {
                    Clipboard.setData(ClipboardData(text: oklchController.text));
                  },
                ),
                MaterialButton(
                  child: const Text('Copy Hex'),
                  onPressed: () {
                    Clipboard.setData(ClipboardData(text: hexController.text));
                  },
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter色彩空间转换插件oklch的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter色彩空间转换插件oklch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你需要进行色彩空间的转换,特别是使用OKLCH颜色空间,你可以使用一些现成的插件或库来实现。OKLCH是一种基于Oklab颜色模型的颜色空间,它使用亮度(Lightness)、色度(Chroma)和色调(Hue)来表示颜色。

目前,Flutter本身并没有直接支持OKLCH颜色空间的官方库,但你可以使用一些第三方库来帮助你进行颜色空间转换。以下是一个简单的示例,展示如何使用一个名为 color 的 Dart 包来进行OKLCH颜色空间的转换。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 color 包的依赖:

dependencies:
  flutter:
    sdk: flutter
  color: ^3.0.0  # 请确保使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 使用 color 包进行转换

import 'package:color/color.dart';

void main() {
  // 使用Oklab颜色空间创建一个颜色
  OklabColor oklabColor = OklabColor(0.5, 0.1, 0.2);

  // 将Oklab颜色转换为Oklch颜色
  OklchColor oklchColor = oklabColor.toOklch();

  print('Oklch Color: L=${oklchColor.l}, C=${oklchColor.c}, H=${oklchColor.h}');

  // 将Oklch颜色转换回Oklab颜色
  OklabColor convertedOklabColor = oklchColor.toOklab();

  print('Converted Oklab Color: L=${convertedOklabColor.l}, a=${convertedOklabColor.a}, b=${convertedOklabColor.b}');
}

3. 解释

  • OklabColor: 这是 color 包中表示Oklab颜色空间的类。它有三个属性:l(亮度)、ab(色度分量)。
  • OklchColor: 这是 color 包中表示Oklch颜色空间的类。它有三个属性:l(亮度)、c(色度)和 h(色调)。
  • toOklch(): 将Oklab颜色转换为Oklch颜色。
  • toOklab(): 将Oklch颜色转换回Oklab颜色。

4. 其他操作

你还可以将这些颜色转换为其他颜色空间,例如RGB、HSL等:

// 将Oklch颜色转换为RGB颜色
RgbColor rgbColor = oklchColor.toRgb();

print('RGB Color: R=${rgbColor.r}, G=${rgbColor.g}, B=${rgbColor.b}');
回到顶部