Setting the Tab Order of TLFTextFields

July 7th, 2010 by Adrian Parr

I have just spent ages trying to set the tabIndex order of a bunch of TLFTextFields in Flash CS5. With the old Classic TextFields you would have done something along the lines of …

holder_mc.tf1.tabIndex = 1;
holder_mc.tf2.tabIndex = 2;
holder_mc.tf3.tabIndex = 3;
holder_mc.tf4.tabIndex = 4;
holder_mc.tf5.tabIndex = 5;

But with the new TLFTextFields this doesn’t work. You can’t just set the tabIndex property of the TLFTextField directly. When you do, it just doesn’t work.

Then I stumbled across this little bit of info in the docs

tabIndex Documentation

So, for my simple example above to work with TLFTextFields instead of Classic TextFields I ended up writing …

InteractiveObject(holder_mc.tlf1.getChildAt(1)).tabIndex = 1;
InteractiveObject(holder_mc.tlf2.getChildAt(1)).tabIndex = 2;
InteractiveObject(holder_mc.tlf3.getChildAt(1)).tabIndex = 3;
InteractiveObject(holder_mc.tlf4.getChildAt(1)).tabIndex = 4;
InteractiveObject(holder_mc.tlf5.getChildAt(1)).tabIndex = 5;

I hope this helps and that you get it to work quicker than I did!

NOTE 1: I’ve noticed that when the user tabs to a Classic TextField the text is selected, but when you tab to a TLFTextField the caret is positioned at the beginning and no text is automatically selected.

NOTE 2: I’ve also noticed that the selection colour for a Classic TextField is black, but the selection colour for a TLFTextField is light blue. This can look a bit strange when you have a mixture textfields on screen near each other.

Posted in ActionScript 3.0, Sample Code | No Comments »

stop(); Action Ignored on Nested Movieclip

December 24th, 2009 by Adrian Parr

Recently I stumbled across this post by Ryan Creighton at Untold Entertainment from back in October 2008 titled ‘stop(); Action Ignored on Nested Movieclip‘. It basically demonstrates how (in AS3) a child movieclip does not stop on the first frame (even though you have put a stop(); action on it) when it’s parent/container is dynamically attached to the stage.

To me this does seem like a bug. Unless I am missing some subtle difference in this area between AS2 and AS3 that I am missing. If so, please can someone explain it to me?

I’ve knocked up a couple of examples to demonstrate …

Firstly, here is the AS2 version that attaches the container movieclip to the stage using the old attachMovie method. Sure enough, the child movieclip does as it is told and stays on frame 1.

And here is the AS3 version that instantiates the Contaner class and adds it to the display list using addChild. As you can see the child movieclip ignores the stop() command on frame 1 and goes to frame 2 instead. Why?

You can download a ZIP file containing the source files for these two examples here.

More discussion about this issue can be found on actionscript.org, but no-one really explains why this is happening. Any ideas?

Posted in ActionScript 3.0, Bug, Sample Code | 3 Comments »

Printing a PDF document from AIR without displaying it or the control bar (using PDF cross-scripting)

October 6th, 2009 by Adrian Parr

Recently I had a project where I needed to allow the user to print out a PDF document from my AIR application, but I really didn’t need the user to actually view the document first and I didn’t want to display the default PDF control bar. I needed some way to send the PDF file to the printer directly from ActionScript. Enter PDF cross-scripting and Acrobat JavaScript. The following information should help you achieve the same result (note you need to have access to a copy of Adobe Acrobat Pro to add the JavaScript code to your PDF file).

There are several steps required for this to work …

  1. Open the PDF document you want to print in Adobe Acrobat Pro.
  2. Add the JavaScript code to your document and save it.
  3. Create an HTML page that contains a JavaScript function and embed the PDF document.
  4. In your Flash (or Flex) file add a button that prompts the user to print the document.
  5. Add the ActionScript 3.0 code that communicates with the HTML page you created in step 3.
  6. Publish your AIR file (making sure you include the HTML and PDF files).
  7. Test your AIR app.

Here is a copy of the PDF file I am printing in the following example.

Right, let’s explain each of the above steps in more detail.

Step 1

I presume you already have a PDF file prepared which you wish to print. Open this file up in Adobe Acrobat Pro. I’m pretty sure this works in version 7.0 and onwards.

Step 2

