Archive for the ‘Mac’ Category

3月
18

Mac上でVMware Fusion2.0を使って稼働させているopenSUSEに、VMware Toolsをインストールしたのでメモしておきます。

VMware ToolsをゲストOSにインストールすると、グラフィックスのパフォーマンスが向上したり、ホストOSであるMacとの間のマウスの移動がスムーズになったり、複数のOSを同時に操作するのに効果的な機能が追加されます。

また、ゲストOSのアプリケーションがまるでMacのアプリケーションであるかのように操作できるユニティモード機能が有効になります。

VMware Toolsをインストールするには、まず、VMware Fusionを起動しopenSUSEの仮想マシンを立ち上げます。[仮想マシン]メニューから、[VMware Toolsのインストール]を選択します。

するとCD/DVDドライブとしてマウントされます。

VMwareTools-e.x.p-116369.tar.gzというファイルを解凍すると、vmware-tools-distribというディレクトリができます。

mojamoja@suse:~/Desktop> tar xvf VMwareTools-e.x.p-116369.tar.gz
mojamoja@suse:~/Desktop> ls -lv
合計 53356
rw-r–r– 1 mojamoja users 664 2009-03-12 21:31 GnomeOnlineHelp.desktop
-rw-r–r– 1 mojamoja users 161 2009-03-12 21:31 SuSE.desktop
-rw-r–r– 1 mojamoja users 54544762 2008-09-11 10:34 VMwareTools-e.x.p-116369.tar.gz
drwxr-xr-x 7 root root 4096 2008-09-11 10:34 vmware-tools-distrib

vmware-tools-distribに移動し、vmware-install.plをroot権限で実行します。

インストールが始まり、しばらくすると以下のようなメッセージが表示されました。

Setup is unable to find the “gcc” program on your machine. Please make sure it is installed. Do you want to specify the location of this program by hand? [yes]

What is the location of the “gcc” program on your machine?

どうやらgcc(c言語コンパイラ)パッケージが必要なようです。YaST2でインストールします。

気を取り直してインストール再開です。

今度は以下のようなメッセージが表示されました。

Using compiler “/usr/bin/gcc”. Use environment variable CC to override.

What is the location of the directory of C header files that match your running kernel? [/usr/src/linux/include]

kernelソースも必要なようです。同様にYaST2でインストールします。

今度は無事にインストールできました。

openSUSEでGNOME Teminalを起動してみます。

[表示]メニューより、[ユニティ モードで起動]を選択します。

GNOME TeminalがMacのアプリケーションように操作できます。

これでホストOSとゲストOSを行ったり来たりする必要がなくなりました。これは便利!

2月
05

2008年12月に公開されたLinux版AIRランタイムをopenSUSE 10.3にインストールして自作AIRアプリを実行してみました。

これで AIR がサポートするプラットフォームに Fedora 8, Ubuntu 7.10, Open Suse 10.3 が追加されたことになります。他の Linux ディストリビューションでも rpm か Debian パッケージマネージャをサポートするものでは動作させることは可能だと思います。

akihiro kamijo: Linux 用 AIR 1.5 公開より引用。

openSUSEはMac上でVMware Fusion2.0を使って稼動させています。デスクトップインターフェイスはGNOMEにしています。

まずは、Linux版AIRランタイムのインストールです。いつものように、Adobe – Adobe AIRからインストーラをダウンロードします。

デスクトップにダウンロードしました。

このアイコンをダブルクリックしても、以下のようなエラーが出て実行できません。

コマンドラインからインストーラを起動します。
実行可能になっていないので、

mojamoja@suse:~/Desktop> ls -lv
合計 13284
-rw-r–r– 1 mojamoja users 13553300 2009-02-05 22:50 AdobeAIRInstaller.bin
-rw-r–r– 1 mojamoja users 664 2009-02-05 20:51 GnomeOnlineHelp.desktop
-rw-r–r– 1 mojamoja users 161 2009-02-05 20:51 SuSE.desktop

実行権限をつけて、実行します。

mojamoja@suse:~/Desktop> chmod +x AdobeAIRInstaller.bin
mojamoja@suse:~/Desktop> ls -lv
合計 13284
-rwxr-xr-x 1 mojamoja users 13553300 2009-02-05 22:50 AdobeAIRInstaller.bin
-rw-r–r– 1 mojamoja users 664 2009-02-05 20:51 GnomeOnlineHelp.desktop
-rw-r–r– 1 mojamoja users 161 2009-02-05 20:51 SuSE.desktop
mojamoja@suse:~/Desktop> ./AdobeAIRInstaller.bin

