Flutter图像九宫格处理插件nine_patch的使用
Flutter图像九宫格处理插件nine_patch的使用
由Andrew Brampton (https://bramp.net/) 提供
特性
预处理并显示任意显示分辨率下的九宫格图像。
背景
标准的九宫格格式是一种具有特殊1像素边框的PNG文件,该边框包含了图像的元数据。
这些图像可以通过多种九宫格编辑器生成,我最喜欢的是这个。然而,这种边框使得加载和渲染图像变得更加复杂,并且更难以管理和调整图像资源(因为必须避免调整这1像素边界)。因此,该库决定将图像和元数据分离为两个文件,一个普通的PNG文件和一个JSON文件。PNG文件可以像通常那样进行调整以生成2.0x、3.0x等分辨率,而JSON文件则按1.0x的比例进行缩放。
samples/TextBox_Side.9.json |
samples/2.0x/TextBox_Side.png
(无1像素边框) |
|
你可以使用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
更多关于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
小部件,它使用CustomPaint
和NinePatchPainter
来绘制NinePatch图像。NinePatchPainter.fromAsset
是一个异步工厂方法,它从资源中加载NinePatch图像。
请注意,这个示例假设你已经有一个有效的.9.png
文件,并且该文件已经放在assets
文件夹中。如果图像文件或路径有误,你可能需要调整assetName
参数以匹配你的文件路径。
这个示例展示了如何在Flutter中使用nine_patch
插件来加载和绘制NinePatch图像。根据你的具体需求,你可能需要调整图像的大小或处理其他布局细节。