Open the ‘JavaScript Functions’ dialog box in Adobe Acrobat Pro by going to ‘Advanced’ > ‘Document Processing’ > ‘Document JavaScripts’.

Acrobat Document JavaScript Menu

Enter ‘myOnMessage’ in to the textfield and click on the ‘Add…’ button.

Acrobat JavaScript Functions

Then enter the following JavaScript code in to the window and click on the ‘OK’ button.

JavaScript Editor

function myOnMessage(aMessage)
{
      if (aMessage.length==1) {
            switch(aMessage[0])
            {
                  case "Print":
                        //app.alert("Trying to print PDF");
                        print({
                              bUI: true,
                              bSilent: false,
                              bShrinkToFit: true
                        });
                        break;
                  default:
                        app.alert("Unknown message: " + aMessage[0]);
             }
      }
      else
      {
            app.alert("Message from hostContainer: \n" + aMessage);
      }
}

var msgHandlerObject = new Object();
msgHandlerObject.onMessage = myOnMessage;
msgHandlerObject.onError = myOnError;
msgHandlerObject.onDisclose = myOnDisclose;

function myOnDisclose(cURL,cDocumentURL)
{
      return true;
}

function myOnError(error, aMessage)
{
      app.alert(error);
}

this.hostContainer.messageHandler = msgHandlerObject;

Then remember to re-save your PDF file.

Step 3

Create a blank HTML file and save it next to the PDF file. Then add the following code …

<html>
    <head>
    <title>Load PDF</title>
    <script>
        function callPdfFunctionFromJavascript(arg)
        {
            pdfObject = document.getElementById("PDFObj");
            try {
                 pdfObject.postMessage([arg]);
            }
            catch (e)
            {
                alert( "Error: \n name = " + e.name + "\n message = " + e.message );
            }
        }
    </script>
    </head>
    <body>
        <object id="PDFObj" data="document.pdf" type="application/pdf" width="800" height="600"/>
    </body>
</html>

Step 4

For this example I’m using Flash CS3. Create a movieclip on stage that acts as a button prompting the user to print the PDF document. Give the button instance the name of ‘button’.

Step 5

In this example I have put all the ActionScript code into the document class. The code looks like this …

package
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.html.HTMLLoader;
    import flash.html.HTMLPDFCapability;
    import flash.net.URLRequest;

    public class PrintPdfFromAir extends MovieClip
    {
       
        private var _htmlLoader:HTMLLoader;

        public function PrintPdfFromAir():void
        {
            button.mouseEnabled = false;
            button.alpha = 0.3;
            button.buttonMode = true;
            button.addEventListener(MouseEvent.CLICK, onButtonClick);
           
            trace("HTMLLoader.pdfCapability: "+HTMLLoader.pdfCapability);
           
            if (HTMLLoader.pdfCapability == HTMLPDFCapability.STATUS_OK) {
                _htmlLoader = new HTMLLoader();
                _htmlLoader.addEventListener(Event.COMPLETE, onHtmlLoader_COMPLETE);
                var urlRequest:URLRequest = new URLRequest("load_pdf.html");
                _htmlLoader.load(urlRequest);
                addChild(_htmlLoader);
            }
        }
       
        private function onHtmlLoader_COMPLETE(event:Event):void
        {
            button.alpha = 1;
            button.mouseEnabled = true;
        }
       
        private function onButtonClick(event:MouseEvent):void
        {
            _htmlLoader.window.callPdfFunctionFromJavascript('Print');
        }

    }

}

Basically, we disable to button straight away and add a CLICK event listener. We then check the ‘HTMLLoader.pdfCapability’ property to see if the user has Adobe Reader 8.1 or greater installed on their system. If it equals ‘HTMLPDFCapability.STATUS_OK’ then we can continue. We then create a new instance of the HTMLLoader class, add a listener for the COMPLETE event. We then create an instance of the URLRequest class passing it the name of the HTML file we created in step 3. Next we call the ‘load’ method on our _htmlLoader instance, passing it the urlRequest instance. Then we add the _htmlLoader instance to the stage using addChild.

Normally, when you want to actually display the PDF file on screen, you also need to specify the width and height of the HTMLLoader instance. But in our case we don’t want to actually display it to the user. You may be wondering why we add it to the display list using addChild if we don’t want it to be visible. But I have found that it doesn’t work if you don’t add it to the display list. Not specifying the width and height also means it is not visible (which is what we want on this occasion).