インストーラが起動しました。

後はウィザードに従ってインストールしますが、root権限が必要になりますので途中でパスワードを要求されます。

AIRランタイムのインストールが完了したら、今度は自作のAIRアプリをインストールします。
インストールしたのはflashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンをアニメーションさせる方法のサンプルアプリです。

さあ、動くかな?

動いた!

GNOMEといえば、一般的にはMac OSX風のデスクトップインターフェイスと言われているのですが、見た目はタスクトレイっぽいです。

if (NativeApplication.supportsDockIcon) {
Alert.show("DockIcon!");
}
else if (NativeApplication.supportsSystemTrayIcon) {
Alert.show("TaskTray!");
}

試しに判定してみたところ、Dockアイコンではなくタスクトレイとして認識されました。これならWindowsの場合と同じロジックで動作しますね。

KDE環境で試しても、きっとタスクトレイのような気がします。どなたか試された方がいらっしゃいましたら、是非、教えていただきたいです!

2月
04

flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜実装編〜の続きです。今回はDockアイコンを縮小/拡大させるアニメーションです。画像の横幅を徐々に縮小していき、サイズが0になった時点で元となる画像を左右反転させ、徐々に拡大していきます。今回は縦幅は変更しません。

サンプルソースはこちら。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
 xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="horizontal"
 horizontalAlign="center"
 verticalAlign="middle"
 creationComplete="onInit()">
 <mx:Script>
  <![CDATA[
   import mx.core.BitmapAsset;
   [Embed(source="assets/AIRApp_icon128.png")]
   private var icon128:Class;

   [Embed(source="assets/AIRApp_icon16.png")]
   private var icon16:Class;

   private var isAnimation:Boolean = false;
   private var isDecrement:Boolean = false;
   private var isReverse:Boolean = false;
   private var counter:int = 0;

   private function onInit():void {
    var bitmap:BitmapData;

    if (NativeApplication.supportsDockIcon) {
     bitmap = (new icon128() as BitmapAsset).bitmapData;
    }
    else if (NativeApplication.supportsSystemTrayIcon) {
     bitmap = (new icon16() as BitmapAsset).bitmapData;
    }
    else {
     NativeApplication.nativeApplication.exit();
    }

    setIcon(bitmap);
   }

   private function setIcon(bitmap:BitmapData):void {
    NativeApplication.nativeApplication.icon.bitmaps = [bitmap];
   }

   private function onClick(event:MouseEvent):void {
    if (isAnimation) {
     this.removeEventListener(Event.ENTER_FRAME, onAnimation);
     btnAnimation.label = "Animation";
    }
    else {
     this.addEventListener(Event.ENTER_FRAME, onAnimation);
     btnAnimation.label = "Stop";
    }

    isAnimation = !isAnimation;
   }

   private function onAnimation(event:Event):void {
    var iconBitmap:BitmapData;
    var newIconBitmap:BitmapData;
    var rectangle:Rectangle;

    if (isDecrement) {
     counter--;
    }
    else {
     counter++;
    }

    if (NativeApplication.supportsDockIcon) {
     iconBitmap = new BitmapData(128, 128, true, 0x0000000);
     newIconBitmap = (new icon128() as BitmapAsset).bitmapData;
     rectangle = new Rectangle(0, 0, 128, 128);
    }
    else {
     iconBitmap = new BitmapData(16, 16, true, 0x0000000);
     newIconBitmap = (new icon16() as BitmapAsset).bitmapData;
     rectangle = new Rectangle(0, 0, 16, 16);
    }

    setIcon(scaleBitmap(iconBitmap, newIconBitmap,
     rectangle, counter, isReverse));

    if (counter == newIconBitmap.width) {
     isDecrement = true;
     isReverse = !isReverse;
    }
    else if (counter == 0) {
     isDecrement = false;
    }
   }

   private function scaleBitmap(
    iconBitmap:BitmapData, newIconBitmap:BitmapData,
    rectangle:Rectangle, counter:int, isReverse:Boolean):BitmapData {

    if (isReverse) {
     var tempBitmap:BitmapData;
     var tempRectangle:Rectangle;

     if (NativeApplication.supportsDockIcon) {
      tempBitmap = new BitmapData(128, 128, true, 0x00000000);
      tempRectangle = new Rectangle(0, 0, 128, 128)
     }
     else if (NativeApplication.supportsSystemTrayIcon) {
      tempBitmap = new BitmapData(16, 16, true, 0x00000000);
      tempRectangle = new Rectangle(0, 0, 16, 16)
     }

     var tempMatrix:Matrix = new Matrix();
     tempMatrix.scale(-1, 1);
     tempMatrix.translate(tempBitmap.width, 0);
     tempBitmap.draw(newIconBitmap, tempMatrix, null, null, tempRectangle);
     newIconBitmap = tempBitmap.clone();
    }

    var matrix:Matrix = new Matrix();
    var sx:Number = (newIconBitmap.width-counter)/newIconBitmap.width
    var sy:Number = 1;
    var tx:Number = newIconBitmap.width/2-(sx*newIconBitmap.width/2);
    var ty:Number = 0;
    matrix.scale(sx, sy);
    matrix.translate(tx, ty);
    iconBitmap.draw(newIconBitmap, matrix, null, null, rectangle);

    return iconBitmap;
   }
  ]]>
 </mx:Script>
 <mx:Button label="Animation" id="btnAnimation" click="onClick(event)"/>
