Flutter图像九宫格处理插件nine_patch的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter图像九宫格处理插件nine_patch的使用

由Andrew Brampton (https://bramp.net/) 提供

特性

预处理并显示任意显示分辨率下的九宫格图像。

背景

标准的九宫格格式是一种具有特殊1像素边框的PNG文件,该边框包含了图像的元数据。

示例九宫格PNG文件名为TextBox_Side.9.png

这些图像可以通过多种九宫格编辑器生成,我最喜欢的是这个。然而,这种边框使得加载和渲染图像变得更加复杂,并且更难以管理和调整图像资源(因为必须避免调整这1像素边界)。因此,该库决定将图像和元数据分离为两个文件,一个普通的PNG文件和一个JSON文件。PNG文件可以像通常那样进行调整以生成2.0x、3.0x等分辨率,而JSON文件则按1.0x的比例进行缩放。

samples/TextBox_Side.9.json samples/2.0x/TextBox_Side.png
(无1像素边框)
{
  "stretch": {
    "x": 118,
    "y": 40,
    "width": 121,
    "height": 60
  },
  "contents": {
    "x": 19,
    "y": 18,
    "width": 248,
    "height": 101
  },
  "dimensions": {
    "x": 285,
    "y": 167
  },
  "name": "TextBox_Side.png",
  "scale": 2
}
示例九宫格PNG文件名为TextBox_Side.png

你可以使用https://pub.dev/packages/nine_patcher轻松创建JSON元数据文件,作为构建管道的一部分。

使用

要在Flutter应用程序中使用九宫格图像,首先添加依赖项:

flutter pub add nine_patch

或者手动添加到你的pubspec.yaml文件中:

dependencies:
    nine_patch: ^1.0.0

然后在需要的地方创建一个NinePatchImage小部件,如下所示:

import 'package:nine_patch/nine_patch.dart';

...

// 创建一个新的NinePatchImage小部件
NinePatchImage.fromAssetMetadata(
    name: "image.9.json",
)

你也可以指定子组件(位于九宫格内):

NinePatchImage.fromAssetMetadata(
    name: "image.9.json",
    margin: EdgeInsets.all(10),
    padding: EdgeInsets.all(10), // 这是在九宫格元数据中可能已经指定的填充区域之外的额外填充。
    child: Center(
        child: child,
    ),
)

最后,如果你的图像/元数据不在资源中,你可以提供任何ImageProvider并从其他来源创建元数据:

NinePatchImage(
    image: NetworkImage("https://example.com/example.png"),
    metadata: NinePatchMetadata(...),
)

待办事项

  • ❌ 支持多尺度区域九宫格。
  • ❌ 支持将九宫格元数据存储在PNG文件中。目前仅支持单独的JSON文件。

许可证

示例图像来自https://penzilla.itch.io/basic-gui-bundle

该项目受BSD 3-clause许可保护:

BSD 3-Clause License

版权所有 (c) 2023, Andrew Brampton (https://bramp.net)

允许以源代码形式和二进制形式重分布和使用,条件是满足以下条款:

1. 源代码的重新分发必须保留上述版权声明、此条款列表和下述免责声明。

2. 二进制形式的重新分发必须在文档和/或其他材料中复制上述版权声明、此条款列表和下述免责声明。

3. 版权持有者或贡献者的名称不得用于推广产品,除非事先获得书面许可。

本软件按“原样”提供,不附带任何明示或暗示的保证,包括但不限于适销性和特定用途适用性的保证。在任何情况下,版权持有者或贡献者均不对因使用本软件而导致的直接、间接、偶然、特殊、示范性或后果性损害承担责任,包括但不限于替代商品或服务的采购、数据或利润损失或业务中断,无论是在合同、严格责任还是侵权(包括疏忽或其他原因)的情况下,即使已被告知可能发生此类损害。

更多关于Flutter图像九宫格处理插件nine_patch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图像九宫格处理插件nine_patch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用nine_patch插件来处理图像九宫格的一个示例。nine_patch插件允许你使用Android的NinePatch图像格式,这在处理可伸缩的图像时非常有用,比如按钮背景或对话框边缘等。

首先,确保你的Flutter项目中已经添加了nine_patch插件。你可以在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  nine_patch: ^1.0.0  # 请检查最新版本号

然后运行flutter pub get来安装插件。

接下来,你需要准备一个NinePatch图像(.9.png文件)。确保这个图像文件已经放在你的Flutter项目的assets文件夹中,并在pubspec.yaml中声明:

flutter:
  assets:
    - assets/your_nine_patch_image.9.png

现在,你可以在你的Flutter代码中使用这个NinePatch图像了。以下是一个完整的示例代码,展示如何在Flutter中使用nine_patch插件:

import 'package:flutter/material.dart';
import 'package:nine_patch/nine_patch.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('NinePatch Example'),
        ),
        body: Center(
          child: NinePatchImage.asset(
            'assets/your_nine_patch_image.9.png',
            width: 200,
            height: 200,
          ),
        ),
      ),
    );
  }
}

class NinePatchImage extends StatelessWidget {
  final String assetName;
  final double width;
  final double height;

  const NinePatchImage.asset(
    this.assetName, {
    required this.width,
    required this.height,
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      size: Size(width, height),
      painter: NinePatchPainter.fromAsset(assetName),
    );
  }
}

class NinePatchPainter extends CustomPainter {
  final NinePatch? ninePatch;

  NinePatchPainter(this.ninePatch);

  factory NinePatchPainter.fromAsset(String assetName) async {
    final byteData = await rootBundle.load(assetName);
    final Uint8List uint8List = byteData.buffer.asUint8List();
    final ninePatch = NinePatch.decode(uint8List);
    return NinePatchPainter(ninePatch);
  }

  @override
  void paint(Canvas canvas, Size size) {
    if (ninePatch != null) {
      final paint = Paint();
      ninePatch?.draw(canvas, size, paint);
    }
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return oldDelegate != this;
  }
}

在这个示例中,我们创建了一个NinePatchImage小部件,它使用CustomPaintNinePatchPainter来绘制NinePatch图像。NinePatchPainter.fromAsset是一个异步工厂方法,它从资源中加载NinePatch图像。

请注意,这个示例假设你已经有一个有效的.9.png文件,并且该文件已经放在assets文件夹中。如果图像文件或路径有误,你可能需要调整assetName参数以匹配你的文件路径。

这个示例展示了如何在Flutter中使用nine_patch插件来加载和绘制NinePatch图像。根据你的具体需求,你可能需要调整图像的大小或处理其他布局细节。

回到顶部