mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Attempt to write a RenderShadowedBox
The goal of this is to have a Renderer-layer abstraction around the Sky Engine c++ apis for drawing a shadow. R=mpcomplete@chromium.org Review URL: https://codereview.chromium.org/1146893004
This commit is contained in:
parent
67d883c506
commit
54d01bc005
@ -24,6 +24,7 @@
|
||||
|
||||
void setPaintBits(unsigned long bits);
|
||||
void setColorMode(TransferMode mode);
|
||||
// TODO(eseidel): Offset should be a Size not a Point.
|
||||
void setOffset(Point offset);
|
||||
void setPostTranslate(boolean postTranslate);
|
||||
};
|
||||
|
||||
22
examples/raw/shadowed_box.dart
Normal file
22
examples/raw/shadowed_box.dart
Normal file
@ -0,0 +1,22 @@
|
||||
// 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';
|
||||
import 'package:sky/framework/app.dart';
|
||||
import 'package:sky/framework/rendering/box.dart';
|
||||
import 'package:sky/framework/rendering/flex.dart';
|
||||
|
||||
AppView app;
|
||||
|
||||
void main() {
|
||||
var coloredBox = new RenderDecoratedBox(
|
||||
decoration: new BoxDecoration(backgroundColor: const Color(0xFFFFFF00))
|
||||
);
|
||||
var shadow = const BoxShadow(
|
||||
color: const Color(0xFFEEEEEE), offset: const Size(5.0, 5.0), blur: 5.0);
|
||||
var shadowBox = new RenderShadowedBox(shadow: shadow, child: coloredBox);
|
||||
var paddedBox = new RenderPadding(padding: const EdgeDims.all(30.0),
|
||||
child: shadowBox);
|
||||
app = new AppView(paddedBox);
|
||||
}
|
||||
@ -601,6 +601,62 @@ class RenderSizeObserver extends RenderProxyBox {
|
||||
}
|
||||
}
|
||||
|
||||
// This must be immutable, because we won't notice when it changes
|
||||
class BoxShadow {
|
||||
const BoxShadow({
|
||||
this.color,
|
||||
this.offset,
|
||||
this.blur
|
||||
});
|
||||
|
||||
final sky.Size offset;
|
||||
final double blur;
|
||||
final sky.Color color;
|
||||
}
|
||||
|
||||
class RenderShadowedBox extends RenderProxyBox {
|
||||
|
||||
RenderShadowedBox({
|
||||
BoxShadow shadow,
|
||||
RenderBox child
|
||||
}) : _shadow = shadow, super(child);
|
||||
|
||||
BoxShadow _shadow;
|
||||
BoxShadow get shadow => _shadow;
|
||||
void set shadow (BoxShadow value) {
|
||||
if (value == _shadow)
|
||||
return;
|
||||
_shadow = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
sky.Paint _createShadowPaint(BoxShadow shadow) {
|
||||
// TODO(eseidel): This should not be hard-coded yellow.
|
||||
sky.Paint paint = new sky.Paint()..color = const sky.Color.fromARGB(255, 0, 255, 0);
|
||||
var builder = new sky.LayerDrawLooperBuilder()
|
||||
// Shadow layer.
|
||||
..addLayerOnTop(
|
||||
new sky.DrawLooperLayerInfo()
|
||||
..setPaintBits(-1)
|
||||
..setOffset(shadow.offset.toPoint())
|
||||
..setColorMode(sky.TransferMode.srcMode),
|
||||
(sky.Paint layerPaint) {
|
||||
layerPaint.color = shadow.color;
|
||||
layerPaint.setMaskFilter(
|
||||
new sky.MaskFilter.Blur(sky.BlurStyle.normal, shadow.blur, highQuality: true));
|
||||
})
|
||||
// Main layer.
|
||||
..addLayerOnTop(new sky.DrawLooperLayerInfo(), (_) {});
|
||||
paint.setDrawLooper(builder.build());
|
||||
return paint;
|
||||
}
|
||||
|
||||
void paint(RenderObjectDisplayList canvas) {
|
||||
sky.Paint paint = _createShadowPaint(_shadow);
|
||||
canvas.drawRect(new sky.Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint);
|
||||
super.paint(canvas);
|
||||
}
|
||||
}
|
||||
|
||||
// RENDER VIEW LAYOUT MANAGER
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user