Now we just have the two event handlers to write. The event handler for the HTMLLoader COMPLETE event just makes the button on screen active. We didn’t want the user to be able to click it before the COMPLETE event was fired.

The event handler for the button CLICK event calls the JavaScript function inside the HTML page, which we wrote in step 3.

Step 6

Now you are ready to publish the SWF file and then package it up as an AIR app in the usual way. The important thing to remember is to include the two external files (HTML and PDF) in the AIR Settings dialog box.

Include files

You can create a self-signed certificate for the purposes of testing. I have included my self-signed certificate with the source files (the password is ‘1234′) which you can use if you wish, or you could just create a new one.

Step 7

Once you have exported your AIR file it is a good idea to test it on a few different computers to make sure it works properly. Try it on a machine that doesn’t have Adobe Reader installed, or one that has an older version (< 8.1).

Download example AIR app

Download the example AIR file

Click here to download the example AIR file

Download source files

Download ZIP file containing source files

You can download a ZIP file containing my example source files from here.

Useful links

Here are some other blog posts and articles I found useful …

Posted in AIR, ActionScript 3.0, Sample Code | 6 Comments »

Streaming Video using FMS Gotchya’s

September 17th, 2009 by Adrian Parr

I have just come across a few issues whilst building a video player that plays streaming video from a Flash Media Server.

I thought I had everything set up fine but then when I tested I got the following error message …

ReferenceError: Error #1069: Property onBWDone not found on flash.net.NetConnection and there is no default value.

So to resolve this you need to set the client property of the netConnection instance to the object on which callback methods should be invoked. For example …

netConnection.client = this;

and then you need to have an empty public method called onBWDone, like this …

public function onBWDone(...args):void
{
    trace("onBWDone: "+args);
}

Sometimes you may get the following error message …

ReferenceError: Error #1069: Property onFCSubscribe not found on XXX and there is no default value.

In which case you’ll need to add …

public function onFCSubscribe(info:Object):void
{
    trace("onFCSubscribe");
}

The same goes for this error message …

ReferenceError: Error #1069: Property close not found on XXX and there is no default value.

In which case you’ll need to add …

public function close(...args):void
{
    trace("close: "+args);
}

I then discovered that the netConnection with the server was being closed after 5 minutes of inactivity (e.g. pause the video and leave it for 5 minutes). What you need to do in this case is listen for the ‘NetConnection.Connect.IdleTimeOut’ NetStatusEvent, and gracefully close the netStream yourself. For example …

import flash.events.NetStatusEvent;
netConnection.addEventListener(NetStatusEvent.NET_STATUS, onNetConnection_NET_STATUS);

private function onNetConnection_NET_STATUS(event:NetStatusEvent):void
{
    switch (event.info.code) {
        case "NetConnection.Connect.IdleTimeOut":
        netStream.close();
        netStream = null;
        // Display a still image or message to the user ro something
        break;
    }
}

Posted in ActionScript 3.0, Sample Code, Video | 1 Comment »

Make your cursor always point to the middle of the screen

August 14th, 2009 by Adrian Parr

Yesterday I was taking a look at Balsamiq Mockups and liked the way that the mouse always pointed to the centre of the screen when in fullscreen mode. So I thought I’d quickly knock something to together that did this, and share it here.

It’s pretty simple stuff, but handy to have available to copy-and-paste, if you need something similar.

The code is all in the document class …

package
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.ui.Mouse;

    public class Main extends MovieClip
    {
       
        private var mouseIsOverStage:Boolean;
        private var arrow:Arrow;

        public function Main():void
        {
            arrow = new Arrow();
            Mouse.hide();
            stage.addEventListener(Event.MOUSE_LEAVE, onStage_MOUSE_LEAVE);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onStage_MOUSE_MOVE);
        }
       
        private function onStage_MOUSE_LEAVE(event:Event):void
        {
            mouseIsOverStage = false;
            removeChild(arrow);
        }
       
        private function onStage_MOUSE_MOVE(event:MouseEvent):void
        {
            if (!mouseIsOverStage) {
                mouseIsOverStage = true;
                onStage_MOUSE_ENTER();
            }
            arrow.x = stage.mouseX;
            arrow.y = stage.mouseY;
            var dx:Number = arrow.x - stage.stageWidth/2;
            var dy:Number = arrow.y - stage.stageHeight/2;
            var radians:Number = Math.atan2(dy, dx);
            arrow.rotation = radians * 180/Math.PI;
            event.updateAfterEvent();
        }
       
        private function onStage_MOUSE_ENTER():void
        {
            arrow.x = stage.mouseX;
            arrow.y = stage.mouseY;
            addChild(arrow);
        }
       
    }

}

