How to draw rectangle in flex 4.5.1? - apache-flex

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="640" minHeight="480">
<s:layout>
<s:BasicLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import flash.display.Shape;
import flash.display.Sprite;
import mx.core.UIComponent;
import spark.core.SpriteVisualElement;
private var rectangle:Sprite = new Sprite();
private var insterter:UIComponent = new UIComponent();
private var theme:SpriteVisualElement = new SpriteVisualElement();
private function main():void
{
rectangle.graphics.lineStyle(1,0x0000FF,1.0);
rectangle.graphics.drawRect(0,0,200,50);
theme.addChild(rectangle);
this.addElement(theme); //tried canvas.addElement
const WIDTH:int = 20;
const HEIGHT:int = 20;
/*var grid:Array = new Array();
for(var y:int = 0; y < HEIGHT; y++) {
var row:Array = new Array();
for (var x:int = 0; x < WIDTH; x++) {
row.push(/*random object*//*);
}
/ grid.push(row);
}*/
}
]]>
</fx:Script>
<!--<spark:Canvas id="canvas" x="34" y="10" width="90%" height="90%" textAlign="center">
</mx:Canvas>-->
</s:Application>
Basically this is not working. I used this question to improve - still nothing.
Why doesnt this Flex App draw a simple rectangle?

Why don't you just use UIComponent.graphics drawing abilities, instead of creating three different objects ?
var uic:UIComponent = new UIComponent();
this.addElement(uic);
uic.width = uic.height = 50;
uic.graphics.lineStyle(1,0x000000);
uic.graphics.drawRect(0,0,50,50);

Related

Drawing styled text on BitmapData

I have a function that draws a string over BitmapData. The problem is, the TextFormat specified does not affect the text written on the image. The size, font I specify in the text format is not used at all.
function drawString(target:BitmapData,text:String,color:uint,x:Number,y:Number):void {
var channelName:TextField = new TextField();
channelName.textColor=color;
channelName.antiAliasType = AntiAliasType.ADVANCED;
channelName.alpha=1.0;
var txtFormat:TextFormat = new TextFormat("Verdana",25,color,true);
txtFormat.size=Number(25);
txtFormat.font="Verdana";
txtFormat.bold=true;
channelName.setTextFormat(txtFormat);
channelName.text = text;
channelName.defaultTextFormat = txtFormat;
channelName.cacheAsBitmap = true;
channelName.width=400;
var mat:Matrix = new Matrix();
mat.translate(x,y);
target.draw(channelName,mat);
}
How can I customize the text font and size drawn over the BitmapData?
Here is my code:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="640" height="400" creationComplete="init(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
[Embed(source='com/drawtext/Image.jpg')]
public var Picture:Class;
protected function init(event:FlexEvent):void
{
var bitmapData:BitmapData = new BitmapData(640, 400, true, 0xFF82DC);
bitmapData.draw(new Picture());
img.source = bitmapData;
drawString(bitmapData, "It is Yours!", 0xff0000, 70, 60);
}
protected function drawString(target:BitmapData,text:String,color:uint,x:Number,y:Number):void
{
var channelName:TextField = new TextField();
channelName.antiAliasType = AntiAliasType.ADVANCED;
var txtFormat:TextFormat = new TextFormat();
txtFormat.size = 35;
txtFormat.font = "Verdana";
txtFormat.bold = true;
channelName.defaultTextFormat = txtFormat;
channelName.width = 400;
channelName.height = 40;
channelName.textColor=color;
channelName.text = text;
var mat:Matrix = new Matrix();
mat.translate(x, y);
target.draw(channelName, mat);
}
]]>
</fx:Script>
<s:Image id="img" width="640" height="400"/>
</s:WindowedApplication>
The result:
Try setting text property before setting text format - and either use setTextFormat(...) or defaultTextFormat = ... not both
And you can also remove these lines too:
//does the same thing as new TextFormat("Verdana",25,color,true)
txtFormat.size=Number(25);
txtFormat.font="Verdana";
txtFormat.bold=true;
//only useful if you add textField to the display list (ie: if you did addChild(channelName)
channelName.cacheAsBitmap = true;

