IconizedClass – Icons als Klasse
Ich habe ein kleines Tool geschrieben mit dem man Icons in eine Klasse umwandeln kann. Grund war, dass ich Icons benötige die ich später als Mousecursor benutzen möchte (Flash hat ja leider nicht wirklich viele Mousezeiger-Typen). Da ich aber in meinem kleinem Tool-Framework keine Grafiken einbinden wollte, sondern für jedes Cursor-Icon nur eine eigene Klasse wollte, habe ich ein wenig mit dynamisch generierten Bitmaps experimentiert.
Von der Bedienung ist es sehr easy:
- Ihr wählt ein Icon aus (*.jpg, *.png, *.gif)
- Danach könnt Ihr dieses als Klasse abspeichern
- Jetzt noch den Dateinamen, Klassennamen und Konstruktor anpassen (Standard: MyIconClass)
- Je nachdem wo Ihr die Klasse ablegt, müsst Ihr noch innerhalb der Klasse den Package-Pfad anpassen
Hier die Anwendung zum Testen:
Beispiel eines Icons:
![]()
Beispiel als generierte Klasse:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
public class MyIconClass extends Bitmap
{
private static var bitmapDataCache : BitmapData;
public function MyIconClass()
{
if(!bitmapDataCache) {
bitmapDataCache = generateBitmapData();
}
this.bitmapData = bitmapDataCache;
}
public static function preGenerate():void {
new MyIconClass();
}
private function generateBitmapData() : BitmapData
{
var picBitmapData : BitmapData;
var byteArray : ByteArray = new ByteArray();
for (var i : int = 0;i < pixelData.length / 2;i++) {
byteArray.writeByte(uint("0x"+pixelData.substr(i*2,2) ));
}
byteArray.uncompress();
byteArray.position = 0;
var picWidth : uint = byteArray.readUnsignedShort();
var picHeight : uint = byteArray.readUnsignedShort();
picBitmapData = new BitmapData(picWidth, picHeight, true);
for (var pixelY : int = 0;pixelY < picHeight;pixelY++) {
for (var pixelX : int = 0;pixelX < picWidth;pixelX++) {
picBitmapData.setPixel32(pixelX, pixelY, uint(byteArray.readUnsignedInt()));
}
}
return picBitmapData;
}
private function get pixelData() : String
{
var data : String = "";
data += "78daed56cbaac23010ed43456ce96357ea15f201fe4c5db82eed85bbd2ffdf79a77002434862fa484070e0109d4c72269d4712";
data += "8948445ff948890909431c987b4f38115e2427fc8f037217e07e612c02f8a0e596f0ec83953b800f2921b771331f72d86f293b";
data += "4225f9b9687415ecb7e62f091da1273c94fc7b40dfc16eb741bc53ec33e140c80835e142b82afc57e86bd81dd8da74663ec85c";
data += "cbd9b7957bca1c140abf807ecf7c956bf3193969aaef1afa498e84b3327f863e825dbda03f186b8ce402fd11f1d59dbfc47c81";
data += "58a87bd87c78d75b8ce232efe043c2fab9b5bed702f745a2e19f72e6e6f9fc37f02486f337a86335764f1aff08bf189f4afcad";
data += "f3f8dd637fddf979fc7f08a3a6be05f25e18eadf363f625fd71c9c6c07f66d17e73fc9e0c0adf3a125dcd15397d47f87f5ad23";
data += "b7aeff5538d792fe57627dbee04e36f57f97fc5fdbff6df79fcbfd5f7aba7f2bc4d3f6feb9c36e6b7ef9fe69795d28dc03e67d";
data += "bc7fdef58771468d6de543cffa9a6f6e9d0f0dee8b2610b7ea4386586701b9d5fe90aeacef7f888e34b9";
return data;
}
}
}
Die Klasse macht nichts anderes als ein komprimierten String in dem sich die BitmapData befindet, dekomprimiert in ein Bitmap zu wandeln. Bei einem weiteren Aufruf der Klasse wird der Inhalt nicht nochmals generiert, sondern die BitmapData aus dem “Cache” verwendet.
Mit der Funktion preGenerate() kann man ein Bild schon im Voraus generieren, falls man auf Performance setzen will.
Große Bilder lohnen sich meiner Meinung nicht, da die Komprimierung vom Flash nicht ganz so stark ist, und zweitens das dekomprimieren aus dem String zu lange dauern würde.
- Update -
Es wurden noch ein paar Änderungen vorgenommen. Weitere Infos gibt es hier:
http://weltchefflasher.de/blog/2010/05/26/iconizedclass-–-update/
