mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-03 04:18:25 +08:00
Adding SpriteButton
This commit is contained in:
77
lib/widgets/sprite_button.dart
Normal file
77
lib/widgets/sprite_button.dart
Normal file
@ -0,0 +1,77 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
import '../sprite.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
class SpriteButton extends StatefulWidget {
|
||||
final VoidCallback onPressed;
|
||||
final Widget label;
|
||||
final Sprite sprite;
|
||||
final Sprite pressedSprite;
|
||||
final double width;
|
||||
final double height;
|
||||
|
||||
SpriteButton({
|
||||
@required this.onPressed,
|
||||
@required this.label,
|
||||
@required this.sprite,
|
||||
@required this.pressedSprite,
|
||||
|
||||
this.width,
|
||||
this.height,
|
||||
});
|
||||
|
||||
@override
|
||||
State createState() => _ButtonState();
|
||||
}
|
||||
|
||||
class _ButtonState extends State<SpriteButton> {
|
||||
bool _pressed = false;
|
||||
|
||||
@override
|
||||
Widget build(_) {
|
||||
final width = widget.width ?? 200;
|
||||
final height = widget.height ?? 50;
|
||||
|
||||
return GestureDetector(
|
||||
onTapDown: (_) {
|
||||
setState(() {
|
||||
_pressed = true;
|
||||
});
|
||||
},
|
||||
onTapUp: (_) {
|
||||
setState(() {
|
||||
_pressed = false;
|
||||
});
|
||||
|
||||
widget.onPressed?.call();
|
||||
},
|
||||
child: Container(
|
||||
width: width,
|
||||
height: height,
|
||||
child: CustomPaint(
|
||||
painter: _ButtonPainer(_pressed ? widget.pressedSprite : widget.sprite),
|
||||
child: Center(
|
||||
child: Container(
|
||||
padding: _pressed ? const EdgeInsets.only(top: 5) : null,
|
||||
child: widget.label,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _ButtonPainer extends CustomPainter {
|
||||
final Sprite _sprite;
|
||||
|
||||
_ButtonPainer(this._sprite);
|
||||
|
||||
@override
|
||||
bool shouldRepaint(_ButtonPainer old) => old._sprite != _sprite;
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
_sprite.renderRect(canvas, Rect.fromLTWH(0, 0, size.width, size.height));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user