Download the source files here

Posted in ActionScript 3.0, Sample Code | No Comments »

Drawing circles based on mouse position

May 20th, 2009 by Adrian Parr

This morning I had a need to draw some circles on the stage by clicking-and-dragging, this led me to building a little visual display for lines, mid-points, rects, ellipses, angles, and circles (from centre and from corner).

It is all pretty simple stuff, but I thought I’d post it in case anyone else finds it useful.

You can download a ZIP file of the source code from here.

Posted in ActionScript 3.0, Flash, Sample Code | No Comments »

SWFAddress 2.1 + SWFObject 2.1 + Flash CS3 (AS3) Example

August 21st, 2008 by Adrian Parr

SWFAddressSWFObjectFlash CS3

I was looking around for a simple example of using SWFAddress 2.1 with SWFObject 2.1 and Flash CS3 (ActionScript 3.0) and came across this blog post by Rachel. She has kindly put a simple demo online and made the source code available.

There are a few things that I have updated and am making available here (at the bottom of this post) …

  • Updated SWFAddress from v2.0 to v2.1
  • Updated SWFObject from v1.5 to v2.1
  • Reorganised the folder structure (see below)Folder structure

Download the updated source files here …

SWFAddress2.1_SWFObject2.1_AS3.zip (583 KB)

UPDATE 20/04/09: Lee Brimlow has a good tutorial on using SWFAddress 2.2 on his gotoandlearn() website. I suggest you check it out.

Posted in ActionScript 3.0, Sample Code | 15 Comments »

Custom Context Menu in AS3

April 15th, 2008 by Adrian Parr

I’ve just been having a play with creating a custom context menu in Flash using AS3. Here is the movie …

And here is the ActionScript …

package {
    import flash.display.Sprite;
    import flash.ui.ContextMenu;
    import flash.ui.ContextMenuItem;
    import flash.events.ContextMenuEvent;
    import flash.net.navigateToURL;
    import flash.net.URLRequest;

    public class Main extends Sprite
    {
        private var menuItemLabel:String = "© Adrian Parr";
        private var url:String = "http://www.adrianparr.com";
        private var cm:ContextMenu;

        public function Main()
        {
            cm = new ContextMenu();
            cm.hideBuiltInItems();
            var cmi:ContextMenuItem = new ContextMenuItem(menuItemLabel);
            cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemSelected);
            cm.customItems.push(cmi);
            this.contextMenu = cm;
        }
       
        private function menuItemSelected(evt:ContextMenuEvent):void
        {
            var req:URLRequest = new URLRequest(url);
            navigateToURL(req, '_blank');
        }
    }
}

You can download the Flash source files here.

Posted in ActionScript 3.0, Flash, Sample Code | 20 Comments »

Colour Line Drawing - Part 2

April 2nd, 2008 by Adrian Parr

Following on from yesterday’s post, I’ve had chance to update the Colour Line Drawing demo to include gradual colour changing (instead of random) and fixed the saving of the image to a jpeg file.

The saving of the image is done using the as3corelib library (thanks to Henry Jones for providing an example of this). Thanks also to Ryan Taylor for his color spectrum blog post.

Colour Line Drawing Screengrab

Click here to launch the demo.

You can download the source files here.

Here is the code in the Main document class …

