Adobe AIR for iOS から スクリーンプリンタ『Rolto ♪』でスマホプリントする方法

![rolto_ane_top.png](https://qiita-image-store.s3.amazonaws.com/0/19029/dde3d759-e9d0-1d11-1fad-7a7414889e21.png)

####• Rolto とは
iPhone (4S/5シリーズ） or iPod Touch（第5世代）に対応した
感熱式(モノクロ)のスクリーンプリンタです。

![スクリーンショット 2014-08-31 11.10.26.png](https://qiita-image-store.s3.amazonaws.com/0/19029/08397364-cf6b-947a-1e1e-ab5f619456a7.png)

販売メーカーはキングジムです。製品については[こちら](http://www.kingjim.co.jp/sp/rolto/)でご確認ください。

####• Rolto SDK for iOS
「ロルト」による印刷機能をアプリに組み込める[ライブラリ](http://www.kingjim.co.jp/support/rolto/sdk)が提供されています。
iOSアプリから直接「ロルト」と連携する事が可能です。
（Objective-C による[開発方法](http://www.iwares.co.jp/blog.html#/detail/40292525)はこちらをご参照ください。）

####• Rolto - 画面をそのままプリント！（専用アプリ）
「Rolto - 画面をそのままプリント！」は、公式の [iOSアプリ](https://itunes.apple.com/jp/app/rolto-hua-mianwosonomamapurinto!/id881841561)です。

iPhoneで見ている画面、カメラ、メール、地図、Evernoteの
データを印刷することができます。

**• 外部アプリからRoltoアプリを呼び出す**
このアプリは、他のiOSアプリから呼び出す事が可能です。
（Rolto SDK for iOSを組み込まなくても Rolto の印刷機能を、
アプリ経由で行うことができます。）

####• AIR for iOS から Rolto を利用する方法

#####•Rolto SDK for iOSを使用
Rolto SDK for iOSは、Objective-Cで記述しているため、
AIR for iOSから利用することはできません。
AIR version.3 から導入された AIRネイティブ拡張機能を使って、
作成する方法があります。
~~しかし、Rolto SDK for iOSの場合、パッケージエラーが
発生してしまうため、利用することができません。~~
**_2014年9月1日にRolto SDK for iOSのバージョンが1.0.1になりました。
1.0.1のライブラリを使う事でパッケージエラーが回避されます。_**
![スクリーンショット 2014-08-31 11.48.51.png](https://qiita-image-store.s3.amazonaws.com/0/19029/807a018a-ef4a-c889-5879-8c82664d6654.png)

#####•外部アプリからRoltoアプリを呼び出す
今回は「外部アプリからRoltoアプリ呼び出す」為の
AIRネイティブ拡張ライブラリを作成しました。

#####1. AIRネイティブ拡張ライブラリのダウンロードとセッティング
こちらから[ライブラリ](http://ane-lab.googlecode.com/svn/trunk/mobile/ios/RoltoClipboard/RoltoClipboardPrintANE/roltoClipboardPrint.ane)をダウンロードします。（ソースは[こちら](https://code.google.com/p/ane-lab/source/browse/#svn%2Ftrunk%2Fmobile%2Fios%2FRoltoClipboard)にあります。)

以下のファイルがダウンロードされます。

| ファイル名 | バージョン | SWFバージョン |名前空間 |
|:-----------|------------:|------------:|-----------:|
| [roltoClipboardPrint.ane](http://ane-lab.googlecode.com/svn/trunk/mobile/ios/RoltoClipboard/RoltoClipboardPrintANE/roltoClipboardPrint.ane)       |        0.0.1 |        13 |        2.5 |

落としたライブラリはANEファイルになります。
ANEファイルを、作成するアプリのライブラリパスに設定します。

#####2. RoltoClipboardPrintについて
ライブラリには1つのクラスが含まれています。
クラスと用意しているメソッド群は以下になります。

クラス名：[net.klaap.rolto.RoltoClipboardPrint.as](https://code.google.com/p/ane-lab/source/browse/trunk/mobile/ios/RoltoClipboard/RoltoClipboardPrintANE/src/net/klaap/rolto/RoltoClipboardPrint.as)

| メソッド | 引数 | 戻り値 | 説明 | 
|:-----------|:------------|:-----------|:------------|
|isUseRolto|なし|Boolean|ロルトの使用有無の判定（[Roltoアプリ](https://itunes.apple.com/jp/app/rolto-hua-mianwosonomamapurinto!/id881841561)がインストール済であること）|
|print|BitmapData|Boolean|印刷処理を行う|
|dispose|なし|なし|RoltoClipboardPrintを破棄します|

#####3. RoltoClipboardPrint使用したサンプルコード

```as3:Main.as
package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;
	
	import net.klaap.rolto.RoltoClipboardPrint;

	[SWF(backgroundColor="#FFFFFF", width="620", height="500", frameRate="30")]
	public class Main extends Sprite
	{
		[Embed(source="assets/image.png")]
    	private var Image:Class;
		private var bitmapData:BitmapData;
		private var bitmap:Bitmap;
		private var bitmapData2:BitmapData;
		private var canvas:Sprite;
		private static var point:Point = new Point();
		private var rolto:RoltoClipboardPrint = new RoltoClipboardPrint();
		private var btn:Sprite;
		private var position:Object = {x: 0, y: 0};
		
		public function Main()
		{
			super();
			Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
			
			// autoOrients をサポート
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			init();
		}
		
		// メソッド
		private function init():void {
			var board:Shape = new Shape();
			board.graphics.beginFill(0x005500);
			board.graphics.drawRect(10, 50, 600, 400);
			board.graphics.endFill();
			addChild(board);
			var base:Shape = new Shape();
			base.graphics.beginFill(0x996633);
			base.graphics.drawRect(10, 450, 600, 20);
			base.graphics.endFill();
			addChild(base);
			bitmapData = new BitmapData(400, 400, true, 0x00000000);
			bitmap = new Bitmap(bitmapData);
			addChild(bitmap);
			bitmap.x = 110;
			bitmap.y = 50;
			
			var image:Bitmap = new Image();
			var bd:BitmapData = image.bitmapData;
			var seed:uint = uint(Math.random()*10000);
			bitmapData.lock();
			bitmapData.pixelDissolve(bd, bd.rect, point, seed, 400*400*0.4);
			bitmapData.unlock();
			
			canvas = new Sprite();
			bitmapData2 = new BitmapData(610, 440, true, 0x00000000);
			var bitmap:Bitmap = new Bitmap(bitmapData2);
			addChild(bitmap);
			
			stage.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
			createPrintButton();
		}
		
		private function press(evt:MouseEvent):void {
			stage.removeEventListener(MouseEvent.MOUSE_DOWN, press);
			stage.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
			position.x = stage.mouseX;
			position.y = stage.mouseY;
			addEventListener(Event.ENTER_FRAME, update, false, 0, true);
		}
		private function release(evt:Event):void {
			stage.removeEventListener(MouseEvent.MOUSE_UP, release);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
			removeEventListener(Event.ENTER_FRAME, update);
			canvas.graphics.clear();
		}
		private function update(evt:Event):void {
			var px:Number = stage.mouseX;
			var py:Number = stage.mouseY;
			canvas.graphics.lineStyle(10, 0xFFFFFF);
			canvas.graphics.moveTo(position.x, position.y);
			canvas.graphics.lineTo(px, py);
			position.x = px;
			position.y = py;
			bitmapData2.lock();
			bitmapData2.draw(canvas);
			bitmapData2.pixelDissolve(bitmapData2, bitmapData2.rect, point, 0, 600*400*0.4);
			bitmapData2.threshold(bitmapData2, bitmapData2.rect, point, ">", 0x00000000, 0xffffffff, 0x00FFFFFF);
			bitmapData2.unlock();
		}
		
		private function createPrintButton():void {
			// button
			btn = new Sprite();
			btn.buttonMode = true
			btn.graphics.lineStyle(1, 0xBBBBBB);
			btn.graphics.beginFill(0xEEEEEE);
			btn.graphics.drawRoundRect(0, 0, 240, 100, 10, 10);
			btn.x = 200;            
			btn.y = 550;            
			addChild(btn);
			
			var field:TextField = new TextField();
			var format:TextFormat = new TextFormat();
			format.size = 45;
			field.defaultTextFormat = format;
			field.x = 65;
			field.y = 25;
			
			field.htmlText = "<p align='center'><font face='_sans'>Print</span></p>";
			btn.addChild(field);
			
			btn.addEventListener(MouseEvent.MOUSE_UP, onPrint);
		}
		
		private function onPrint(event:MouseEvent):void
		{	
			
			var bitmapData:BitmapData = new BitmapData(620, 500);
			bitmapData.draw(this);
			
			// ロルト使用有無の確認
			if (rolto.isUseRolto()) {
				// ロルトのプリント実行
				rolto.print(bitmapData);
			}
		}
	}
}

```
[ひろゆき](https://twitter.com/ProjectNya)@[にゃあプロジェクト](http://blog.project-nya.jp/)様のご好意により、ソースを9割5分、
拝借させていただきました。

[[AS3.0] 黒板とチョーク (1)](http://blog.project-nya.jp/1812)
[[AS3.0] 黒板とチョーク (2)](http://blog.project-nya.jp/1813)

サンプルアプリの[動画](https://www.youtube.com/watch?v=vX0CtI4OMxw)も公開しております。

![デモ動画](http://klaap.net/img/anime_r.gif)

####• 最後に
このライブラリや公開しているソースについての
動作保証やトラブルが発生した場合による保証は致しかねます。
ご了承ください。

ライブラリの動作や使用方法について、質問がありましたら、
[私宛](https://twitter.com/tokufxug)にご連絡してもらえれば、もしかしたら回答させていただくことがあるかもしれませんが、
ないかもしれません。ご了承ください。