Megu's Design

Megu's Design

アメブロデザイン変更用。
CSSを使ってトータルカスタマイズしてます。

現在エステブログ用デザインです。

CSS
flex AIR
Android
スマホサイトデザイン

などなど


Amebaでブログを始めよう!
開発環境:Flash Builder4.5

クリック時は画像選択、ドラッグ&ドロップ時は画像の入れ替え処理という風に制御します。

ドラッグ&ドロップはPCではふつーの処理なんだけど、PC上でマウス使ってやるようにAndroidでは指を使ってやると同じようには行かない!?
たとえば、ドラッグを開始するのをマウスDOWN時やMOVE時にやってたらCLICKとの使い分けが出来なくなったり、MOVEイベントのリスナーがあるオブジェクトの上を通るときにまた処理が行われたり。
でもイベントがどんな風に送出されるかを理解してたら、PCでもAndroidでもわざわざマウスイベントとタッチイベントで使い分けなくてもマウスイベントでうまく処理が出来たよ。

ちなみにタッチイベントでもなんとなく出来るんだけど、ドラッグ中の画像が移動している状態の表示とかがうまくいかない。
私がこの辺理解してないからなんだろうけど、みんなどうしてんのかな?
Andoroidではドラッグ&ドロップがタブーとして行われてないのか・・・?
しかーし、マウスイベントを使うと、DragManagerのdoDragメソッドでドラッグ中の画像処理からDropした後の処理まで自動でやってくれちゃうのです。
だから今回はマウスイベントにこだわったのだ。

作成の手順としては
 1.画像をおくオブジェクトを設置
 2.オブジェクトにリスナー作成(initなどで)
 3.リスナーがイベントを受けて実行するメソッド作成
というだけ、とってもシンプル!

1.今回作ったオブジェクトはGroupに囲われたBitmapImageです。
 Groupはspark.componentsに
 BitmapImageの方はspark.primitivesにあります。
 それぞれにIDでimgGroup1、img1という風に同じ番号を振りました。

2.まずはイベントリスナーがいるよ!

 mxmlを読み込んだときに処理してくれるinitなどで、イベントを受けるオブジェクトにリスナーを作成します。
 リスナーはイベントの受け口みたいなもの。
 clickとかだと、タグの中にイベントを直に書いたりもするけど、今回はイベントの動作を制御したいのでリスナーを作るよー。
 ちなみにリスナーはBitmapImageオブジェクトじゃなくてGroupの方に設定。

imgGroup1.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
imgGroup1.addEventListener(DragEvent.DRAG_ENTER, onEnter);
imgGroup1.addEventListener(DragEvent.DRAG_DROP, onDrop);
    :
    ※オブジェクト分だけ作る

3.マウスダウンしたときのメソッドを作る

 リスナーがMOUSE_DOWNイベント受け取ったら実行するメソッドを作成します。
 メソッドでは以下のような処理を行う。
  ①イベントを受け取ったオブジェクトのid番号を取得。
   ※あらかじめメソッド間で共有できる変数を宣言して置いてください。
  ②次にくるイベントのリスナーを作成。
   ドラッグを始めるためのROLL_OUTのリスナーと
   クリック処理の場合のCLICKのリスナーを作ります。
   オブジェクトの参照はthis['オブジェクトのID番号なし'+イベントを受け取ったオブジェクトのID番号]で参照可能。

public function onDown(e:MouseEvent):void {
idDragPoint = String(e.currentTarget.id).substr(-1);
this['imgGroup'+idDragPoint].addEventListener(MouseEvent.ROLL_OUT, onDrag);
this['imgGroup'+idDragPoint].addEventListener(MouseEvent.CLICK, imgClick);
}

4.ドラッグを開始するメソッドを作る

 3のマウスダウンした後に受け取るイベントで、ドラッグを開始するためのメソッドを作成します。

 public function onDrag(e:MouseEvent):void {
  //ドラッグを開始するコンポーネントを設定
  var dragInitiator:Group = Group(e.currentTarget);
  //ドラッグを開始
  DragManager.doDrag(dragInitiator, new DragSource(), e);
  //ROLL_OUTのリスナーを削除
  this['imgC'+drag_drop_local].removeEventListener(MouseEvent.ROLL_OUT, onDrag);
 }