package {
    import flash.display.MovieClip;
    import flash.display.Graphics;
    import flash.display.Stage;
    import flash.display.BitmapData;
   
    import flash.events.MouseEvent;
    import flash.events.KeyboardEvent;
   
    import flash.ui.Mouse;
    import flash.ui.Keyboard;
   
    import flash.utils.ByteArray;
   
    import flash.net.navigateToURL;
    import flash.net.URLRequestHeader;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.net.URLRequestMethod;
   
    import com.adobe.images.JPGEncoder;

    public class Main extends MovieClip
    {
        private var canvas:MovieClip;
        private var serverPath:String = "";
        private var colourIncrement:int = 0;
       
        public function Main():void
        {
            Mouse.hide();
            stage.showDefaultContextMenu = false;
            stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);
           
            canvas = new MovieClip();
            canvas.graphics.beginFill(0x000000);
            canvas.graphics.drawRect(0, 0, 500, 375);
            canvas.graphics.endFill();
            canvas.graphics.moveTo(mouseX, mouseY);
            canvas.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoved);
            canvas.addEventListener(MouseEvent.CLICK, clearScreen);
            addChild(canvas);
        }
       
        private function mouseMoved(evt:MouseEvent):void
        {
            var nColorPercent:Number = colourIncrement / 200;
            colourIncrement += 1;
            var nRadians:Number = (-360 * nColorPercent) * (Math.PI / 180);
            var nRed:Number = Math.cos(nRadians) * 127 + 128 < < 16;
            var nGreen:Number = Math.cos(nRadians + 2 * Math.PI / 3) * 127 + 128 << 8;
            var nBlue:Number = Math.cos(nRadians + 4 * Math.PI / 3) * 127 + 128;
            var nColour:Number = nRed | nGreen | nBlue;

            canvas.graphics.lineStyle(60, nColour, 1);
            canvas.graphics.lineTo(mouseX, mouseY);
            evt.updateAfterEvent();
        }
       
        private function clearScreen(evt:MouseEvent):void
        {
            canvas.graphics.clear();
            canvas.graphics.beginFill(0x000000);
            canvas.graphics.drawRect(0, 0, 500, 375);
            canvas.graphics.endFill();
            canvas.graphics.moveTo(mouseX, mouseY);
        }
       
       
        private function reportKeyDown(evt:KeyboardEvent):void
        {
            if (evt.keyCode == Keyboard.SPACE) {
                createJPG(canvas, 90, "colour_line_drawing");
            } else if (evt.keyCode == Keyboard.ESCAPE) {
                if (stage.displayState == "normal") {
                    stage.displayState = "fullScreen";
                }
            }
        }
       
        function createJPG(m:MovieClip, q:Number, fileName:String)
        {
            var jpgSource:BitmapData = new BitmapData (m.width, m.height);
            jpgSource.draw(m);
            var jpgEncoder:JPGEncoder = new JPGEncoder(q);
            var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
           
            var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
                       
            var jpgURLRequest:URLRequest = new URLRequest ( serverPath+"jpg_encoder_download.php?name=" + fileName + ".jpg");      
            jpgURLRequest.requestHeaders.push(header);       
            jpgURLRequest.method = URLRequestMethod.POST;            
            jpgURLRequest.data = jpgStream;
           
            var jpgURLLoader:URLLoader = new URLLoader();      
            navigateToURL(jpgURLRequest, "_blank");
        }
       
    }
}

Posted in ActionScript 3.0, Flash, Sample Code | 4 Comments »

Setting the framerate dynamically using AS3

April 2nd, 2008 by Adrian Parr

Here is a little example to show you how to dynamically set the framerate of your Flash movie using AS3. In this example I have also included a slider component to allow you to change the framerate, to prove that it is doing it on-the-fly.

You can download the source files here.

Here is the AS3 code in the Main document class …

package
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import fl.events.SliderEvent;

    public class Main extends MovieClip
    {

        private var myBall:MovieClip;
        private var sliderValue:Number = 1;
       
        public function Main():void
        {
            stage.frameRate = sliderValue;
           
            myBall = new Ball();
            myBall.x = 0 - myBall.width/2;
            myBall.y = stage.stageHeight/2;
            addChild(myBall);
           
            sliderLabel.text = sliderValue+" fps";
           
            myBall.addEventListener(Event.ENTER_FRAME, frameLoop);
            slider.addEventListener(SliderEvent.THUMB_DRAG, sliderDrag);
        }
       
        private function frameLoop(evt:Event):void {
            myBall.x += 10;
            if (myBall.x > stage.stageWidth + myBall.width) {
                myBall.x = 0 - myBall.width/2;
            }
        }

        private function sliderDrag(e:SliderEvent):void {
            sliderValue = e.target.value;
            stage.frameRate = sliderValue;
            sliderLabel.text = sliderValue+" fps";
        }
       
    }
}

Posted in ActionScript 3.0, Flash, Sample Code | 2 Comments »

Attach MovieClip from library using AS3

April 2nd, 2008 by Adrian Parr

Here is a quick example of how to attach a MovieClip library item to the stage using AS3. In this example the linkage name has been set to ‘LibraryItem’.

Here is the code for the Main document class …