</mx:WindowedApplication>

大枠は前回のサンプルソースと同様です。違うところは、縮小/拡大するサイズをenterFrameイベントでインクリメント/デクリメントするところと、画像を加工する関数、scaleBitmapの中身くらいです。enterFrameイベントハンドラのonAnimation関数の前半部分の

if (isDecrement) {
 counter--;
}
else {
 counter++;
}

では、counter変数をインクリメント/デクリメントすることで、画像の横幅を徐々に変更していきます。isDecrementフラグは、縮小/拡大の状態を表していて、falseの時に縮小、trueの時に拡大します。

onAnimationの後半部分の

if (counter == newIconBitmap.width) {
 isDecrement = true;
 isReverse = !isReverse;
}
else if (counter == 0) {
 isDecrement = false;
}

では、画像の横幅を徐々に縮小していった結果、サイズが0になった時点でもとの画像を左右反転させ、徐々に拡大していきます。画像の左右反転の状態を示しているのがisReverseフラグです。trueの時に左右反転します

scaleBitmap関数の中の以下の部分では

var matrix:Matrix = new Matrix();
var sx:Number = (newIconBitmap.width-counter)/newIconBitmap.width
var sy:Number = 1;
var tx:Number = newIconBitmap.width/2-(sx*newIconBitmap.width/2);
var ty:Number = 0;
matrix.scale(sx, sy);
matrix.translate(tx, ty);
iconBitmap.draw(newIconBitmap, matrix, null, null, rectangle);

画像を縮小/拡大する処理を実装しています。

var sx:Number = (newIconBitmap.width-counter)/newIconBitmap.width;

で、x軸方向の圧縮率を求めます。

var sy:Number = 1;

y軸方向は圧縮/拡大しませんので、圧縮率は1です。

var tx:Number = newIconBitmap.width/2-(sx*newIconBitmap.width/2);
var ty:Number = 0;

では、圧縮/拡大することによって画像の中心点が移動されますので、元の位置にもどす平行移動距離を求めています。計算式は、flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜概要編〜

tx=x-ax-cy
ty=y-bx-dy

より求められます。圧縮/拡大時の変換行列は

となりますので、
tx=64-sx*64-0*64=64-sx*64
となるわけです。

元となる画像を反転させている部分は、

if (isReverse) {
 var tempBitmap:BitmapData;
 var tempRectangle:Rectangle;

 if (NativeApplication.supportsDockIcon) {
  tempBitmap = new BitmapData(128, 128, true, 0x00000000);
  tempRectangle = new Rectangle(0, 0, 128, 128)
 }
 else if (NativeApplication.supportsSystemTrayIcon) {
  tempBitmap = new BitmapData(16, 16, true, 0x00000000);
  tempRectangle = new Rectangle(0, 0, 16, 16)
 }

 var tempMatrix:Matrix = new Matrix();
 tempMatrix.scale(-1, 1);
 tempMatrix.translate(tempBitmap.width, 0);
 tempBitmap.draw(newIconBitmap, tempMatrix, null, null, tempRectangle);
 newIconBitmap = tempBitmap.clone();
}

の、

tempMatrix.scale(-1, 1);
tempMatrix.translate(tempBitmap.width, 0);

