flutter/examples/flutter_gallery/lib/demo/drawing_demo.dart
2016-05-09 11:00:54 -07:00

86 lines
2.2 KiB
Dart

// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_sprites/flutter_sprites.dart';
class DrawingDemo extends StatefulWidget {
static const String routeName = '/drawing';
@override
_DrawingDemoState createState() => new _DrawingDemoState();
}
class _DrawingDemoState extends State<DrawingDemo> {
_LineDrawingNode _rootNode;
ImageMap _images;
Future<Null> _loadAssets(AssetBundle bundle) async {
_images = new ImageMap(bundle);
await _images.load(<String>[
'packages/flutter_gallery_assets/fancylines.png'
]);
}
@override
void initState() {
super.initState();
_loadAssets(DefaultAssetBundle.of(context)).then((_) {
setState(() {
_rootNode = new _LineDrawingNode(_images);
});
});
}
@override
Widget build(BuildContext context) {
Widget body;
if (_rootNode == null) {
body = new Center(
child: new CircularProgressIndicator()
);
} else {
body = new SpriteWidget(_rootNode, SpriteBoxTransformMode.nativePoints);
}
return new Scaffold(
appBar: new AppBar(
title: new Text('Fancy lines')
),
body: body
);
}
}
class _LineDrawingNode extends NodeWithSize {
_LineDrawingNode(this._images) : super(const Size(1024.0, 1024.0)) {
userInteractionEnabled = true;
}
final ImageMap _images;
EffectLine _currentLine;
@override
bool handleEvent(SpriteBoxEvent event) {
if (event.type == PointerDownEvent) {
_currentLine = new EffectLine(
texture: new Texture(_images['packages/flutter_gallery_assets/fancylines.png']),
colorSequence: new ColorSequence.fromStartAndEndColor(Colors.purple[500], Colors.purple[600]),
fadeAfterDelay: 3.0,
fadeDuration: 1.0
);
_currentLine.addPoint(event.boxPosition);
addChild(_currentLine);
} else if (event.type == PointerMoveEvent) {
_currentLine.addPoint(event.boxPosition);
}
return true;
}
}