package
{
    import flash.display.MovieClip;

    public class Main extends MovieClip
    {
       
        private var myMovieClip:MovieClip;
       
        public function Main():void
        {
            myMovieClip = new LibraryItem();
            myMovieClip.x = stage.stageWidth/2;
            myMovieClip.y = stage.stageHeight/2;
            addChild(myMovieClip);
        }

    }

}

You can download the source files here.

Posted in ActionScript 3.0, Flash, Sample Code | No Comments »

Colour Line Drawing

April 1st, 2008 by Adrian Parr

This afternoon my 22 month-old daughter came up to me while I was on the computer, and wanted to play with the mouse. So rather than have her delete all my work I quickly put together a little simple colourful drawing app which she could play with. It was also a good exercise for me to learn some more AS3.

Move the mouse to draw. Click to go fullscreen. Press spacebar to save image out as a JPEG (not working at present).

Here is a screengrab …

Click here to launch the app.

Here are the source files.

Main document class code here …

package {
    import flash.display.Sprite;
    import flash.display.Graphics;
    import flash.display.Stage;
    import flash.display.BitmapData;
   
    import flash.events.MouseEvent;
    import flash.events.KeyboardEvent;
   
    import flash.ui.Mouse;
    import flash.ui.Keyboard;
   
    import flash.utils.ByteArray;
   
    import flash.net.navigateToURL;
    import flash.net.URLRequestHeader;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.net.URLRequestMethod;
   
    import com.adobe.images.JPGEncoder;

    public class Main extends Sprite
    {
        private var canvas:Sprite;
        private var serverPath:String = "";
       
        public function Main():void
        {
            Mouse.hide();
            stage.showDefaultContextMenu = false;
            stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);
           
            canvas = new Sprite();
            canvas.graphics.beginFill(0x000000);
            canvas.graphics.drawRect(0, 0, 500, 375);
            canvas.graphics.endFill();
            canvas.graphics.moveTo(mouseX, mouseY);
            canvas.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoved);
            canvas.addEventListener(MouseEvent.CLICK, mouseClicked);
            addChild(canvas);
        }
       
        private function mouseMoved(evt:MouseEvent):void{   
            canvas.graphics.lineStyle(40, (Math.random()*0xFFFFFF), 1);
            canvas.graphics.lineTo(mouseX, mouseY);
            evt.updateAfterEvent();
        }
       
        private function mouseClicked(evt:MouseEvent):void {
            if (stage.displayState == "normal") {
                stage.displayState = "fullScreen";
            }
        }
       
        private function reportKeyDown(evt:KeyboardEvent):void {
            if (evt.keyCode == Keyboard.SPACE) {
                createJPG(canvas, 90, "sketch");
            }
        }
       
        function createJPG(m:Sprite, q:Number, fileName:String) {
            var jpgSource:BitmapData = new BitmapData (m.width, m.height);
            jpgSource.draw(m);
            var jpgEncoder:JPGEncoder = new JPGEncoder(q);
            var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
           
            var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
                       
            var jpgURLRequest:URLRequest = new URLRequest ( serverPath+"jpg_encoder_download.php?name=" + fileName + ".jpg");     
            jpgURLRequest.requestHeaders.push(header);       
            jpgURLRequest.method = URLRequestMethod.POST;           
            jpgURLRequest.data = jpgStream;
           
            var jpgURLLoader:URLLoader = new URLLoader();     
            navigateToURL(jpgURLRequest, "_blank");
        }
       
    }
}

Posted in ActionScript 3.0, Flash, Sample Code | No Comments »

Hide default right-click menu in AS3

April 1st, 2008 by Adrian Parr

To hide the default right-click menu in AS3 use this …

package {
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public function Main():void
        {
            stage.showDefaultContextMenu = false;
        }
    }
}

or this also works …

package {
    import flash.display.Sprite;
    import flash.ui.ContextMenu;

    public class Main extends Sprite
    {
        private var cm:ContextMenu;
       
        public function Main()
        {
            cm = new ContextMenu();
            cm.hideBuiltInItems();
            this.contextMenu = cm;
        }
    }
}

Posted in ActionScript 3.0, Flash, Sample Code | 3 Comments »

Hiding the cursor in AS3

April 1st, 2008 by Adrian Parr

To hide the mouse cursor using AS3 use this …

