fzhangtj
6 年前
当前提交
3669d263
共有 9 个文件被更改,包括 375 次插入 和 49 次删除
-
3Runtime/gestures/multidrag.cs
-
3Runtime/widgets/app.cs
-
49Runtime/widgets/basic.cs
-
52Runtime/widgets/drag_target.cs
-
32Samples/UIWidgetSample/Navigation.unity
-
194Runtime/widgets/custom_paint.cs
-
11Runtime/widgets/custom_paint.cs.meta
-
69Samples/UIWidgetSample/CustomPaintCanvas.cs
-
11Samples/UIWidgetSample/CustomPaintCanvas.cs.meta
|
|||
using Unity.UIWidgets.foundation; |
|||
using Unity.UIWidgets.gestures; |
|||
using Unity.UIWidgets.rendering; |
|||
using Unity.UIWidgets.ui; |
|||
|
|||
namespace Unity.UIWidgets.widgets { |
|||
public abstract class CustomPainter : Listenable { |
|||
public CustomPainter(Listenable repaint) { |
|||
this._repaint = repaint; |
|||
} |
|||
|
|||
readonly Listenable _repaint; |
|||
|
|||
public void addListener(VoidCallback listener) { |
|||
this._repaint?.addListener(listener); |
|||
} |
|||
|
|||
public void removeListener(VoidCallback listener) { |
|||
this._repaint?.removeListener(listener); |
|||
} |
|||
|
|||
public abstract void paint(Canvas canvas, Size size); |
|||
|
|||
public abstract bool shouldRepaint(CustomPainter oldDelegate); |
|||
|
|||
public virtual bool hitTest(Offset position) { |
|||
return false; |
|||
} |
|||
|
|||
public override string ToString() { |
|||
return $"{Diagnostics.describeIdentity(this)}({this._repaint?.ToString() ?? ""})"; |
|||
} |
|||
} |
|||
|
|||
public class RenderCustomPaint : RenderProxyBox { |
|||
|
|||
public RenderCustomPaint( |
|||
CustomPainter painter = null, |
|||
CustomPainter foregroundPainter = null, |
|||
Size preferredSize = null, |
|||
bool isComplex = false, |
|||
bool willChange = false, |
|||
RenderBox child = null |
|||
): base(child) { |
|||
preferredSize = preferredSize ?? Size.zero; |
|||
this.preferredSize = preferredSize; |
|||
this._painter = painter; |
|||
this._foregroundPainter = foregroundPainter; |
|||
this.isComplex = isComplex; |
|||
this.willChange = willChange; |
|||
} |
|||
|
|||
CustomPainter _painter; |
|||
|
|||
public CustomPainter painter { |
|||
get => this._painter; |
|||
set { |
|||
if (this._painter == value) |
|||
return; |
|||
CustomPainter oldPainter = this._painter; |
|||
this._painter = value; |
|||
this._didUpdatePainter(this._painter, oldPainter); |
|||
} |
|||
} |
|||
|
|||
CustomPainter _foregroundPainter; |
|||
|
|||
public CustomPainter foregroundPainter { |
|||
get => this._foregroundPainter; |
|||
set { |
|||
if (this._foregroundPainter == value) |
|||
return; |
|||
CustomPainter oldPainter = this._foregroundPainter; |
|||
this._foregroundPainter = value; |
|||
this._didUpdatePainter(this._foregroundPainter, oldPainter); |
|||
} |
|||
} |
|||
|
|||
void _didUpdatePainter(CustomPainter newPainter, CustomPainter oldPainter) { |
|||
if (newPainter == null) { |
|||
D.assert(oldPainter != null); |
|||
this.markNeedsPaint(); |
|||
} |
|||
else if (oldPainter == null || |
|||
newPainter.GetType() != oldPainter.GetType() || |
|||
newPainter.shouldRepaint(oldPainter)) { |
|||
this.markNeedsPaint(); |
|||
} |
|||
|
|||
if (this.attached) { |
|||
oldPainter?.removeListener(this.markNeedsPaint); |
|||
newPainter?.addListener(this.markNeedsPaint); |
|||
} |
|||
} |
|||
|
|||
Size _preferredSize; |
|||
|
|||
public Size preferredSize { |
|||
get => this._preferredSize; |
|||
set { |
|||
D.assert(value != null); |
|||
if (this.preferredSize == value) |
|||
return; |
|||
this._preferredSize = value; |
|||
this.markNeedsLayout(); |
|||
} |
|||
} |
|||
|
|||
public bool isComplex; |
|||
|
|||
public bool willChange; |
|||
|
|||
public override void attach(object owner) { |
|||
base.attach(owner); |
|||
this._painter?.addListener(this.markNeedsPaint); |
|||
this._foregroundPainter?.addListener(this.markNeedsPaint); |
|||
} |
|||
|
|||
public override void detach() { |
|||
this._painter?.removeListener(this.markNeedsPaint); |
|||
this._foregroundPainter?.removeListener(this.markNeedsPaint); |
|||
base.detach(); |
|||
} |
|||
|
|||
protected override bool hitTestChildren(HitTestResult result, Offset position) { |
|||
if (this._foregroundPainter != null && (this._foregroundPainter.hitTest(position))) |
|||
return true; |
|||
return base.hitTestChildren(result, position: position); |
|||
} |
|||
|
|||
|
|||
protected override bool hitTestSelf(Offset position) { |
|||
return this._painter != null && this._painter.hitTest(position); |
|||
} |
|||
|
|||
protected override void performResize() { |
|||
this.size = this.constraints.constrain(this.preferredSize); |
|||
} |
|||
|
|||
void _paintWithPainter(Canvas canvas, Offset offset, CustomPainter painter) { |
|||
int debugPreviousCanvasSaveCount = 0; |
|||
canvas.save(); |
|||
D.assert(() => { |
|||
debugPreviousCanvasSaveCount = canvas.getSaveCount(); |
|||
return true; |
|||
}); |
|||
if (offset != Offset.zero) |
|||
canvas.translate(offset.dx, offset.dy); |
|||
painter.paint(canvas, this.size); |
|||
D.assert(() => { |
|||
int debugNewCanvasSaveCount = canvas.getSaveCount(); |
|||
if (debugNewCanvasSaveCount > debugPreviousCanvasSaveCount) |
|||
throw new UIWidgetsError( |
|||
$"{debugNewCanvasSaveCount - debugPreviousCanvasSaveCount} more " + |
|||
$"time{((debugNewCanvasSaveCount - debugPreviousCanvasSaveCount == 1) ? "" : "s")} " + |
|||
"than it called canvas.restore().\n" + |
|||
"This leaves the canvas in an inconsistent state and will probably result in a broken display.\n" + |
|||
"You must pair each call to save()/saveLayer() with a later matching call to restore()." |
|||
); |
|||
if (debugNewCanvasSaveCount < debugPreviousCanvasSaveCount) |
|||
throw new UIWidgetsError( |
|||
$"The {painter} custom painter called canvas.restore() " + |
|||
$"{debugPreviousCanvasSaveCount - debugNewCanvasSaveCount} more " + |
|||
$"time{(debugPreviousCanvasSaveCount - debugNewCanvasSaveCount == 1 ? "" : "s")} " + |
|||
"than it called canvas.save() or canvas.saveLayer().\n" + |
|||
"This leaves the canvas in an inconsistent state and will result in a broken display.\n" + |
|||
"You should only call restore() if you first called save() or saveLayer()." |
|||
); |
|||
return debugNewCanvasSaveCount == debugPreviousCanvasSaveCount; |
|||
}); |
|||
canvas.restore(); |
|||
} |
|||
|
|||
public override void paint(PaintingContext context, Offset offset) { |
|||
if (this._painter != null) { |
|||
this._paintWithPainter(context.canvas, offset, this._painter); |
|||
this._setRasterCacheHints(context); |
|||
} |
|||
|
|||
base.paint(context, offset); |
|||
if (this._foregroundPainter != null) { |
|||
this._paintWithPainter(context.canvas, offset, this._foregroundPainter); |
|||
this._setRasterCacheHints(context); |
|||
} |
|||
} |
|||
|
|||
void _setRasterCacheHints(PaintingContext context) { |
|||
if (this.isComplex) |
|||
context.setIsComplexHint(); |
|||
if (this.willChange) |
|||
context.setWillChangeHint(); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: a4b3c34c9775f4b9995fb37535490751 |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using Unity.UIWidgets.engine; |
|||
using Unity.UIWidgets.foundation; |
|||
using Unity.UIWidgets.ui; |
|||
using Unity.UIWidgets.widgets; |
|||
|
|||
namespace UIWidgetsSample { |
|||
|
|||
public class CustomPaintCanvas: WidgetCanvas { |
|||
|
|||
protected override Widget getWidget() { |
|||
return new CustomPaint( |
|||
child: new Container(width: 300, height: 300, color: new Color(0XFFFFFFFF)), |
|||
foregroundPainter: new GridPainter(null) |
|||
); |
|||
} |
|||
} |
|||
|
|||
public class GridPainter : CustomPainter { |
|||
public GridPainter(Listenable repaint) : base(repaint) { |
|||
} |
|||
|
|||
public override void paint(Canvas canvas, Size size) { |
|||
int numGrid = 4; |
|||
var paint = new Paint(); |
|||
paint.color = new Color(0xFFFF0000); |
|||
paint.strokeWidth = 2; |
|||
paint.style = PaintingStyle.stroke; |
|||
for (int i = 1; i < numGrid; i++) { |
|||
double offsetY = size.height * i / numGrid; |
|||
canvas.drawLine(new Offset(0, offsetY), new Offset(size.width, offsetY), |
|||
paint); |
|||
} |
|||
for (int i = 1; i < numGrid; i++) { |
|||
double offsetx = size.width * i / numGrid; |
|||
canvas.drawLine(new Offset(offsetx, 0), new Offset(offsetx, size.height), |
|||
paint); |
|||
} |
|||
|
|||
|
|||
// draw a arrow line
|
|||
canvas.save(); |
|||
canvas.rotate(0.4); |
|||
canvas.scale(2, 2); |
|||
canvas.translate(50, 50); |
|||
canvas.drawLine(new Offset(0, 0), new Offset(100, 0), |
|||
new Paint(){ |
|||
color = new Color(0xFFFF0000), |
|||
strokeWidth = 2, |
|||
style = PaintingStyle.stroke |
|||
}); |
|||
var path = new Path(); |
|||
var arrowPaint = new Paint() { |
|||
color = new Color(0xFFFF0000), |
|||
style = PaintingStyle.fill |
|||
}; |
|||
path.moveTo(100, 0); |
|||
path.lineTo(100, 5); |
|||
path.lineTo(120, 0); |
|||
path.lineTo(100, -5); |
|||
path.close(); |
|||
canvas.drawPath(path, arrowPaint); |
|||
canvas.restore(); |
|||
} |
|||
|
|||
public override bool shouldRepaint(CustomPainter oldDelegate) { |
|||
return false; |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 5debfd6de8ea942d487383a56aad8491 |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
撰写
预览
正在加载...
取消
保存
Reference in new issue