mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-02 03:15:43 +08:00
Adding SpriteButton
This commit is contained in:
2
doc/examples/widgets/.gitignore
vendored
2
doc/examples/widgets/.gitignore
vendored
@ -70,3 +70,5 @@
|
||||
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||
|
||||
.flutter-plugins-dependencies
|
||||
|
||||
web
|
||||
|
||||
BIN
doc/examples/widgets/assets/images/buttons.png
Normal file
BIN
doc/examples/widgets/assets/images/buttons.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 235 B |
16
doc/examples/widgets/lib/generated_plugin_registrant.dart
Normal file
16
doc/examples/widgets/lib/generated_plugin_registrant.dart
Normal file
@ -0,0 +1,16 @@
|
||||
//
|
||||
// Generated file. Do not edit.
|
||||
//
|
||||
|
||||
// ignore: unused_import
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:audioplayers/audioplayers_web.dart';
|
||||
|
||||
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
|
||||
|
||||
// ignore: public_member_api_docs
|
||||
void registerPlugins(PluginRegistry registry) {
|
||||
AudioplayersPlugin.registerWith(registry.registrarFor(AudioplayersPlugin));
|
||||
registry.registerMessageHandler();
|
||||
}
|
||||
@ -1,13 +1,19 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flame/flame.dart';
|
||||
import 'package:flame/spritesheet.dart';
|
||||
import 'package:dashbook/dashbook.dart';
|
||||
|
||||
import 'package:flame/widgets/nine_tile_box.dart';
|
||||
import 'package:flame/widgets/sprite_button.dart';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
final nineTileBoxImage = await Flame.images.load('nine_tile_box.png');
|
||||
await Flame.images.load('buttons.png');
|
||||
|
||||
final _buttons = SpriteSheet(imageName: 'buttons.png', textureHeight: 20, textureWidth: 60, columns: 1, rows: 2);
|
||||
|
||||
final dashbook = Dashbook();
|
||||
|
||||
dashbook.storiesOf('NineTileBox').decorator(CenterDecorator()).add(
|
||||
@ -30,5 +36,17 @@ void main() async {
|
||||
),
|
||||
));
|
||||
|
||||
dashbook.storiesOf('SpriteButton').decorator(CenterDecorator()).add(
|
||||
'default',
|
||||
(ctx) => Container(padding: const EdgeInsets.all(20), child: SpriteButton(
|
||||
onPressed: () {
|
||||
print('Pressed');
|
||||
},
|
||||
label: const Text('Sprite Button', style: const TextStyle(color: const Color(0xFF5D275D))),
|
||||
sprite: _buttons.getSprite(0, 0),
|
||||
pressedSprite: _buttons.getSprite(1, 0),
|
||||
)),
|
||||
);
|
||||
|
||||
runApp(dashbook);
|
||||
}
|
||||
|
||||
@ -11,10 +11,11 @@ dependencies:
|
||||
sdk: flutter
|
||||
flame:
|
||||
path: ../../../
|
||||
dashbook: ^0.0.2
|
||||
dashbook: ^0.0.4
|
||||
|
||||
cupertino_icons: ^0.1.2
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
assets:
|
||||
- assets/images/nine_tile_box.png
|
||||
- assets/images/buttons.png
|
||||
|
||||
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