FLEX: After resizing Image, imageRotate doesn't work ordinarily

Please help me ㅠㅠ
I'm making ImageEditor. but I have a question for Image Rotating function.
When I load image and then Rotate it, Rotate function work very well.
But After resizing(width, height) loaded Image, rotate work ridiculously...
Pixed Image's width, height, It rotate only Image's content..
As a result, Quality of image go down...
This is screenshots.
Oh.. I can't post Images.. because reputation limit... :-<
http://blog.naver.com/hago89n/150164439917
Please visit my blog and confirm screenshots..
Can you understand my problem?
Um.. code is here
//resize button click handler
private function btn_resize_clickHandler(event:MouseEvent):void
{
image.width = parseInt(ti_width.text.toString());
image.height = parseInt(ti_height.text.toString());
}
//Rotate button click handler
private function btn_rotateCCW_clickHandler(event:MouseEvent):void
{//Rotate Counter ClockWise
var o_rotateimage:RotateImage = new RotateImage();
o_rotateimage.rotateCCW(image);
}
//Rotate function in RotateImage.as
public function rotateCCW(image:Image):void
{
m = new Matrix();
m.rotate(Math.PI/2);
m.tx = image.height;
var bd:BitmapData = new BitmapData(image.height as int, image.width as int);
bd.draw(image, m);
image.source = new Bitmap(bd);
}
I think you should do a matrix transformation for both operations.
If you just change the size of your Image object, it does not work fine in all situations.
Here is my code for this example.
//Application
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
import com.imageeditor.RotateImage;
[Embed(source="/assets/img/chart.png")]
[Bindable]
public var chartPng:Class;
private var o_rotateimage:RotateImage = new RotateImage();
private function btn_resize_clickHandler(event:MouseEvent):void
{
o_rotateimage.scale(image, int(ti_width.text)/image.width, int(ti_height.text)/image.height);
}
private function btn_rotateCCW_clickHandler(event:MouseEvent):void
{
o_rotateimage.rotateCCW(image);
}
]]>
</fx:Script>
<s:VGroup x="10" y="10">
<s:HGroup>
<s:TextInput id="ti_width" text="300" width="40"/>
<s:TextInput id="ti_height" text="200" width="40"/>
<s:Button label="Resize" click="btn_resize_clickHandler(event)"/>
<s:Button label="Rotate" click="btn_rotateCCW_clickHandler(event)"/>
</s:HGroup>
<s:HGroup width="800" height="600" horizontalAlign="center" verticalAlign="middle">
<s:Image id="image" source="{chartPng}" width="600" height="400"/>
</s:HGroup>
</s:VGroup>
</s:Application>
//RotateImage.as
package com.imageeditor
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Matrix;
import spark.components.Image;
public class RotateImage
{
private var m:Matrix;
public function rotateCCW(image:Image):void
{
var w:int = image.width;
var h:int = image.height;
m = new Matrix();
m.rotate(Math.PI/2);
m.tx = image.height;
var bd:BitmapData = new BitmapData(image.height as int, image.width as int);
bd.draw(image, m);
image.width = h;
image.height = w;
image.source = new Bitmap(bd);
}
public function scale(image:Image, kx:Number, ky:Number):void
{
var w:int = image.width;
var h:int = image.height;
m = new Matrix();
m.scale(kx, ky);
var bd:BitmapData = new BitmapData(w*kx as int, h*ky as int);
bd.draw(image, m);
image.width = w*kx;
image.height = h*ky;
image.source = new Bitmap(bd);
}
}
}

Flex 4 app preloader takes several seconds to show up (loads quickly after that)