5.ドラッグを受け取る体制にする。

 4でドラッグが開始され、ドラッグのイベントが送出されます。
 つまり、ドラッグしていく先にそれを受け取るコンポーネントがあるはずで、そのコンポーネント上でドラッグイベントを受け取るリスナーが待ち構えてます。
 ドラッグイベントのDRAG_ENTERを受け取ったとき、次にくるDRAG_DROPを受け入れることが出来る状態にするメソッドです。
 これにより、ドラッグ&ドロップができるコンポーネントを限定することが出来ます。

 public function onEnter(e:DragEvent):void {
  if (e.currentTarget is Group) {
   DragManager.acceptDragDrop(IUIComponent(e.target));
  }
 }

6.ドロップされたとき、画像を入れ替えるメソッドを呼び出し

 ドラッグイベントのDRAG_DROPを受け取って、画像を入れ替える処理を実行します。

 public function onDrop(e:DragEvent):void {
  //画像を入れ替えるメソッドを呼び出し
  changeImageBox(idDragPoint, String(e.currentTarget.id).substr(-1));
 }

7.あとはクリックしたときに画像を選ぶメソッドと、画像を入れ替えるメソッドを作成すれば、それぞれの処理がクリック時、ドラッグ&ドロップ時に正しく実行されます。
FlexでAndroid向け開発の情報って少ない。
Adobeがサポートやめるとかやめないとか、結局どうなってんのかしら?
でも、せっかく出来たこともったいないから、自分でBLOGるぞ!

今回はAndroidの基本動作、タッチイベントを制する!
制するっても、TapとTouch&Dragの動きですが・・・。
目が皿になるくらいAdobeのサポートサイトを読んでだいぶわかってきたぞー。
参考URL:http://help.adobe.com/ja_JP/as3/dev/WSb2ba3b1aad8a27b0-6ffb37601221e58cc29-8000.html

1.タッチイベントとマウスイベントってどうちがうの?
 Adobeのサイトにはタッチイベント送出と同時にマウスイベント送出されてるって書いてある。
 つまり、タッチイベントの動きとマウスイベントの動きってほぼ一緒ってこと?
 そして、わざわざタッチイベントで受けなくてもマウスイベントで十分ってことやん?
 かつ、AndroidではDrag&Dropはサポートされてないとか書いてある!?
 つまり、タッチイベントではドラッグ&ドロップできないってことなんですかね?

 そんなふうに思ったのも私が業務用のアプリを作ってるだけで、いわゆるマルチタッチやらジェスチャやらていう動作を特に必要としてないからなんだけど・・・。
 それでもイベント処理むつかしー。

 で、作ってるアプリの元となるAIR用(PC用)では当然のことながら、マウスイベントのROLL_OUTでドラッグを開始していた。
 だけど、それをそのままAndroid版に移植したらなんかびみょーな動きする!
 試行錯誤しましたが、結局私がイベントの動きが分かってなかっただけなのです~。

2.イベントタイプいーろいろ
 マウスにしろタッチにしろ、イベントが発生する順番があって、これがイベントタイプで設定されている。
 でも、このイベントタイプについて説明してくれてるところがなかなか見つからなくて、とても悩みました。
 そしたらとっても分かりやすく説明してくれてるサイトがあったよ。
 http://level0.kayac.com/#!2011/02/air_for_android_2.php

 このサイトを参考に、今回ドラッグ&ドロップでやりたい画像の入れ変えについて整理してみた。

 ①画像1でタッチ(マウスボタンを押下)したとき
  Begin(Down)→End(Up)→Move…→RollOver→Over→Move
 ②画像1から離れるとき(ドラッグ)
  OUT→RollOut
 ③画像2にきたとき(ドラッグしたままポイントが合う)
  Move→RollOver→Over→Move
 ④画像2から離れたとき(マウスボタンを離したとき)
  End(Up)→Out→RollOut

 また、①の直後すぐに離したとき(TAPやClickの動作)
  End(Up)→Tap(Click)

 これによって、タップしたときは写真を選択する処理を行い、ドラッグ時にはドラッグ処理を行うという動作を使い分けることが出来ました。

 つまり、
 Begin(Down)→End(Up)→Moveのときはドラッグを開始
 Begin(Down)→End(Up)→Tap(Click)のときは写真選択
 という具合です。

 うんちくこのくらいにして実際のソースを見てみましょう♪

処理ごとに分けて詳しく見ていくよ!
 