package {
    import flash.display.Sprite;
    import flash.ui.Mouse;

    public class Main extends Sprite
    {
        public function Main():void
        {
            Mouse.hide();
        }
    }
}

Posted in ActionScript 3.0, Flash, Sample Code | 1 Comment »

Find text char under cursor using getCharIndexAtPoint()

March 28th, 2008 by Adrian Parr

I have just stumbled across g.wygonik’s blog post about finding which character is currently under the cursor. This is something that I have needed to do on numerous occasions back in the AS1 and AS2 days. Adobe did give us TextSnapshot, but that only worked on static textfields, not dynamic or input ones. Now you can use the getCharIndexAtPoint() method of the TextField class.

This demo is a slightly modified version of g.wygonik’s.

You can download the AS3 source from here.

Adobe LiveDocs documentation

Posted in ActionScript 3.0, Flash, Sample Code | 2 Comments »

AS3 Particles - Part 1

March 28th, 2008 by Adrian Parr

I’ve just been having a play around with some particle effect, inspired by Seb Lee-Delisle, who I saw speak on the subject at Flash on the Beach 2007.

You can download the AS3 source code here.

Posted in ActionScript 3.0, Sample Code | No Comments »

Setting the stage scaleMode in AS3

March 28th, 2008 by Adrian Parr

Ok, following on from yesterday’s post about setting the stage quality in AS3, this is how to set the scaleMode, so that you can control how your flash movie scales when the user resizes the Flash Player window or HTML page (if size in HTML is set to percentages).

In AS1 and AS2 we would have used …

Stage.scaleMode = "noScale";

And the four different values you could have given it are the strings “showAll”, “exactFit”, “noBorder” and “noScale”.

In AS3 it has changed slightly to …

stage.scaleMode = StageScaleMode.NO_SCALE;

And the four different constant values available are SHOW_ALL, EXACT_FIT, NO_BORDER and NO_SCALE.

Notice that stage is now all lowercase, and you should use the constant values instead of the string literals.

If you are doing this from within a class then you will need to import the ‘StageScaleMode’ class that lives in the ‘flash.display’ package.

import flash.display.StageScaleMode;

Posted in ActionScript 3.0, Flash, Sample Code | 1 Comment »

Setting the stage quality in AS3

March 27th, 2008 by Adrian Parr

This is how you set the stage quality using ActionScript 3.0

Old AS1 & AS2 code was …

_quality = "LOW";

New AS3 code is …

stage.quality = StageQuality.LOW;

The setting options are BEST, HIGH, MEDIUM & LOW.

If you are using this inside a class, you will also have to import the ‘StageQuality’ class from within the ‘flash.display’ package…

import flash.display.StageQuality;

Posted in ActionScript 3.0, Flash, Sample Code | 2 Comments »

Detecting key presses in AS3

February 25th, 2008 by Adrian Parr

Keyboard

In ActionScript 3 you can detect key presses on the keyboard using the Stage class. I discovered that the Stage object is not globally accessible. You need to access it through the stage property of a DisplayObject instance. So from within a Class you can check which keys are being pressed using the following code.

package {
    import flash.events.KeyboardEvent;
    import flash.display.MovieClip;

    public class KeyboardTest extends MovieClip {

        private var base:MovieClip;

        public function KeyboardTest($base:MovieClip):void {
            trace("KeyboardTest constructor is being run");
            base=$base;
            base.stage.addEventListener(KeyboardEvent.KEY_DOWN,keyboardListener);
        }

        private function keyboardListener(event:KeyboardEvent):void {
            trace("event.keyCode: " + event.keyCode);
        }
    }
}

Posted in ActionScript 3.0, Sample Code | No Comments »

Tweener Easing Types

February 12th, 2008 by Adrian Parr

I’ve been having a play with Tweener in AS3.0 and put together a little movie that demonstrates all the different easing type you can choose from. These are all based on the original Penner Easing Equations. This is very similar to Robert Penner’s Equations Visualizer. The duration for my tweens is set to one second.

Here is the Main class.