I'm somewhere between novice and intermediate levels with Flex and brand new to Flex 4. I've built a magazine app for a client that pulls in dynamic issue information and generates a book using the qs FlexBook component. The problem is that the app seems to take forever to BEGIN loading.
The app progress bar does not display for several seconds. Once it finally shows up, the app loads quickly. The file sizes don't seem overly large to me and the issue remains whether I use RSLs, merge the code or convert it to a module. You can see the effect here: http://whosthatnerd.com/clients/jones/issues/
Here is my MXML file:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
preloader="mx.preloaders.DownloadProgressBar"
skinClass="skins.TransparentAppSkin"
creationComplete="init()"
minWidth="955"
minHeight="600">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Style>
#namespace s "library://ns.adobe.com/flex/spark";
#namespace mx "library://ns.adobe.com/flex/mx";
#namespace qsctrl "qs.controls.*";
qsctrl|FlexBook {
hardbackCovers: false;
paddingTop: 0;
paddingRight: 0;
paddingBottom: 0;
paddingLeft: 0;
paddingSpine: 0;
color: #000000;
textRollOverColor: #000000;
edgeAndCornerSize: 70;
background-color: #000000;
}
mx|HBox {
paddingTop: 0;
paddingBottom: 0;
paddingLeft: 0;
paddingRight: 0;
horizontalGap: 0;
}
mx|Image {
padding: 0;
margin: 0;
}
mx|ProgressBar {
color: #EEEEEE;
}
</fx:Style>
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.containers.HBox;
import mx.controls.Alert;
import mx.controls.Image;
import mx.core.IUIComponent;
import mx.core.UIComponent;
import mx.events.ResizeEvent;
import qs.controls.FlexBook;
private var issueID:String;
private var xmlLoader:URLLoader;
private var xml:XML;
private var swfLoader:Loader;
private var swfClass:Class;
private var book:FlexBook;
public var pageHeight:int = 890;
public var pageWidth:int = 600;
private function init():void {
loadingIndicator.x = appCanvas.width / 2 - loadingIndicator.width / 2;
loadingIndicator.y = appCanvas.height / 2 - loadingIndicator.height / 2;
issueID = parameters.issue_id;
xmlLoader = new URLLoader();
xmlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
xmlLoader.addEventListener(Event.COMPLETE, fillBook);
xmlLoader.load(new URLRequest('/clients/jones/issues/issues/view/'+issueID+'.xml'));
}
public function progressHandler(e:ProgressEvent):void {
loadingIndicator.setProgress(e.bytesLoaded, e.bytesTotal);
loadingIndicator.label = 'Loading Publication... '+Math.round(e.bytesLoaded / e.bytesTotal * 100).toString();
}
private function scaleBook(e:* = null):void {
book.height = Math.ceil((appCanvas.height * 0.9));
book.width = Math.floor((book.height * 1.491285403050109));
book.y = appCanvas.height / 2 - book.height / 2;
book.x = appCanvas.width / 2 - book.width / 2;
}
private function fillBook(e:Event):void {
xml = new XML(e.target.data);
if(xml.use_swf == 1) {
trace('loading: '+xml.swf);
swfLoader = new Loader();
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, useExternalSwf);
swfLoader.load(new URLRequest(xml.swf));
} else {
usePageImages(xml);
}
publicationName.text = xml.publication.name;
var d:Array = String(xml.pub_date).split('-');
issueDate.text = 'Published: '+d[1]+'/'+d[2]+'/'+d[0];
}
public function prepareDisplay():void {
loadingIndicator.visible = false;
bookDetails.x = book.x;
bookDetails.y = book.y;
bookDetails.width = book.width / 2;
bookDetails.height = book.height;
bookDetails.visible = true;
}
public function usePageImages(xml:XML):void {
book = new FlexBook();
book.itemSize = 'halfPage';
scaleBook();
var box:HBox;
var img:Image;
var pages:Array = new Array();
for(var i:int = 0; i < xml.page.length(); i++) {
trace(i);
trace(xml.page[i].image_url);
box = new HBox();
box.horizontalScrollPolicy = 'off';
box.verticalScrollPolicy = 'off';
img = new Image();
img.maintainAspectRatio = true;
img.percentHeight = 100;
img.percentWidth = 100;
img.source = xml.page[i].image_url;
box.addChild(img);
if(i == 0) {
book.cover = box;
} else if(i+1 == xml.page.length()) {
book.backCover = box;
} else {
book.addChild(box);
pages.push(box);
}
}
book.content = pages;
appCanvas.addElement(book);
prepareDisplay();
appCanvas.addEventListener(ResizeEvent.RESIZE, scaleBook);
}
public function useExternalSwf(e:Event):void {
trace('LOADED SWF');
book = new FlexBook();
book.itemSize = 'halfPage';
scaleBook();
var mc:MovieClip = MovieClip(swfLoader.content);
swfClass = mc.constructor;
var dupe:MovieClip;
var comp:UIComponent;
var box:HBox;
var pages:Array = new Array();
for(var i:int = 0; i < mc.totalFrames; i++) {
dupe = MovieClip(new mc.constructor);
dupe.gotoAndStop(i);
comp = new UIComponent();
comp.addChild(dupe);
box = new HBox();
box.addChild(comp);
box.horizontalScrollPolicy = 'off';
box.verticalScrollPolicy = 'off';
dupe.width = comp.width = book.width / 2;
dupe.height = comp.height = book.height;
if(i == 0) {
book.cover = box;
} else if(i+1 == xml.page.length()) {
book.backCover = box;
} else {
book.addChild(box);
pages.push(box);
}
}
book.content = pages;
appCanvas.addElement(book);
prepareDisplay();
appCanvas.addEventListener(ResizeEvent.RESIZE, scaleBook);
}
]]>
</fx:Script>
<s:BorderContainer id="bookDetails" visible="false">
<s:backgroundFill>
<s:LinearGradient>
<s:entries>
<s:GradientEntry color="0x707070" ratio="0.00" alpha="1" />
<s:GradientEntry color="0x505050" ratio="0.75" alpha="1" />
</s:entries>
</s:LinearGradient>
</s:backgroundFill>
<s:borderStroke>
<s:SolidColorStroke joints="miter" color="0x101010" weight="12" />
</s:borderStroke>
<s:layout>
<s:VerticalLayout paddingTop="18" paddingRight="18" paddingBottom="18" paddingLeft="18" />
</s:layout>
<s:Label id="publicationName" fontSize="32" fontWeight="bold" color="0xEEEEEE" alpha="1" />
<mx:Text id="issueDate" fontSize="20" color="0xEEEEEE" alpha="1" />
<mx:Text id="bookInstructions" fontSize="20" color="0xEEEEEE" alpha="1" text="Click or drag the corners to turn the page." />
</s:BorderContainer>
<s:BorderContainer id="appCanvas" left="0" right="0" top="0" bottom="0" skinClass="skins.TransparentAppSkin"></s:BorderContainer>
<mx:ProgressBar id="loadingIndicator" label="Loading Publication..."/>
</s:Application>
I honestly don't know if the issue is my player or my code. Thanks in advance for your help :)