Linuxでは標準?で使われてるrsyncを使って、Windowsから差分バックアップをとる。
今まで月単位でbackupしていたものをCDには焼いていたが、うっかりディレクトリごと削除してしまうようなことが運用で発生した場合のため、差分で毎日のバックアップを行うことに。

参考にしたサイト
http://fedorasrv.com/backup.shtml


手順:
1.cwrsyncをWindows端末にインストール

2.いきなりバッチを作らずにコマンドベースでテストしてみた。

2-0.適当な場所にfromフォルダとtoフォルダ作成
   fromフォルダにtextファイルなどを置く
 2-1.コマンドプロンプトにて、インストール先\binへ移動
 2-2.>rsync -avz from/ to でENTER
2-3.toフォルダにfromのtextがコピーされていることを確認
 2-4.fromフォルダにファイルを追加してみる
 2-5.toフォルダに追加したファイルがbackupされていることを確認

3.バッチを作る

 3-1.cwrsyncのインストールフォルダのcwrsync.cmdをコピーしてどっかに移動
 3-2.一番下の行に、下記を追加
  USERはサーバーのユーザ名
  SERVERはサーバーのドメインかIPアドレス
 ----------------------
  SET USER=xxxxx
  SET SERVER=xxxxxxxxx
  rsync -avz %USER%@%SERVER%:xxxxx(バックアップ元) (バックアップ先) > cwrsync.log
 ----------------------
 3-3.バッチをコマンドプロンプトから実行してみる
  >cwrsync.cmd でENTER
 3-4.パスワードを聞かれるので入力してENTER
 3-5.ローカルにファイルがバックアップされてたらオッケー

4.パスワードを入力せずにバッチを実行させる

 4-1.sshを公開鍵/秘密鍵セットで作ります。
 4-2.コマンドプロンプトでcwrsyncのインストール先の\binへ移動
 4-3.>ssh-keygen -t rsa -N "" でENTER
 4-4.sshを格納するローカルのディレクトリを聞かれます。
  私が使ってるcwrsyncのバージョンでは
  /cygdrive/c/Documents and Settings/ユーザ名/.ssh/id_rsa
  がデフォルトでしたが、今回はWindows7だったので、
  /cygdrive/c/Users/ユーザ名/.ssh/id_rsa
  と入力してENTER
 4-5.id_rsaがローカル用の秘密鍵、id_rsa.pubがサーバーに公開鍵です。
  sshが作成されているのを確認したら、id_rsa.pubをサーバーにおきます。
 4-6.viでコピーしようと思ったのですが、文字化けしたりしてややこしかったのでFTPで転送
  ※ファイル名は.pubなど拡張子がないものに変えてます。
 4-6.telnetにて、sshの所有者を変更
  # chown ユーザ名
 4-7.sshのパーミッション変更
  # chmod 600 sshファイル名
 4-8.バッチにオプション-e ssh を追加
  rsync -avz -e ssh %USER%@%SERVER%:xxxxx(バックアップ元) (バックアップ先) > cwrsync.log
 4-9.コマンドプロンプトでバッチを実行して、パスワードが聞かれずバックアップできてたらOK!

5.ログにエラー出力も取得できるようにする

 > cwrsync.log でバッチの実行結果がログファイルに出力されているけど、エラーの出力が取れてないので2>&1を追加。ついでに追加出力するように変更。

  rsync -avz -e ssh %USER%@%SERVER%:xxxxx(バックアップ元) (バックアップ先) >> cwrsync.log 2>&1

6.その他のオプションも追加

 --delete 削除されているファイルはバックアップ先も削除
 --iconv=CP932,utf8 日本語のファイル名を文字コード変換
 --exclude="temp/" tempフォルダは無視

  rsync -avz -e ssh --delete --iconv=CP932,utf8 --exclude="temp/" %USER%@%SERVER%:xxxxx(バックアップ元) (バックアップ先) >> cwrsync.log 2>&1

 文字コード変換はうまくいってません。
 なんだかんだでLinuxのサーバーに日本語名のファイルがあることがおかしいてことになって、日本語名のファイルがなくなりました・・・。
 今回はいいけど、また今度することあったら文字コードやっぱわかってないとだめだなぁ。

 文字コードの参考URL:
 http://d.hatena.ne.jp/takuya_1st/20100511/1273588133

 ファイルを無視する方法:
 http://www.itmedia.co.jp/enterprise/articles/0804/21/news013_2.html