package {
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import fl.controls.ComboBox;
    import flash.display.Loader;
    import flash.net.URLRequest
    import caurina.transitions.Tweener;

    public class Main extends MovieClip {

        private var _border:Sprite;
        private var _canvas:Sprite;
        private var _canvasWidth:int = 500;
        private var _canvasHeight:int = 300;
        private var _iNum:int = 100;
        private var _ball:Sprite;
        private var _cb1:ComboBox;
        private var _cb2:ComboBox;
        private var _selectedTween:String = "none";
        private var _loader:Loader;
        private var _folder:String = "graphs/";
        private var _ext:String = ".gif";

        public function Main():void {
            _border = new Sprite();
            var _thickness:int = 1;
            _border.graphics.lineStyle(_thickness, 0x036CB4, 1, true);
            _border.graphics.lineTo((_canvasWidth-(_thickness/2)), (_thickness/2));
            _border.graphics.lineTo((_canvasWidth-(_thickness/2)), (_canvasHeight-(_thickness/2)));
            _border.graphics.lineTo((_thickness/2), (_canvasHeight-(_thickness/2)));
            _border.graphics.lineTo((_thickness/2), (_thickness/2));

            _canvas = new Sprite();
            _canvas.graphics.beginFill(0xFFFFFF);
            _canvas.graphics.drawRect(0, 0, _canvasWidth, _canvasHeight);
            _canvas.graphics.endFill();
            _canvas.addEventListener(MouseEvent.CLICK, onClick);
            _canvas.alpha = 0;

            _ball = new Sprite();
            _ball.graphics.lineStyle();
            _ball.graphics.beginFill(0x0033FF);
            _ball.graphics.drawCircle(0, 0, 10);
            _ball.graphics.endFill();
            _ball.x = _canvasWidth/2;
            _ball.y = _canvasHeight/2;

            _cb1 = new ComboBox();
            _cb1.editable = false;
            _cb1.move(10, 10);
            _cb1.width = 90;
            _cb1.rowCount = 6;
            _cb1.addItem({label:"none"});
            _cb1.addItem({label:"linear"});
            _cb1.addItem({label:"easeIn"});
            _cb1.addItem({label:"easeOut"});
            _cb1.addItem({label:"easeInOut"});
            _cb1.addItem({label:"easeOutIn"});
            _cb1.addEventListener(Event.CHANGE, onComboBoxChange);

            _cb2 = new ComboBox();
            _cb2.editable = false;
            _cb2.move(110, 10);
            _cb2.width = 90;
            _cb2.rowCount = 12;
            _cb2.addItem({label:"none"});
            _cb2.addItem({label:"linear"});
            _cb2.addItem({label:"Sine"});
            _cb2.addItem({label:"Cubic"});
            _cb2.addItem({label:"Quint"});
            _cb2.addItem({label:"Circ"});
            _cb2.addItem({label:"Back"});
            _cb2.addItem({label:"Quad"});
            _cb2.addItem({label:"Quart"});
            _cb2.addItem({label:"Expo"});
            _cb2.addItem({label:"Elastic"});
            _cb2.addItem({label:"Bounce"});
            _cb2.addEventListener(Event.CHANGE, onComboBoxChange);

            _loader = new Loader();
            _loader.x = 352;
            _loader.y = -9;
            _loader.load(new URLRequest(_folder + _selectedTween + _ext));

            addChild(_loader);
            addChild(_border);
            addChild(_canvas);
            addChild(_ball);
            addChild(_cb1);
            addChild(_cb2);
        }

        private function animateToPos():void {
            Tweener.addTween(_ball, {x:mouseX, y:mouseY, transition:_selectedTween, delay:0, time:1, onComplete:tweenDone, onStart:tweenStart, onUpdate:tweenUpdate});
        }

        private function onClick(event:MouseEvent):void {
            if (_selectedTween == null || _selectedTween == "none") {
                _ball.x = mouseX;
                _ball.y = mouseY;
            } else {
                animateToPos();
            }
        }

        private function tweenStart():void {
            trace("tweenStart()");
        }

        private function tweenUpdate():void {
            trace("tweenUpdate()");
        }

        private function tweenDone():void {
            trace("tweenDone()");
        }

        private function onComboBoxChange(event:Event):void {
            if (_cb1.selectedLabel == "none" || _cb2.selectedLabel == "none") {
                _selectedTween = "none";
            } else if (_cb1.selectedLabel == "linear" || _cb2.selectedLabel == "linear") {
                _selectedTween = "linear";
            } else {
                _selectedTween = _cb1.selectedLabel+_cb2.selectedLabel;
            }
            _loader.load(new URLRequest(_folder + _selectedTween + _ext));
        }

    }
}

Download source

Posted in ActionScript 3.0, Sample Code, Tweening | No Comments »

« Previous Entries