です。

では、実行してみます。

見方によっては画像中心点のy軸を基準に回転しているようにも見えますね。

■関連記事へのリンク
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのDockアイコンをカスタマイズする方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンをアニメーションさせる方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜概要編〜
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜実装編〜

2月
03

flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜概要編〜の続きです。今回はDockアイコンを回転させるアニメーションの実装です。

ソースはこちら。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
 xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="horizontal" creationComplete="onInit()">
 <mx:Script>
  <![CDATA[
   import mx.core.BitmapAsset;
   [Embed(source="assets/AIRApp_icon128.png")]
   private var icon128:Class;

   [Embed(source="assets/AIRApp_icon16.png")]
   private var icon16:Class;

   private var isAnimation:Boolean = false;
   private var degrees:Number = 0;

   private function onInit():void {
    if (NativeApplication.supportsDockIcon) {
     setIcon((new icon128() as BitmapAsset).bitmapData);
    }
    else if (NativeApplication.supportsSystemTrayIcon) {
     setIcon((new icon16() as BitmapAsset).bitmapData);
    }
    else {
     NativeApplication.nativeApplication.exit();
    }
   }

   private function setIcon(bitmap:BitmapData):void {
    NativeApplication.nativeApplication.icon.bitmaps = [bitmap];
   }

   private function onClick(event:MouseEvent):void {
    if (isAnimation) {
     this.removeEventListener(Event.ENTER_FRAME, onAnimation);
     btnAnimation.label = "Animation";
    }
    else {
     this.addEventListener(Event.ENTER_FRAME, onAnimation);
     btnAnimation.label = "Stop";
    }

    isAnimation = !isAnimation;
   }

   private function onAnimation(event:Event):void {
    var iconBitmap:BitmapData;
    var newIconBitmap:BitmapData;
    var matrix:Matrix;
    var rectangle:Rectangle;

    degrees += 15;

    if (NativeApplication.supportsDockIcon) {
     iconBitmap = new BitmapData(128, 128, true, 0xFFFFFF);
     newIconBitmap = (new icon128() as BitmapAsset).bitmapData;
     rectangle = new Rectangle(0, 0, 128, 128);
    }
    else if (NativeApplication.supportsSystemTrayIcon) {
     iconBitmap = new BitmapData(16, 16, true, 0xFFFFFF);
     newIconBitmap = (new icon16() as BitmapAsset).bitmapData;
     rectangle = new Rectangle(0, 0, 16, 16);
    }

    setIcon(rotateBitmap(iconBitmap, newIconBitmap,
     iconBitmap.width/2, iconBitmap.height/2, rectangle, degrees));

    if (degrees >== 360) {
     degrees = degrees - 360;
    }
   }

   private function rotateBitmap(iconBitmap:BitmapData, newIconBitmap:BitmapData,
    originX:int, originY:int, rectangle:Rectangle, degrees:int):BitmapData {
    var radian:Number = degrees/180 * Math.PI;
    var matrix:Matrix = new Matrix();
    matrix.rotate(radian);
    matrix.translate(originX-Math.cos(radian)*originX+Math.sin(radian)*originY,
     originY-Math.cos(radian)*originX-Math.sin(radian)*originY);
    iconBitmap.draw(newIconBitmap, matrix, null, null, rectangle);

    return iconBitmap;
   }
  ]]>
 </mx:Script>
 <mx:Button label="Animation" id="btnAnimation" click="onClick(event)"/>
</mx:WindowedApplication>

アプリ起動時の画面は[Animation]ボタンがついているだけの単純な画面です。

[Animation]ボタンのクリックイベントハンドラでは、isAnimationフラグでDockアイコンがアニメーション中か否かを制御しています。アニメーション中でなければenterFrameのイベントハンドラを登録し、ボタンのラベルを[Stop]に変更します。アニメーション中であれば、enterFrameのイベントハンドラを解除し、ボタンのラベルを[Animation]に戻します。

private function onClick(event:MouseEvent):void {
 if (isAnimation) {
  this.removeEventListener(Event.ENTER_FRAME, onAnimation);
  btnAnimation.label = "Animation";
 }
 else {
  this.addEventListener(Event.ENTER_FRAME, onAnimation);
  btnAnimation.label = "Stop";
 }

 isAnimation = !isAnimation;
}