load text input control in Adobe flex dynamically?

<fx:Script>
<![CDATA[
import mx.controls.*;
import mx.controls.TextInput;
import mx.events.ListEvent;
public function init():void
{
for(var i:int=0;i<5;i++)
{
var txtbox:TextInput = new TextInput();
txtbox.id = "text"+i;
myHBox.addChild(txtbox);
}
}
public function getVal():void
{
}
]]>
</fx:Script>
<mx:HBox id="myHBox" width="100%" height="100%">
<mx:Button label="Get Value" click="getVal()"/>
</mx:HBox>
I have implemented this one. I am getting 5 textboxes with empty value, if i entered some value in each textbox then, i want to get specific 3rd textbox value wen some event trigger. so how i can i make. since am new to flex. Pls give me solutions. Thanks in advance.
Why don't you just store the values in its own data structure?
<fx:Script>
<![CDATA[
import mx.controls.*;
import mx.controls.TextInput;
import mx.events.ListEvent;
private var inputs:Vector.<TextInput> = new Vector.<TextInput>();
public function init():void
{
for(var i:uint = 0; i<5; i++)
{
var txtbox:TextInput = new TextInput();
inputs.push(txtbox);
myHBox.addChild(txtbox);
}
}
public function getVal():void
{
var value:String;
for(var i:uint = 0, len:uint = inputs.length; i<len; i++)
{
value += inputs[i].text + ' ';
}
trace(value);
}
]]>
</fx:Script>
<mx:HBox id="myHBox" width="100%" height="100%">
<mx:Button label="Get Value" click="getVal()"/>
</mx:HBox>
Also, if this is a new project, why are you using Flex 3?
Your question is not all too clear, but if I understand correctly,
Try this:
public function init():void
{
for(var i:int=0;i<5;i++)
{
var txtbox:TextInput = new TextInput();
//txtbox.id = "text"+i;
txtbox.name = "text"+i;
txtbox.addEventListener(Event.CHANGE,onChange);
myHBox.addChild(txtbox);
}
}
private function onChange(event:Event):void{
Alert.show(TextInput(event.target).text,TextInput(event.target).name + " Changed");
}
public function getVal():void
{
Alert.show(TextInput(myHBox.getChildByName("text3")).text,"Value");
}
cheers

