您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
145 行
5.6 KiB
145 行
5.6 KiB
using System.Collections.Generic;
|
|
using Unity.UIWidgets.animation;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.ui;
|
|
|
|
namespace Unity.UIWidgets.rendering {
|
|
{% macro RenderAnimatedOpacityMixin(with) %}
|
|
public abstract class RenderAnimatedOpacityMixin{{with}}<ChildType> : RenderProxySliver, RenderAnimatedOpacityMixin<ChildType> where ChildType : RenderObject {
|
|
|
|
|
|
public int _alpha { get; set;}
|
|
public new bool alwaysNeedsCompositing {
|
|
get { return child != null && _currentlyNeedsCompositing;}
|
|
}
|
|
public bool _currentlyNeedsCompositing { get;set; }
|
|
|
|
public Animation<float> opacity {
|
|
get { return _opacity; }
|
|
set {
|
|
D.assert(value != null);
|
|
if (_opacity == value)
|
|
return;
|
|
if (attached && _opacity != null)
|
|
_opacity.removeListener(_updateOpacity);
|
|
_opacity = value;
|
|
if (attached)
|
|
_opacity.addListener(_updateOpacity);
|
|
_updateOpacity();
|
|
}
|
|
}
|
|
public Animation<float> _opacity { get; set; }
|
|
|
|
|
|
public bool alwaysIncludeSemantics {
|
|
get { return _alwaysIncludeSemantics; }
|
|
set {
|
|
if (value == _alwaysIncludeSemantics)
|
|
return;
|
|
_alwaysIncludeSemantics = value;
|
|
//markNeedsSemanticsUpdate();
|
|
|
|
}
|
|
}
|
|
public bool _alwaysIncludeSemantics { get; set; }
|
|
|
|
public void attach(PipelineOwner owner) {
|
|
base.attach(owner);
|
|
_opacity.addListener(_updateOpacity);
|
|
_updateOpacity();
|
|
}
|
|
|
|
public override void detach() {
|
|
_opacity.removeListener(_updateOpacity);
|
|
base.detach();
|
|
}
|
|
public void _updateOpacity() {
|
|
int oldAlpha = _alpha;
|
|
_alpha = ui.Color.getAlphaFromOpacity((float)_opacity.value);
|
|
if (oldAlpha != _alpha) {
|
|
bool didNeedCompositing = _currentlyNeedsCompositing;
|
|
_currentlyNeedsCompositing = _alpha > 0 && _alpha < 255;
|
|
if (child != null && didNeedCompositing != _currentlyNeedsCompositing)
|
|
markNeedsCompositingBitsUpdate();
|
|
markNeedsPaint();
|
|
//if (oldAlpha == 0 || _alpha == 0)
|
|
// markNeedsSemanticsUpdate();
|
|
|
|
}
|
|
}
|
|
public override void paint(PaintingContext context, Offset offset) {
|
|
if (child != null) {
|
|
if (_alpha == 0) {
|
|
layer = null;
|
|
return;
|
|
}
|
|
if (_alpha == 255) {
|
|
layer = null;
|
|
context.paintChild(child, offset);
|
|
return;
|
|
}
|
|
D.assert(needsCompositing);
|
|
layer = context.pushOpacity(offset, _alpha, base.paint, oldLayer: layer as OpacityLayer);
|
|
}
|
|
}
|
|
|
|
public void visitChildrenForSemantics(RenderObjectVisitor visitor) {
|
|
if (child != null && (_alpha != 0 || alwaysIncludeSemantics))
|
|
visitor(child);
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
base.debugFillProperties(properties);
|
|
properties.add(new DiagnosticsProperty<Animation<float>>("opacity", opacity));
|
|
properties.add(new FlagProperty("alwaysIncludeSemantics", value: alwaysIncludeSemantics, ifTrue: "alwaysIncludeSemantics"));
|
|
}
|
|
|
|
public bool debugValidateChild(RenderObject child) {
|
|
D.assert(() => {
|
|
if (!(child is ChildType)) {
|
|
throw new UIWidgetsError(new List<DiagnosticsNode>{
|
|
new ErrorSummary(
|
|
$"A {GetType()} expected a child of type {typeof(ChildType)} but received a " +
|
|
$"child of type {child.GetType()}."
|
|
),
|
|
new ErrorDescription(
|
|
"RenderObjects expect specific types of children because they " +
|
|
"coordinate with their children during layout and paint. For " +
|
|
"example, a RenderSliver cannot be the child of a RenderBox because " +
|
|
"a RenderSliver does not understand the RenderBox layout protocol."
|
|
),
|
|
new ErrorSpacer(),
|
|
new DiagnosticsProperty<dynamic>(
|
|
"The $runtimeType that expected a $ChildType child was created by",
|
|
debugCreator,
|
|
style: DiagnosticsTreeStyle.errorProperty
|
|
),
|
|
new ErrorSpacer(),
|
|
new DiagnosticsProperty<dynamic>(
|
|
"The ${child.runtimeType} that did not match the expected child type " +
|
|
"was created by",
|
|
child.debugCreator,
|
|
style: DiagnosticsTreeStyle.errorProperty
|
|
),
|
|
});
|
|
}
|
|
return true;
|
|
});
|
|
return true;
|
|
}
|
|
|
|
public ChildType child { get; set; }
|
|
|
|
RenderObject RenderObjectWithChildMixin.child {
|
|
get { return child; }
|
|
set { child = (ChildType) value; }
|
|
}
|
|
|
|
}
|
|
{% endmacro %}
|
|
|
|
{{ RenderAnimatedOpacityMixin('RenderSliver') }}
|
|
|
|
}
|
|
|
|
|