Files
flame/lib/widgets/nine_tile_box.dart
Erick Zanardo f2f677eb12 PR suggestions
2020-02-01 14:39:07 -03:00

130 lines
3.4 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart' as widgets;
import 'package:meta/meta.dart';
import '../sprite.dart';
import 'dart:ui';
class _Painter extends widgets.CustomPainter {
final Image image;
final double tileSize;
final double destTileSize;
_Painter({
@required this.image,
@required this.tileSize,
@required this.destTileSize,
});
Sprite _getSpriteTile(double x, double y) =>
Sprite.fromImage(image, x: x, y: y, width: tileSize, height: tileSize);
@override
void paint(Canvas canvas, Size size) {
final topLeftCorner = _getSpriteTile(0, 0);
final topRightCorner = _getSpriteTile(tileSize * 2, 0);
final bottomLeftCorner = _getSpriteTile(0, 2 * tileSize);
final bottomRightCorner = _getSpriteTile(tileSize * 2, 2 * tileSize);
final topSide = _getSpriteTile(tileSize, 0);
final bottomSide = _getSpriteTile(tileSize, tileSize * 2);
final leftSide = _getSpriteTile(0, tileSize);
final rightSide = _getSpriteTile(tileSize * 2, tileSize);
final middle = _getSpriteTile(tileSize, tileSize);
final horizontalWidget = size.width - destTileSize * 2;
final verticalHeight = size.height - destTileSize * 2;
// Middle
middle.renderRect(
canvas,
Rect.fromLTWH(
destTileSize,
destTileSize,
horizontalWidget,
verticalHeight,
));
// Top and bottom side
topSide.renderRect(
canvas, Rect.fromLTWH(destTileSize, 0, horizontalWidget, destTileSize));
bottomSide.renderRect(
canvas,
Rect.fromLTWH(destTileSize, size.height - destTileSize,
horizontalWidget, destTileSize));
// Left and right side
leftSide.renderRect(
canvas, Rect.fromLTWH(0, destTileSize, destTileSize, verticalHeight));
rightSide.renderRect(
canvas,
Rect.fromLTWH(size.width - destTileSize, destTileSize, destTileSize,
verticalHeight));
// Corners
topLeftCorner.renderRect(
canvas, Rect.fromLTWH(0, 0, destTileSize, destTileSize));
topRightCorner.renderRect(
canvas,
Rect.fromLTWH(
size.width - destTileSize, 0, destTileSize, destTileSize));
bottomLeftCorner.renderRect(
canvas,
Rect.fromLTWH(
0, size.height - destTileSize, destTileSize, destTileSize));
bottomRightCorner.renderRect(
canvas,
Rect.fromLTWH(size.width - destTileSize, size.height - destTileSize,
destTileSize, destTileSize));
}
@override
bool shouldRepaint(_) => false;
}
class NineTileBox extends widgets.StatelessWidget {
final Image image;
final double tileSize;
final double destTileSize;
final double width;
final double height;
final widgets.Widget child;
final widgets.EdgeInsetsGeometry padding;
NineTileBox({
@required this.image,
@required this.tileSize,
@required this.destTileSize,
Key key,
this.child,
this.width,
this.height,
this.padding,
}) : super(key: key);
@override
widgets.Widget build(widgets.BuildContext context) {
return widgets.Container(
width: width,
height: height,
child: widgets.CustomPaint(
painter: _Painter(
image: image,
tileSize: tileSize,
destTileSize: destTileSize,
),
child: widgets.Container(
child: child,
padding: padding,
),
),
);
}
}