TextField class
class TextField extends InteractiveObject {
String _text = "";
TextFormat _defaultTextFormat = null;
String _autoSize = TextFieldAutoSize.NONE;
String _type = TextFieldType.DYNAMIC;
int _caretIndex = 0;
int _caretLine = 0;
num _caretTime = 0.0;
num _caretX = 0.0;
num _caretY = 0.0;
num _caretWidth = 0.0;
num _caretHeight = 0.0;
bool _wordWrap = false;
bool _multiline = false;
bool _displayAsPassword = false;
bool _background = false;
bool _border = false;
String _passwordChar = "•";
int _backgroundColor = 0xFFFFFF;
int _borderColor = 0x000000;
int _maxChars = 0;
num _width = 100;
num _height = 100;
num _textWidth = 0.0;
num _textHeight = 0.0;
final List<TextLineMetrics> _textLineMetrics = new List<TextLineMetrics>();
int _refreshPending = 3; // bit 0: textLineMetrics, bit 1: cache
bool _cacheAsBitmap = true;
RenderTexture _renderTexture;
//-------------------------------------------------------------------------------------------------
TextField([String text, TextFormat textFormat]) {
this.text = (text != null) ? text : "";
this.defaultTextFormat = (textFormat != null) ? textFormat : new TextFormat("Arial", 12, 0x000000);
this.onKeyDown.listen(_onKeyDown);
this.onTextInput.listen(_onTextInput);
this.onMouseDown.listen(_onMouseDown);
}
//-------------------------------------------------------------------------------------------------
RenderTexture get renderTexture => _renderTexture;
String get text => _text;
int get textColor => _defaultTextFormat.color;
TextFormat get defaultTextFormat => _defaultTextFormat;
int get caretIndex => _caretIndex;
String get autoSize => _autoSize;
String get type => _type;
bool get wordWrap => _wordWrap;
bool get multiline => _multiline;
bool get displayAsPassword => _displayAsPassword;
bool get background => _background;
bool get border => _border;
bool get cacheAsBitmap => _cacheAsBitmap;
String get passwordChar => _passwordChar;
int get backgroundColor => _backgroundColor;
int get borderColor => _borderColor;
int get maxChars => _maxChars;
//-------------------------------------------------------------------------------------------------
void set width(num value) {
_width = value.toDouble();
_refreshPending |= 3;
}
void set height(num value) {
_height = value.toDouble();
_refreshPending |= 3;
}
void set text(String value) {
_text = value.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
_caretIndex = _text.length;
_refreshPending |= 3;
}
void set textColor(int value) {
_defaultTextFormat.color = value;
_refreshPending |= 2;
}
void set defaultTextFormat(TextFormat value) {
_defaultTextFormat = value.clone();
_refreshPending |= 3;
}
void set autoSize(String value) {
_autoSize = value;
_refreshPending |= 3;
}
void set type(String value) {
_type = value;
_refreshPending |= 3;
}
void set wordWrap(bool value) {
_wordWrap = value;
_refreshPending |= 3;
}
void set multiline(bool value) {
_multiline = value;
_refreshPending |= 3;
}
void set displayAsPassword(bool value) {
_displayAsPassword = value;
_refreshPending |= 3;
}
void set passwordChar(String value) {
_passwordChar = value[0];
_refreshPending |= 3;
}
void set background(bool value) {
_background = value;
_refreshPending |= 2;
}
void set backgroundColor(int value) {
_backgroundColor = value;
_refreshPending |= 2;
}
void set border(bool value) {
_border = value;
_refreshPending |= 2;
}
void set borderColor(int value) {
_borderColor = value;
_refreshPending |= 2;
}
void set maxChars(int value) {
_maxChars = value;
}
void set cacheAsBitmap(bool value) {
if (value) _refreshPending |= 2;
_cacheAsBitmap = value;
}
//-------------------------------------------------------------------------------------------------
num get x {
_refreshTextLineMetrics();
return super.x;
}
num get width {
_refreshTextLineMetrics();
return _width;
}
num get height {
_refreshTextLineMetrics();
return _height;
}
num get textWidth {
_refreshTextLineMetrics();
return _textWidth;
}
num get textHeight {
_refreshTextLineMetrics();
return _textHeight;
}
int get numLines {
_refreshTextLineMetrics();
return _textLineMetrics.length;
}
TextLineMetrics getLineMetrics(int lineIndex) {
_refreshTextLineMetrics();
return _textLineMetrics[lineIndex];
}
String getLineText(int lineIndex) {
return getLineMetrics(lineIndex)._text;
}
int getLineLength(int lineIndex) {
return getLineText(lineIndex).length;
}
Matrix get transformationMatrix {
_refreshTextLineMetrics();
return super.transformationMatrix;
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
Rectangle getBoundsTransformed(Matrix matrix, [Rectangle returnRectangle]) {
return _getBoundsTransformedHelper(matrix, _width, _height, returnRectangle);
}
//-------------------------------------------------------------------------------------------------
DisplayObject hitTestInput(num localX, num localY) {
if (localX >= 0 && localY >= 0 && localX < _width && localY < _height)
return this;
return null;
}
//-------------------------------------------------------------------------------------------------
void render(RenderState renderState) {
_refreshTextLineMetrics();
var renderContext = renderState.renderContext;
if (_cacheAsBitmap || renderContext is! RenderContextCanvas) {
_refreshCache();
renderState.renderQuad(_renderTexture.quad);
} else {
var renderContextCanvas = renderState.renderContext as RenderContextCanvas;
var context = renderContextCanvas.rawContext;
var matrix = renderState.globalMatrix;
context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);
context.globalAlpha = renderState.globalAlpha;
_renderText(renderContextCanvas.rawContext);
}
// draw cursor for INPUT text fields
_caretTime += renderState.deltaTime;
if (_type == TextFieldType.INPUT) {
var stage = this.stage;
if (stage != null && stage.focus == this && _caretTime.remainder(0.8) < 0.4) {
var x1 = _caretX;
var y1 = _caretY;
var x3 = _caretX + _caretWidth;
var y3 = _caretY + _caretHeight;
var color = _defaultTextFormat.color;
renderState.renderTriangle(x1, y1, x3, y1, x3, y3, color);
renderState.renderTriangle(x1, y1, x3, y3, x1, y3, color);
}
}
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
_refreshTextLineMetrics() {
if ((_refreshPending & 1) == 0) {
return;
} else {
_refreshPending &= 255 - 1;
}
_textLineMetrics.clear();
//-----------------------------------
// split lines
var startIndex = 0;
var checkLine = '';
var validLine = '';
var lineWidth = 0;
var lineIndent = 0;
var textFormatSize = _ensureNum(_defaultTextFormat.size);
var textFormatLeftMargin = _ensureNum(_defaultTextFormat.leftMargin);
var textFormatRightMargin = _ensureNum(_defaultTextFormat.rightMargin);
var textFormatTopMargin = _ensureNum(_defaultTextFormat.topMargin);
var textFormatBottomMargin = _ensureNum(_defaultTextFormat.bottomMargin);
var textFormatIndent = _ensureNum(_defaultTextFormat.indent);
var textFormatLeading = _ensureNum(defaultTextFormat.leading);
var textFormatAlign = _ensureString(_defaultTextFormat.align);
var fontStyle = _defaultTextFormat._cssFontStyle;
var fontStyleMetrics = _getFontStyleMetrics(fontStyle);
var fontStyleMetricsAscent = _ensureNum(fontStyleMetrics.ascent);
var fontStyleMetricsDescent = _ensureNum(fontStyleMetrics.descent);
var availableWidth = _width - textFormatLeftMargin - textFormatRightMargin;
var canvasContext = _dummyCanvasContext;
var paragraphLines = new List<int>();
var paragraphs = _text.split('\n');
canvasContext.font = fontStyle;
canvasContext.textAlign = "start";
canvasContext.textBaseline = "alphabetic";
canvasContext.setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
for(int p = 0; p < paragraphs.length; p++) {
var paragraph = paragraphs[p];
if (paragraph is! String) continue; // dart2js_hint
paragraphLines.add(_textLineMetrics.length);
if (_wordWrap == false) {
_textLineMetrics.add(new TextLineMetrics._internal(paragraph, startIndex));
startIndex += paragraph.length + 1;
} else {
checkLine = null;
lineIndent = textFormatIndent;
var words = paragraph.split(' ');
for(int w = 0; w < words.length; w++) {
var word = words[w];
if (word is! String) continue; // dart2js_hint
validLine = checkLine;
checkLine = (validLine == null) ? word : "$validLine $word";
checkLine = _passwordEncoder(checkLine);
lineWidth = canvasContext.measureText(checkLine).width.toDouble();
if (lineIndent + lineWidth >= availableWidth) {
if (validLine == null) {
_textLineMetrics.add(new TextLineMetrics._internal(checkLine, startIndex));
startIndex += checkLine.length + 1;
checkLine = null;
lineIndent = 0;
} else {
_textLineMetrics.add(new TextLineMetrics._internal(validLine, startIndex));
startIndex += validLine.length + 1;
checkLine = _passwordEncoder(word);
lineIndent = 0;
}
}
}
if (checkLine != null) {
_textLineMetrics.add(new TextLineMetrics._internal(checkLine, startIndex));
startIndex += checkLine.length + 1;
}
}
}
//-----------------------------------
// calculate metrics
_textWidth = 0.0;
_textHeight = 0.0;
for(int line = 0; line < _textLineMetrics.length; line++) {
var textLineMetrics = _textLineMetrics[line];
if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint
var indent = paragraphLines.contains(line) ? textFormatIndent : 0;
var offsetX = textFormatLeftMargin + indent;
var offsetY = textFormatTopMargin + textFormatSize +
line * (textFormatLeading + textFormatSize + fontStyleMetricsDescent);
var width = canvasContext.measureText(textLineMetrics._text).width.toDouble();
textLineMetrics._x = offsetX;
textLineMetrics._y = offsetY;
textLineMetrics._width = width;
textLineMetrics._height = textFormatSize;
textLineMetrics._ascent = fontStyleMetricsAscent;
textLineMetrics._descent = fontStyleMetricsDescent;
textLineMetrics._leading = textFormatLeading;
textLineMetrics._indent = indent;
_textWidth = max(_textWidth, textFormatLeftMargin + indent + width + textFormatRightMargin);
_textHeight = offsetY + fontStyleMetricsDescent + textFormatBottomMargin;
}
//-----------------------------------
// calculate TextField autoSize
var autoWidth = _wordWrap ? _width : _textWidth.ceil();
var autoHeight = _textHeight.ceil();
if (_width != autoWidth || _height != autoHeight) {
switch(_autoSize) {
case TextFieldAutoSize.LEFT:
_width = autoWidth;
_height = autoHeight;
break;
case TextFieldAutoSize.RIGHT:
super.x -= (autoWidth - _width);
_width = autoWidth;
_height = autoHeight;
break;
case TextFieldAutoSize.CENTER:
super.x -= (autoWidth - _width) / 2;
_width = autoWidth;
_height = autoHeight;
break;
}
}
availableWidth = _width - textFormatLeftMargin - textFormatRightMargin;
//-----------------------------------
// calculate TextFormat align
for(int line = 0; line < _textLineMetrics.length; line++) {
var textLineMetrics = _textLineMetrics[line];
if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint
switch(textFormatAlign) {
case TextFormatAlign.CENTER:
case TextFormatAlign.JUSTIFY:
textLineMetrics._x += (availableWidth - textLineMetrics.width) / 2;
break;
case TextFormatAlign.RIGHT:
case TextFormatAlign.END:
textLineMetrics._x += (availableWidth - textLineMetrics.width);
break;
}
}
//-----------------------------------
// calculate caret position
if (_type == TextFieldType.INPUT) {
for(int line = _textLineMetrics.length - 1; line >= 0; line--) {
var textLineMetrics = _textLineMetrics[line];
if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint
if (_caretIndex >= textLineMetrics._textIndex) {
var textIndex = _caretIndex - textLineMetrics._textIndex;
var text = textLineMetrics._text.substring(0, textIndex);
_caretLine = line;
_caretX = textLineMetrics.x + canvasContext.measureText(text).width.toDouble();
_caretY = textLineMetrics.y - fontStyleMetricsAscent * 0.9;
_caretWidth = 2.0;
_caretHeight = textFormatSize;
break;
}
}
var shiftX = 0.0;
var shiftY = 0.0;
while (shiftX + _caretX > _width) shiftX -= _width * 0.2;
while (shiftX + _caretX < 0) shiftX += _width * 0.2;
while (shiftY + _caretY + _caretHeight > _height) shiftY -= textFormatSize;
while (shiftY + _caretY < 0) shiftY += textFormatSize;
_caretX += shiftX;
_caretY += shiftY;
for(int line = 0; line < _textLineMetrics.length; line++) {
var textLineMetrics = _textLineMetrics[line];
if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint
textLineMetrics._x += shiftX;
textLineMetrics._y += shiftY;
}
}
}
//-------------------------------------------------------------------------------------------------
_refreshCache() {
if ((_refreshPending & 2) == 0) {
return;
} else {
_refreshPending &= 255 - 2;
}
var pixelRatio = Stage.autoHiDpi ? _devicePixelRatio : 1.0;
var width = max(1, _width).ceil();
var height = max(1, _height).ceil();
if (_renderTexture == null) {
_renderTexture = new RenderTexture(width, height, true, Color.Transparent, pixelRatio);
} else {
_renderTexture.resize(width, height);
}
var matrix = _renderTexture.quad.drawMatrix;
var context = _renderTexture.canvas.context2D;
context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);
context.clearRect(0, 0, _width, _height);
_renderText(context);
_renderTexture.update();
}
//-------------------------------------------------------------------------------------------------
_renderText(CanvasRenderingContext2D context) {
var textFormat = _defaultTextFormat;
var lineWidth = (textFormat.bold ? textFormat.size / 10 : textFormat.size / 20).ceil();
context.save();
context.beginPath();
context.rect(0, 0, _width, _height);
context.clip();
if (_background) {
context.fillStyle = _color2rgb(_backgroundColor);
context.fillRect(0, 0, _width, _height);
}
context.font = textFormat._cssFontStyle;
context.textAlign = "start";
context.textBaseline = "alphabetic";
context.fillStyle = context.strokeStyle = _color2rgb(textFormat.color);
context.lineCap = context.lineJoin = "round";
context.lineWidth = lineWidth;
for(int i = 0; i < _textLineMetrics.length; i++) {
var lm = _textLineMetrics[i];
context.fillText(lm._text, lm.x, lm.y);
if(textFormat.underline) {
num underlineY = (lm.y + lineWidth).round();
if (lineWidth % 2 != 0) underlineY += 0.5;
context.beginPath();
context.moveTo(lm.x, underlineY);
context.lineTo(lm.x + lm.width, underlineY);
context.stroke();
}
}
if (_border) {
context.strokeStyle = _color2rgb(_borderColor);
context.lineWidth = 1;
context.strokeRect(0, 0, _width, _height);
}
context.restore();
}
//-------------------------------------------------------------------------------------------------
String _passwordEncoder(String text) {
if (text is! String) return text;
if (_displayAsPassword == false) return text;
var newText = "";
for(int i = 0; i < text.length; i++) {
newText = "$newText$_passwordChar";
}
return newText;
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
_onKeyDown(KeyboardEvent keyboardEvent) {
if (_type == TextFieldType.INPUT) {
_refreshTextLineMetrics();
var text = _text;
var textLength = text.length;
var textLineMetrics = _textLineMetrics;
var caretIndex = _caretIndex;
var caretLine = _caretLine;
var caretIndexNew = -1;
switch(keyboardEvent.keyCode) {
case html.KeyCode.BACKSPACE:
if (caretIndex > 0) {
_text = text.substring(0, caretIndex - 1) + text.substring(caretIndex);
caretIndexNew = caretIndex - 1;
}
break;
case html.KeyCode.END:
var tlm = textLineMetrics[caretLine];
caretIndexNew = tlm._textIndex + tlm._text.length;
break;
case html.KeyCode.HOME:
var tlm = textLineMetrics[caretLine];
caretIndexNew = tlm._textIndex;
break;
case html.KeyCode.LEFT:
if (caretIndex > 0) {
caretIndexNew = caretIndex - 1;
}
break;
case html.KeyCode.UP:
if (caretLine > 0 && caretLine < textLineMetrics.length) {
var tlmFrom = textLineMetrics[caretLine ];
var tlmTo = textLineMetrics[caretLine - 1];
var lineIndex = min(caretIndex - tlmFrom._textIndex, tlmTo._text.length);
caretIndexNew = tlmTo._textIndex + lineIndex;
} else {
caretIndexNew = 0;
}
break;
case html.KeyCode.RIGHT:
if (caretIndex < textLength) {
caretIndexNew = caretIndex + 1;
}
break;
case html.KeyCode.DOWN:
if (caretLine >= 0 && caretLine < textLineMetrics.length - 1) {
var tlmFrom = textLineMetrics[caretLine ];
var tlmTo = textLineMetrics[caretLine + 1];
var lineIndex = min(caretIndex - tlmFrom._textIndex, tlmTo._text.length);
caretIndexNew = tlmTo._textIndex + lineIndex;
} else {
caretIndexNew = textLength;
}
break;
case html.KeyCode.DELETE:
if (caretIndex < textLength) {
_text = text.substring(0, caretIndex) + text.substring(caretIndex + 1);
caretIndexNew = caretIndex;
}
break;
}
if (caretIndexNew != -1) {
_caretIndex = caretIndexNew;
_caretTime = 0.0;
_refreshPending |= 3;
}
}
}
//-------------------------------------------------------------------------------------------------
_onTextInput(TextEvent textEvent) {
if (_type == TextFieldType.INPUT) {
var textLength = _text.length;
var caretIndex = _caretIndex;
var newText = textEvent.text;
if (newText == '\r') newText = '\n';
if (newText == '\n' && _multiline == false) newText = '';
if (newText == '') return;
if (_maxChars != 0 && textLength >= _maxChars) return;
_text = _text.substring(0, caretIndex) + newText + _text.substring(caretIndex);
_caretIndex = _caretIndex + newText.length;
_caretTime = 0.0;
_refreshPending |= 3;
}
}
//-------------------------------------------------------------------------------------------------
_onMouseDown(MouseEvent mouseEvent) {
var mouseX = mouseEvent.localX.toDouble();
var mouseY = mouseEvent.localY.toDouble();
var canvasContext = _dummyCanvasContext;
canvasContext.setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
for(int line = 0; line < _textLineMetrics.length; line++) {
var textLineMetrics = _textLineMetrics[line];
if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint
var text = textLineMetrics._text;
var lineX = textLineMetrics.x;
var lineY1 = textLineMetrics.y - textLineMetrics.ascent;
var lineY2 = textLineMetrics.y + textLineMetrics.descent;
if (lineY1 <= mouseY && lineY2 >= mouseY) {
var bestDistance = double.INFINITY;
var bestIndex = 0;
for(var c = 0; c <= text.length; c++) {
var width = canvasContext.measureText(text.substring(0, c)).width.toDouble();
var distance = (lineX + width - mouseX).abs();
if (distance < bestDistance) {
bestDistance = distance;
bestIndex = c;
}
}
_caretIndex = textLineMetrics._textIndex + bestIndex;
_caretTime = 0.0;
_refreshPending |= 3;
}
}
}
}
Extends
EventDispatcher > DisplayObject > InteractiveObject > TextField
Constructors
new TextField([String text, TextFormat textFormat]) #
Creates a new Object instance.
Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.
docs inherited from Object
TextField([String text, TextFormat textFormat]) {
this.text = (text != null) ? text : "";
this.defaultTextFormat = (textFormat != null) ? textFormat : new TextFormat("Arial", 12, 0x000000);
this.onKeyDown.listen(_onKeyDown);
this.onTextInput.listen(_onTextInput);
this.onMouseDown.listen(_onMouseDown);
}
Properties
num alpha #
inherited from DisplayObject
num get alpha => _alpha;
set alpha(num value) {
if (value is num) {
if (value < 0.0) value = 0.0;
if (value > 1.0) value = 1.0;
_alpha = value;
}
}
String autoSize #
String get autoSize => _autoSize;
void set autoSize(String value) {
_autoSize = value;
_refreshPending |= 3;
}
bool background #
bool get background => _background;
void set background(bool value) {
_background = value;
_refreshPending |= 2;
}
int backgroundColor #
int get backgroundColor => _backgroundColor;
void set backgroundColor(int value) {
_backgroundColor = value;
_refreshPending |= 2;
}
bool border #
bool get border => _border;
void set border(bool value) {
_border = value;
_refreshPending |= 2;
}
int borderColor #
int get borderColor => _borderColor;
void set borderColor(int value) {
_borderColor = value;
_refreshPending |= 2;
}
bool cacheAsBitmap #
bool get cacheAsBitmap => _cacheAsBitmap;
void set cacheAsBitmap(bool value) {
if (value) _refreshPending |= 2;
_cacheAsBitmap = value;
}
String compositeOperation #
inherited from DisplayObject
String get compositeOperation => _compositeOperation;
set compositeOperation(String value) {
_compositeOperation = value;
}
TextFormat defaultTextFormat #
TextFormat get defaultTextFormat => _defaultTextFormat;
void set defaultTextFormat(TextFormat value) {
_defaultTextFormat = value.clone();
_refreshPending |= 3;
}
bool displayAsPassword #
bool get displayAsPassword => _displayAsPassword;
void set displayAsPassword(bool value) {
_displayAsPassword = value;
_refreshPending |= 3;
}
List<BitmapFilter> filters #
inherited from DisplayObject
List<BitmapFilter> get filters {
if (_filters == null) _filters = new List<BitmapFilter>();
return _filters;
}
set filters(List<BitmapFilter> value) {
_filters = value;
}
num height #
num get height {
_refreshTextLineMetrics();
return _height;
}
void set height(num value) {
_height = value.toDouble();
_refreshPending |= 3;
}
Mask mask #
inherited from DisplayObject
Mask get mask => _mask;
set mask(Mask value) {
_mask = value;
}
final Point mousePosition #
inherited from DisplayObject
Point get mousePosition {
var stage = this.stage;
return (stage != null) ? this.globalToLocal(stage._mousePosition) : null;
}
final num mouseX #
inherited from DisplayObject
num get mouseX {
var mp = this.mousePosition;
return (mp != null) ? mp.x : 0.0;
}
final num mouseY #
inherited from DisplayObject
num get mouseY {
var mp = this.mousePosition;
return (mp != null) ? mp.y : 0.0;
}
bool multiline #
bool get multiline => _multiline;
void set multiline(bool value) {
_multiline = value;
_refreshPending |= 3;
}
String name #
inherited from DisplayObject
String get name => _name;
set name(String value) {
_name = value;
}
final int numLines #
int get numLines {
_refreshTextLineMetrics();
return _textLineMetrics.length;
}
bool off #
inherited from DisplayObject
bool get off => _off;
set off(bool value) {
if (value is bool) _off = value;
}
final EventStream<Event> onAdded #
inherited from DisplayObject
EventStream<Event> get onAdded => DisplayObject.addedEvent.forTarget(this);
final EventStream<Event> onAddedToStage #
inherited from DisplayObject
EventStream<Event> get onAddedToStage => DisplayObject.addedToStageEvent.forTarget(this);
final EventStream<EnterFrameEvent> onEnterFrame #
inherited from DisplayObject
EventStream<EnterFrameEvent> get onEnterFrame => DisplayObject.enterFrameEvent.forTarget(this);
final EventStream<ExitFrameEvent> onExitFrame #
inherited from DisplayObject
EventStream<ExitFrameEvent> get onExitFrame => DisplayObject.exitFrameEvent.forTarget(this);
final EventStream<KeyboardEvent> onKeyDown #
inherited from InteractiveObject
EventStream<KeyboardEvent> get onKeyDown => InteractiveObject.keyDownEvent.forTarget(this);
final EventStream<KeyboardEvent> onKeyUp #
inherited from InteractiveObject
EventStream<KeyboardEvent> get onKeyUp => InteractiveObject.keyUpEvent.forTarget(this);
final EventStream<MouseEvent> onMouseClick #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseClick => InteractiveObject.mouseClickEvent.forTarget(this);
final EventStream<MouseEvent> onMouseContextMenu #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseContextMenu => InteractiveObject.mouseContextMenu.forTarget(this);
final EventStream<MouseEvent> onMouseDoubleClick #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseDoubleClick => InteractiveObject.mouseDoubleClickEvent.forTarget(this);
final EventStream<MouseEvent> onMouseDown #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseDown => InteractiveObject.mouseDownEvent.forTarget(this);
final EventStream<MouseEvent> onMouseMiddleClick #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMiddleClick => InteractiveObject.mouseMiddleClickEvent.forTarget(this);
final EventStream<MouseEvent> onMouseMiddleDown #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMiddleDown => InteractiveObject.mouseMiddleDownEvent.forTarget(this);
final EventStream<MouseEvent> onMouseMiddleUp #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMiddleUp => InteractiveObject.mouseMiddleUpEvent.forTarget(this);
final EventStream<MouseEvent> onMouseMove #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMove => InteractiveObject.mouseMoveEvent.forTarget(this);
final EventStream<MouseEvent> onMouseOut #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseOut => InteractiveObject.mouseOutEvent.forTarget(this);
final EventStream<MouseEvent> onMouseOver #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseOver => InteractiveObject.mouseOverEvent.forTarget(this);
final EventStream<MouseEvent> onMouseRightClick #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRightClick => InteractiveObject.mouseRightClickEvent.forTarget(this);
final EventStream<MouseEvent> onMouseRightDown #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRightDown => InteractiveObject.mouseRightDownEvent.forTarget(this);
final EventStream<MouseEvent> onMouseRightUp #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRightUp => InteractiveObject.mouseRightUpEvent.forTarget(this);
final EventStream<MouseEvent> onMouseRollOut #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRollOut => InteractiveObject.mouseRollOutEvent.forTarget(this);
final EventStream<MouseEvent> onMouseRollOver #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRollOver => InteractiveObject.mouseRollOverEvent.forTarget(this);
final EventStream<MouseEvent> onMouseUp #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseUp => InteractiveObject.mouseUpEvent.forTarget(this);
final EventStream<MouseEvent> onMouseWheel #
inherited from InteractiveObject
EventStream<MouseEvent> get onMouseWheel => InteractiveObject.mouseWheelEvent.forTarget(this);
final EventStream<Event> onRemoved #
inherited from DisplayObject
EventStream<Event> get onRemoved => DisplayObject.removedEvent.forTarget(this);
final EventStream<Event> onRemovedFromStage #
inherited from DisplayObject
EventStream<Event> get onRemovedFromStage => DisplayObject.removedFromStageEvent.forTarget(this);
final EventStream<RenderEvent> onRender #
inherited from DisplayObject
EventStream<RenderEvent> get onRender => DisplayObject.renderEvent.forTarget(this);
final EventStream<TextEvent> onTextInput #
inherited from InteractiveObject
EventStream<TextEvent> get onTextInput => InteractiveObject.textInputEvent.forTarget(this);
final EventStream<TouchEvent> onTouchBegin #
inherited from InteractiveObject
EventStream<TouchEvent> get onTouchBegin => InteractiveObject.touchBeginEvent.forTarget(this);
final EventStream<TouchEvent> onTouchCancel #
inherited from InteractiveObject
EventStream<TouchEvent> get onTouchCancel => InteractiveObject.touchCancelEvent.forTarget(this);
final EventStream<TouchEvent> onTouchEnd #
inherited from InteractiveObject
EventStream<TouchEvent> get onTouchEnd => InteractiveObject.touchEndEvent.forTarget(this);
final EventStream<TouchEvent> onTouchMove #
inherited from InteractiveObject
EventStream<TouchEvent> get onTouchMove => InteractiveObject.touchMoveEvent.forTarget(this);
final EventStream<TouchEvent> onTouchOut #
inherited from InteractiveObject
EventStream<TouchEvent> get onTouchOut => InteractiveObject.touchOutEvent.forTarget(this);
final EventStream<TouchEvent> onTouchOver #
inherited from InteractiveObject
EventStream<TouchEvent> get onTouchOver => InteractiveObject.touchOverEvent.forTarget(this);
final DisplayObjectContainer parent #
inherited from DisplayObject
DisplayObjectContainer get parent => _parent;
String passwordChar #
String get passwordChar => _passwordChar;
void set passwordChar(String value) {
_passwordChar = value[0];
_refreshPending |= 3;
}
num pivotX #
inherited from DisplayObject
num get pivotX => _pivotX;
set pivotX(num value) {
if (value is num) _pivotX = value;
_transformationMatrixRefresh = true;
}
num pivotY #
inherited from DisplayObject
num get pivotY => _pivotY;
set pivotY(num value) {
if (value is num) _pivotY = value;
_transformationMatrixRefresh = true;
}
final RenderTexture renderTexture #
RenderTexture get renderTexture => _renderTexture;
final DisplayObject root #
inherited from DisplayObject
DisplayObject get root {
DisplayObject currentObject = this;
while (currentObject._parent != null)
currentObject = currentObject._parent;
return currentObject;
}
num rotation #
inherited from DisplayObject
num get rotation => _rotation;
set rotation(num value) {
if (value is num) _rotation = value;
_transformationMatrixRefresh = true;
}
num scaleX #
inherited from DisplayObject
num get scaleX => _scaleX;
set scaleX(num value) {
if (value is num) _scaleX = value;
_transformationMatrixRefresh = true;
}
num scaleY #
inherited from DisplayObject
num get scaleY => _scaleY;
set scaleY(num value) {
if (value is num) _scaleY = value;
_transformationMatrixRefresh = true;
}
Shadow shadow #
inherited from DisplayObject
Shadow get shadow => _shadow;
set shadow(Shadow value) {
_shadow = value;
}
num skewX #
inherited from DisplayObject
num get skewX => _skewX;
set skewX(num value) {
if (value is num) _skewX = value;
_transformationMatrixRefresh = true;
}
num skewY #
inherited from DisplayObject
num get skewY => _skewY;
set skewY(num value) {
if (value is num) _skewY = value;
_transformationMatrixRefresh = true;
}
final Stage stage #
inherited from DisplayObject
Stage get stage {
DisplayObject root = this.root;
return (root is Stage) ? root : null;
}
String text #
String get text => _text;
void set text(String value) {
_text = value.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
_caretIndex = _text.length;
_refreshPending |= 3;
}
int textColor #
int get textColor => _defaultTextFormat.color;
void set textColor(int value) {
_defaultTextFormat.color = value;
_refreshPending |= 2;
}
final Matrix transformationMatrix #
Matrix get transformationMatrix {
_refreshTextLineMetrics();
return super.transformationMatrix;
}
String type #
String get type => _type;
void set type(String value) {
_type = value;
_refreshPending |= 3;
}
var userData #
inherited from DisplayObject
Gets or sets user-defined data associated with the display object.
dynamic userData = null
bool visible #
inherited from DisplayObject
bool get visible => _visible;
set visible(bool value) {
if (value is bool) _visible = value;
}
num width #
num get width {
_refreshTextLineMetrics();
return _width;
}
void set width(num value) {
_width = value.toDouble();
_refreshPending |= 3;
}
bool wordWrap #
bool get wordWrap => _wordWrap;
void set wordWrap(bool value) {
_wordWrap = value;
_refreshPending |= 3;
}
dynamic set x(num value) #
inherited from DisplayObject
set x(num value) {
if (value is num) _x = value;
_transformationMatrixRefresh = true;
}
num y #
inherited from DisplayObject
num get y => _y;
set y(num value) {
if (value is num) _y = value;
_transformationMatrixRefresh = true;
}
Methods
StreamSubscription<Event> addEventListener(String eventType, EventListener eventListener, {bool useCapture: false, int priority: 0}) #
inherited from EventDispatcher
StreamSubscription<Event> addEventListener(String eventType, EventListener eventListener, {
bool useCapture: false, int priority: 0 }) {
return this.on(eventType)._subscribe(eventListener, useCapture, priority);
}
void addTo(DisplayObjectContainer parent) #
inherited from DisplayObject
void addTo(DisplayObjectContainer parent) {
parent.addChild(this);
}
void applyCache(int x, int y, int width, int height, {bool debugBorder: false}) #
inherited from DisplayObject
void applyCache(int x, int y, int width, int height, {bool debugBorder: false}) {
var pixelRatio = Stage.autoHiDpi ? _devicePixelRatio : 1.0;
if (_cacheTexture == null) {
_cacheTexture = new RenderTexture(width, height, true, Color.Transparent, pixelRatio);
} else {
_cacheTexture.resize(width, height);
}
_cacheRectangle = new Rectangle(x, y, width, height);
_cacheDebugBorder = debugBorder;
refreshCache();
}
void dispatchEvent(Event event) #
inherited from DisplayObject
void dispatchEvent(Event event) {
List<DisplayObject> ancestors = null;
if (event.captures || event.bubbles) {
for(DisplayObject ancestor = parent; ancestor != null; ancestor = ancestor.parent) {
if(ancestor._hasPropagationEventListeners(event)) {
if (ancestors == null) ancestors = [];
ancestors.add(ancestor);
}
}
}
if (ancestors != null && event.captures) {
for(int i = ancestors.length - 1 ; i >= 0; i--) {
ancestors[i]._dispatchEventInternal(event, this, EventPhase.CAPTURING_PHASE);
if (event.stopsPropagation) return;
}
}
_dispatchEventInternal(event, this, EventPhase.AT_TARGET);
if (event.stopsPropagation) return;
if (ancestors != null && event.bubbles) {
for(int i = 0; i < ancestors.length; i++) {
ancestors[i]._dispatchEventInternal(event, this, EventPhase.BUBBLING_PHASE);
if (event.stopsPropagation) return;
}
}
}
Rectangle getBounds(DisplayObject targetSpace) #
inherited from DisplayObject
Rectangle getBounds(DisplayObject targetSpace) {
Rectangle returnRectangle = new Rectangle.zero();
Matrix matrix = (targetSpace == null) ? transformationMatrix : transformationMatrixTo(targetSpace);
return (matrix != null) ? getBoundsTransformed(matrix, returnRectangle) : returnRectangle;
}
Rectangle getBoundsTransformed(Matrix matrix, [Rectangle returnRectangle]) #
Rectangle getBoundsTransformed(Matrix matrix, [Rectangle returnRectangle]) {
return _getBoundsTransformedHelper(matrix, _width, _height, returnRectangle);
}
int getLineLength(int lineIndex) #
int getLineLength(int lineIndex) {
return getLineText(lineIndex).length;
}
TextLineMetrics getLineMetrics(int lineIndex) #
TextLineMetrics getLineMetrics(int lineIndex) {
_refreshTextLineMetrics();
return _textLineMetrics[lineIndex];
}
String getLineText(int lineIndex) #
String getLineText(int lineIndex) {
return getLineMetrics(lineIndex)._text;
}
Point globalToLocal(Point globalPoint) #
inherited from DisplayObject
Point globalToLocal(Point globalPoint) {
_tmpMatrix.identity();
for(var current = this; current != null; current = current._parent) {
_tmpMatrix.concat(current.transformationMatrix);
}
_tmpMatrix.invert();
return _tmpMatrix.transformPoint(globalPoint);
}
bool hasEventListener(String eventType) #
inherited from EventDispatcher
bool hasEventListener(String eventType) {
var eventStreams = _eventStreams;
if (eventStreams == null) return false;
var eventStream = eventStreams[eventType];
if (eventStream == null) return false;
return eventStream.hasSubscriptions;
}
DisplayObject hitTestInput(num localX, num localY) #
DisplayObject hitTestInput(num localX, num localY) {
if (localX >= 0 && localY >= 0 && localX < _width && localY < _height)
return this;
return null;
}
bool hitTestObject(DisplayObject other) #
inherited from DisplayObject
bool hitTestObject(DisplayObject other) {
var stage1 = this.stage;
var stage2 = other.stage;
if (stage1 == null || stage2 == null || stage1 != stage2) return false;
var rect1 = this.getBounds(stage1);
var rect2 = other.getBounds(stage2);
return rect1.intersects(rect2);
}
bool hitTestPoint(num x, num y, [bool shapeFlag = false]) #
inherited from DisplayObject
bool hitTestPoint(num x, num y, [bool shapeFlag = false]) {
var stage = this.stage;
if (stage == null) return false;
if (shapeFlag) {
var matrix = stage.transformationMatrixTo(this);
if (matrix == null) return false;
var stagePoint = new Point(x, y);
var localPoint = matrix.transformPoint(stagePoint);
return this.hitTestInput(localPoint.x, localPoint.y) != null;
} else {
var rect = this.getBounds(stage);
return rect.contains(x, y);
}
}
Point localToGlobal(Point localPoint) #
inherited from DisplayObject
Point localToGlobal(Point localPoint) {
_tmpMatrix.identity();
for(var current = this; current != null; current = current._parent) {
_tmpMatrix.concat(current.transformationMatrix);
}
return _tmpMatrix.transformPoint(localPoint);
}
EventStream<Event> on(String eventType) #
inherited from EventDispatcher
EventStream<Event> on(String eventType) {
var eventStreams = _eventStreams;
if (eventStreams == null) {
eventStreams = new Map<String, EventStream>();
_eventStreams = eventStreams;
}
var eventStream = eventStreams[eventType];
if (eventStream == null) {
eventStream = new EventStream._internal(this, eventType);
eventStreams[eventType] = eventStream;
}
return eventStream;
}
void refreshCache() #
inherited from DisplayObject
void refreshCache() {
if (_cacheTexture == null) return;
var x = _cacheRectangle.x;
var y = _cacheRectangle.y;
var width = _cacheRectangle.width;
var height = _cacheRectangle.height;
var canvas = _cacheTexture.canvas;
var matrix = _cacheTexture.quad.drawMatrix..translate(-x, -y);
var renderContext = new RenderContextCanvas(canvas, Color.Transparent);
var renderState = new RenderState(renderContext, matrix);
renderContext.clear();
render(renderState);
if (_filters != null) {
var cacheBitmapData = new BitmapData.fromRenderTextureQuad(_cacheTexture.quad);
var bounds = this.getBoundsTransformed(_identityMatrix)..offset(-x, -y);
for(var filter in _filters) {
var filterOverlap = filter.overlap;
var filterBounds = bounds.clone();
filterBounds.offset(filterOverlap.x, filterOverlap.y);
filterBounds.inflate(filterOverlap.width, filterOverlap.height);
filter.apply(cacheBitmapData, filterBounds.align());
}
}
if (_cacheDebugBorder) {
canvas.context2D
..setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)
..lineWidth = 1
..lineJoin = "miter"
..lineCap = "butt"
..strokeStyle = "#FF00FF"
..strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);
}
_cacheTexture.update();
}
void removeCache() #
inherited from DisplayObject
void removeCache() {
if (_cacheTexture != null) {
_cacheTexture.dispose();
_cacheTexture = null;
}
}
void removeEventListener(String eventType, EventListener eventListener, {bool useCapture: false}) #
inherited from EventDispatcher
void removeEventListener(String eventType, EventListener eventListener, {
bool useCapture: false }) {
this.on(eventType)._unsubscribe(eventListener, useCapture);
}
void removeEventListeners(String eventType) #
inherited from EventDispatcher
void removeEventListeners(String eventType) {
this.on(eventType).cancelSubscriptions();
}
void removeFromParent() #
inherited from DisplayObject
void removeFromParent() {
if (_parent != null)
_parent.removeChild(this);
}
void render(RenderState renderState) #
void render(RenderState renderState) {
_refreshTextLineMetrics();
var renderContext = renderState.renderContext;
if (_cacheAsBitmap || renderContext is! RenderContextCanvas) {
_refreshCache();
renderState.renderQuad(_renderTexture.quad);
} else {
var renderContextCanvas = renderState.renderContext as RenderContextCanvas;
var context = renderContextCanvas.rawContext;
var matrix = renderState.globalMatrix;
context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);
context.globalAlpha = renderState.globalAlpha;
_renderText(renderContextCanvas.rawContext);
}
// draw cursor for INPUT text fields
_caretTime += renderState.deltaTime;
if (_type == TextFieldType.INPUT) {
var stage = this.stage;
if (stage != null && stage.focus == this && _caretTime.remainder(0.8) < 0.4) {
var x1 = _caretX;
var y1 = _caretY;
var x3 = _caretX + _caretWidth;
var y3 = _caretY + _caretHeight;
var color = _defaultTextFormat.color;
renderState.renderTriangle(x1, y1, x3, y1, x3, y3, color);
renderState.renderTriangle(x1, y1, x3, y3, x1, y3, color);
}
}
}
void setTransform(num x, num y, [num scaleX, num scaleY, num rotation, num skewX, num skewY, num pivotX, num pivotY]) #
inherited from DisplayObject
void setTransform(num x, num y, [num scaleX, num scaleY, num rotation, num skewX, num skewY, num pivotX, num pivotY]) {
if (x is num) _x = x;
if (y is num) _y = y;
if (scaleX is num) _scaleX = scaleX;
if (scaleY is num) _scaleY = scaleY;
if (rotation is num) _rotation = rotation;
if (skewX is num) _skewX = skewX;
if (skewY is num) _skewY = skewY;
if (pivotX is num) _pivotX = pivotX;
if (pivotY is num) _pivotY = pivotY;
_transformationMatrixRefresh = true;
}
Matrix transformationMatrixTo(DisplayObject targetSpace) #
inherited from DisplayObject
Matrix transformationMatrixTo(DisplayObject targetSpace) {
if (targetSpace == _parent) {
return this.transformationMatrix.clone();
}
if (targetSpace != null && targetSpace._parent == this) {
return targetSpace.transformationMatrix.cloneInvert();
}
//------------------------------------------------
Matrix resultMatrix = new Matrix.fromIdentity();
DisplayObject resultObject = this;
while(resultObject != targetSpace && resultObject._parent != null) {
resultMatrix.concat(resultObject.transformationMatrix);
resultObject = resultObject._parent;
}
if (targetSpace == null && resultObject != null) {
resultMatrix.concat(resultObject.transformationMatrix);
resultObject = null;
}
if (resultObject == targetSpace)
return resultMatrix;
//------------------------------------------------
Matrix targetMatrix = new Matrix.fromIdentity();
DisplayObject targetObject = targetSpace;
while(targetObject != this && targetObject._parent != null) {
targetMatrix.concat(targetObject.transformationMatrix);
targetObject = targetObject._parent;
}
targetMatrix.invert();
if (targetObject == this) {
return targetMatrix;
}
if (targetObject != resultObject) {
return null;
}
resultMatrix.concat(targetMatrix);
return resultMatrix;
}