flutter/examples/rendering/touch_demo.dart
Adam Barth dea3a0922c Add package:sky/rendering.dart
Similar to widgets.dart, rendering.dart exports the entire rendering layer.
Also, update the examples to use rendering.dart and widgets.dart. Also clean up
some exports so that the examples have more sensible imports.
2015-08-18 21:39:51 -07:00

91 lines
2.4 KiB
Dart

// Copyright 2015 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:sky' as sky;
import 'package:sky/rendering.dart';
import 'package:sky/theme/colors.dart' as colors;
// Material design colors. :p
List<Color> kColors = [
colors.Teal[500],
colors.Amber[500],
colors.Purple[500],
colors.LightBlue[500],
colors.DeepPurple[500],
colors.Lime[500],
];
class Dot {
final Paint _paint;
Point position = Point.origin;
double radius = 0.0;
Dot({ Color color }) : _paint = new Paint()..color = color;
void update(sky.PointerEvent event) {
position = new Point(event.x, event.y);
radius = 5 + (95 * event.pressure);
}
void paint(PaintingContext context, Offset offset) {
context.canvas.drawCircle(position + offset, radius, _paint);
}
}
class RenderTouchDemo extends RenderBox {
Map<int, Dot> dots = new Map();
RenderTouchDemo();
EventDisposition handleEvent(sky.Event event, BoxHitTestEntry entry) {
if (event is sky.PointerEvent) {
switch (event.type) {
case 'pointerdown':
Color color = kColors[event.pointer.remainder(kColors.length)];
dots[event.pointer] = new Dot(color: color)..update(event);
break;
case 'pointerup':
dots.remove(event.pointer);
break;
case 'pointercancel':
dots = new Map();
break;
case 'pointermove':
dots[event.pointer].update(event);
break;
}
markNeedsPaint();
return EventDisposition.processed;
}
return EventDisposition.processed;
}
void performLayout() {
size = constraints.biggest;
}
void paint(PaintingContext context, Offset offset) {
final PaintingCanvas canvas = context.canvas;
Paint white = new Paint()
..color = const Color(0xFFFFFFFF);
canvas.drawRect(offset & size, white);
for (Dot dot in dots.values)
dot.paint(context, offset);
}
}
void main() {
var paragraph = new RenderParagraph(new PlainTextSpan("Touch me!"));
var stack = new RenderStack(children: [
new RenderTouchDemo(),
paragraph,
]);
// Prevent the RenderParagraph from filling the whole screen so
// that it doesn't eat events.
paragraph.parentData..top = 40.0
..left = 20.0;
new SkyBinding(root: stack);
}