enterFrameイベントが発生すると、onAnimation関数がコールされます。onAnimation関数では画像を回転する処理を行っています。このサンプルでは、毎フレーム15度ずつ回転角を増加させて基準となる画像を回転させています。

前回変形した画像をさらに回転させているわけではなく、毎回基準となる画像に対して処理をしているわけです(この理由については後で説明します)。

degrees += 15;

setIcon関数には、変形元の画像、合成先の画像、基準点、描画領域、回転角などを渡し、ラジアンを求めて、

var radian:Number = degrees/180 * Math.PI;

Matrixオブジェクトを生成し、rotateメソッドで回転時の変換行列を設定します。

var matrix:Matrix = new Matrix();
matrix.rotate(radian);

回転させると画像の中心点の座標が移動しますので、translateメソッドで元の位置に戻します。

matrix.translate(originX-Math.cos(radian)*originX+Math.sin(radian)*originY,
 originY-Math.cos(radian)*originX-Math.sin(radian)*originY);

中心点を平行移動させる値の計算式は以下の通り。

tx=x-ax-cy=64-cos(q)*64-(-sin(q))*64
ty=y-bx-dy=64-sin(q)*64-cos(q)*64

※qの単位はラジアン。詳細はflashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜概要編〜をご参考に。

cos(q)、sin(q)の結果は小数になることもありますので、回転角度によっては誤差が生じます。そうした場合、その加工した画像に対して更に回転をかけることを繰り返すと、画像が崩れていくことがあるのです。これが、変形した画像をさらに回転させず、基準となる画像を1つとし、それに対して処理をしている理由になります。

最後に、回転と平行移動の設定をしたMatrixオブジェクトを利用して画像を加工し、Dockアイコンに設定します。

これを繰り返すと、、、

と言う感じでアニメーションしてるように見えるんです。

ちなみに、今回のサンプルソースでもWindowsのタスクトレイアイコンの回転を実装しています。タスクトレイをサポートしているプラットフォームか判断し、基準となる画像と合成する画像サイズを変更している以外は、Dockアイコンと同じ方法でタスクトレイのアイコンも回転させることが出来ます。

■関連記事へのリンク
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのDockアイコンをカスタマイズする方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンをアニメーションさせる方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜概要編〜
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを縮小/拡大させる方法(2009/2/4追記)

1月
30

flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンをアニメーションさせる方法ではDockアイコンを縦スクロールさせるようなアニメーションを実装しました。今回はDockアイコンが回転するアニメーションに挑戦したいと思います。が、その前に概要をざっくり説明したいと思います。Dockアイコンに使用した画像は前回同様こちらです。

流れ的には、

  1. アプリケーションを起動する。
  2. 画面・Dockアイコンが表示される。
  3. 画面上の[Animation]ボタンをクリックする。
  4. ボタンクリック時にenterFrameイベントのイベントハンドラを登録する。
  5. enterFrameイベントが発生するたびにDockアイコンの画像を変形(回転)させる。
  6. 変形させた画像をDockアイコンに設定する。

と言う感じになります。5、6の処理が繰り返される度に回転角を増加させ画像を加工します。それを入れ替えて、あたかもDockアイコンが回っているかのように見せるのです。

画像の変形には前回同様Matrixクラスを使用します。

Matrix クラスは、2 つの座標空間の間におけるポイントのマッピング方法を決定する変換マトリックス(変換行列)を表します。Matrix オブジェクトのプロパティを設定し、Matrix オブジェクトを Transform オブジェクトの matrix プロパティに適用し、次に Transform オブジェクトを表示オブジェクトの transform プロパティとして適用することで、表示オブジェクトに対する各種グラフィック変換を実行できます。これらの変換機能には、平行移動(x と y の位置変更)、回転、拡大 / 縮小、傾斜などが含まれます。

Matrix – ActionScript 3.0 言語およびコンポーネントリファレンスより引用。

数学的に言うと3×3の変換行列です。詳しくはFN0811001 – 変換行列を数学的に捉える – Flash : テクニカルノートをご参照下さい。

※公認インストラクター、公認デベロッパーでもある野中文雄氏のサイトです。非常に勉強になります。
リファレンスでは以下のように記載されていますが、

誤りです。ただしくは、、、

です。

ここに示されているa、b、c、d、tx、tyを操作することによって、画像を変形(平行移動、回転、拡大 / 縮小、傾斜)することが出来るのです。

また、回転させる場合には、行列の値を以下のように操作します。リファレンスには以下のように記載されていますが、