Flex execution timeout in AdvancedDataGrid

I've a problem, I'm using an AdvancedDataGrid .
It loads about 3000 records with about 20 columns. I constantly get Flex execution timeout because the grid executes a lot inside LayoutManager.
How can I make it asyncronousely or faster at all?
Use Datagrid pagination.
http://gurufaction.blogspot.com/2007/02/flex-datagrid-paging-example-with.html
http://stackoverflow.com/questions/1893350/how-does-flex-3-datagrid-paging-work
or something like this
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="InitApp()" xmlns:MyComp="*">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.ItemClickEvent;
[Bindable]
public var myData:ArrayCollection = new ArrayCollection();
public var orgData:ArrayCollection = new ArrayCollection();
[Bindable]
public var nav:ArrayCollection = new ArrayCollection();
private var index:int = 0;
private var page:int = 25;
private var paging:Boolean = true;
private function InitApp():void {
for( var x:uint = 1; x <= 500; x++ ) {
var obj:Object = new Object();
obj.Id = x.toString();
obj.Name = "Column " + x.toString();
obj.Street = "5555 Street";
obj.Title = "CEO";
obj.City = "El Paso";
orgData.addItem(obj);
}
refreshDataProvider(0);
}
private function navPage(d:int):void {
index += d;
refreshDataProvider(index);
}
private function refreshDataProvider(start:int):void {
if (paging == true) {
page = 25;
myData = new ArrayCollection(orgData.source.slice(start,start+page));
}
else {
index = 0;
page = 500;
myData = new ArrayCollection(orgData.source);
}
down.enabled = index > 0;
up.enabled = index + page < orgData.length;
lbl.text = index.toString() + ' to ' + (index + page).toString() + ' of ' + orgData.length;
}
private function togglePaging():void {
paging = !paging;
toggle.label = paging.toString();
refreshDataProvider(index);
}
]]>
</mx:Script>
<mx:DataGrid id="dg" dataProvider="{myData}" width="510" height="202"></mx:DataGrid>
<mx:Button x="10" y="210" label="<" click="navPage(-25);" id="down"/>
<mx:Button x="216" y="210" label=">" click="navPage(25);" id="up"/>
<mx:Label x="58" y="212" text="page" width="150" id="lbl"/>
<mx:Button x="264" y="210" label="true" id="toggle" click="togglePaging();"/>
</mx:Application>
Load the data a chunk at a time? Say slightly more than however many rows are shown visually. That way you get the perceived performance that it renders quickly.
3000 records is a lot to be loading in one go it has to be said...

Resources