I'm wondering how best to blink a cell's background in a Spark Datagrid when
data changes, i.e like in a real-time stock chart. I've seen a couple of
methods, both seem specific to MX not Spark:
a)
From:
https://code.google.com/p/jpragma-utils/source/browse/trunk/JPragmaFlexUtils/src/com/jpragma/flexutils/renderers/BlinkWhenChangedRenderer.as?r=18
package com.jpragma.flexutils.renderers {
import flash.events.Event;
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridItemRenderer;
import mx.controls.dataGridClasses.DataGridListData;
public class BlinkWhenChangedRenderer extends DataGridItemRenderer {
private var lastText:String = null;
private var lastUID:String = null;
private var frameCount:int = -1;
override public function validateNow():void {
var needBlink:Boolean = false;
var valueIncreased:Boolean = false;
super.validateNow();
if (!listData) {
background = false;
return;
var dgListData:DataGridListData = listData as
DataGridListData;
var dataGrid:DataGrid = dgListData.owner as
DataGrid;
if (dgListData.uid == lastUID) {
if (lastText != dgListData.label) {
needBlink = true;
var oldNumValue:Number = new
Number(lastText);
var newNumValue:Number = new
Number(dgListData.label);
if (oldNumValue < newNumValue) {
valueIncreased = true;
lastUID = dgListData.uid;
lastText = dgListData.label;
if (needBlink) {
background = true;
backgroundColor = (valueIncreased) ?
0x00FF00 : 0xFF0000;
frameCount = 15;
addEventListener("enterFrame",
enterFrameHandler);
private function enterFrameHandler(event:Event):void {
frameCount--;
if (frameCount < 0) {
background = false;
removeEventListener("enterFrame",
enterFrameHandler);
} else {
if (backgroundColor >= 0xFF0000) {
// red
backgroundColor = (15 - frameCount)
* 0x001111 + 0xFF0000;
} else {
// green
backgroundColor = (15 - frameCount)
* 0x110011 + 0x00FF00;
b)
In the past I've used animation, something like this:
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:parsley="http://www.spicefactory.org/parsley"
paddingRight="3"
verticalAlign="middle"
<fx:Declarations>
<parsley:Configure/>
<s:AnimateColor id="ani"
colorPropertyName="color"
colorFrom="{0xff0000}"
colorTo="{0x000000}"
duration="2000"
/>
</fx:Declarations>
<fx:Script>
</fx:Script>
<s:Label id="txt" width="100%" textAlign="right"/>
</s:VGroup>
So, what's the recommended, least resource intensive, way of doing this in
Spark?
data changes, i.e like in a real-time stock chart. I've seen a couple of
methods, both seem specific to MX not Spark:
a)
From:
https://code.google.com/p/jpragma-utils/source/browse/trunk/JPragmaFlexUtils/src/com/jpragma/flexutils/renderers/BlinkWhenChangedRenderer.as?r=18
package com.jpragma.flexutils.renderers {
import flash.events.Event;
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridItemRenderer;
import mx.controls.dataGridClasses.DataGridListData;
public class BlinkWhenChangedRenderer extends DataGridItemRenderer {
private var lastText:String = null;
private var lastUID:String = null;
private var frameCount:int = -1;
override public function validateNow():void {
var needBlink:Boolean = false;
var valueIncreased:Boolean = false;
super.validateNow();
if (!listData) {
background = false;
return;
var dgListData:DataGridListData = listData as
DataGridListData;
var dataGrid:DataGrid = dgListData.owner as
DataGrid;
if (dgListData.uid == lastUID) {
if (lastText != dgListData.label) {
needBlink = true;
var oldNumValue:Number = new
Number(lastText);
var newNumValue:Number = new
Number(dgListData.label);
if (oldNumValue < newNumValue) {
valueIncreased = true;
lastUID = dgListData.uid;
lastText = dgListData.label;
if (needBlink) {
background = true;
backgroundColor = (valueIncreased) ?
0x00FF00 : 0xFF0000;
frameCount = 15;
addEventListener("enterFrame",
enterFrameHandler);
private function enterFrameHandler(event:Event):void {
frameCount--;
if (frameCount < 0) {
background = false;
removeEventListener("enterFrame",
enterFrameHandler);
} else {
if (backgroundColor >= 0xFF0000) {
// red
backgroundColor = (15 - frameCount)
* 0x001111 + 0xFF0000;
} else {
// green
backgroundColor = (15 - frameCount)
* 0x110011 + 0x00FF00;
b)
In the past I've used animation, something like this:
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:parsley="http://www.spicefactory.org/parsley"
paddingRight="3"
verticalAlign="middle"
<fx:Declarations>
<parsley:Configure/>
<s:AnimateColor id="ani"
colorPropertyName="color"
colorFrom="{0xff0000}"
colorTo="{0x000000}"
duration="2000"
/>
</fx:Declarations>
<fx:Script>
</fx:Script>
<s:Label id="txt" width="100%" textAlign="right"/>
</s:VGroup>
So, what's the recommended, least resource intensive, way of doing this in
Spark?