これも誤りです。正しくは以下の通り。

※qは回転された角度のことですが単位はラジアンです。日常使う、45、90、180、360度ではありません。
※45度回転したときのラジアンは以下の数式で求められます。

q=45/180*π

画像を変形させる際には基準点が必要になります。原点(0, 0)が基準点になります。

原点を基準に45度回転すると以下のようになります。

ですが、このままでは網掛けの部分が描画領域からはみ出ていくことになります。回転角が増えればどんどんはみ出ていって90〜270度の間では完全に見えなくなります。270度を超えると再び現れてきて360度で元の位置に戻ります。このときの任意の座標の平行移動距離がtx、tyになります。はみ出した部分を元に戻すには平行移動した距離tx、tyを引いてあげればよいわけです。
※txはx軸の平行移動距離、tyはy軸の平行移動距離です。

これを行列の乗算で示しますと、以下のようになります。

この数式より、tx、tyが求められます。

tx=x-ax-cy
ty=y-bx-dy

128×128の画像の場合、回転前の画像の中心点は(64, 64)で回転後も同じ位置になればいいわけですから、45度回転させた場合には以下のような数式が成り立ちます。

tx=x-ax-cy=64-cos(45/180*π)*64-(-sin(45/180*π))*64
ty=y-bx-dy=64-sin(45/180*π)*64-cos(45/180*π)*64

※この数式はa、b、c、dの部分を変えれば回転だけではなく、拡大 / 縮小、傾斜にも適用できます。
これをMatrixクラスで実装するには、rotatetranslateメソッドを利用します。

var radian:Number = 45/180*Math.PI;
var matrix = new Matrix();
matrix.rotate(radian);
matrix.translate(
	64-Math.cos(radian)*64-(-Math.sin(radian))*64,
	64-Math.sin(radian)*64-Math.cos(radian)*64);

この理論よりDockアイコンも回転しているように見せることができるのです。

■関連記事へのリンク
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのDockアイコンをカスタマイズする方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンをアニメーションさせる方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜実装編〜(2009/2/3追記)
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを縮小/拡大させる方法(2009/2/4追記)

  • Search:
  • flashcastとは?

    東京を中心に、現在フリーランスとして活動しているITエンジニア、および、かつてフリーランスとして活動していた起業家達が立ち上げたコミュニティーです。

    みんなで集まって面白いことをやろう!形に残そう!ということで、ブログをはじめました。

    技術情報や、フリーエンジニアに役立つ情報などを、ご紹介できたらと思っています。

    お問い合わせ:
    info@flashcast.jp
  • カレンダー

    2010年7月
    日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日
    « 6月    
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • メンバー紹介

    もじゃもじゃ
    flashcastのリーダー

    3年ほどフリーのITエンジニアとして活動。現在は、社員2名の株式会社を経営しています。

    一攫千金を夢見る野心家です。

    ライブキャスト

    yasu
    ダイバー

    自宅サーバーでホームページを作り始めました。

    少しずつ記事を増やしていきますので足を運んでください。

    よろしくお願いします。

    sa-sa-ki.jp

    のら
    たびびと

    ねこ好きに悪人はいなーいっ!!

    バイクや車も好きです。

    めぐ
    デザイナーのたまご

    音楽とデザインとお酒をこよなく愛する永遠のダイエッター。

    現在ペンタブレットでイラストを勉強中。

    Hiro
    コンサル

    PMやSEの案件を業務委託で請けることが多いですが、小規模案件も受託でやっています。

    得意な分野はマイクロソフト製品や関連技術によるシステム構築です。

    KEI
    取締役の風格

    最年少なのに、メンバーで1番の貫禄の持ち主!?

    C#や.netなどサーバ側の開発が得意。

    ろっきー
    美食家★パパ

    自分にとっての息抜きは、ドライブして温泉に入って、美味しいご飯を食べる事。

    ココロとカラダのリフレッシュを大切にし、日々の仕事に励む一児の父親です。

    郵便番号検索

    my-hobby

    とのさま
    げーむのおうさま

    大人なのに好きなことしかやらない駄目人間。

    Web系が得意、アクセスは苦手><

    tonosamart.com

    セクレタリアト
    ギャンブラー

    フリーランス時代は仲間の現場を探すことが多く、それをきっかけに会社を設立。

    現在はSI業に特化せず、他の業種にも興味を持ち始めています。

    メドレー株式会社

  • 広告