サービスのテスト中に、十分な量のフィードバックが収集され、アプリケーションにファイルをダウンロードする昔ながらの方法は持ち越されません。 人々はドラッグアンドドロップを望み、デスクトップから直接写真をドラッグアンドドロップしようとしました。 このアプリケーションはブラウザ画面全体を占有し、フラッシュに書き込まれているため、問題を直接解決する方法はありませんでした。
考えてグーグルで調べた後、少なくとも次のようにD&Dを次のように実装することにしました。
ユーザーがアプリケーションでタブから切り替えると、つまり フォーカスを失い、ドロップされたファイルをキャッチするイベントがハングするフラッシュドライブの上にdivが重ねられます。
次に、ExternalInterfaceを介して、ByteArray形式のイメージがフラッシュに転送され、そこでデコードおよび表示されます。
フラッシュにdivを表示#over_holder_full { background-color: #eee; opacity: 0.6; position: absolute; width: 100%; height: 100%; z-index: 7; display: none; } #flash_conainer { width: 100%; height: 100%; position: absolute; z-index: 0; } <div id="over_holder_full"></div> <div id="flash_conainer"> <div id="myContent"> <h1>Alternative content</h1> </div> </div>
ドラッグアンドドロップがマウントされているフォーカスが失われたときに#over_holder_fullを表示します
window.addEventListener('blur', function() { fullDragArea.style.display = "block"; console.log("not focused"); }); window.addEventListener('focus', function() { fullDragArea.style.display = "none"; console.log("focus"); });
#over_holder_fullによってドロップされたファイルをキャッチ fullDragArea = $id("over_holder_full");
フラッシュ画像転送
JavaScriptとFlashをバインドする関数
function setImage(pageX, pageY, int32Arr) { if (swfReady){ var res = []; for (var i = 0; i < int32Arr.length; i++) { res[i] = int32Arr[i];
フラッシュ側で画像を受け入れます
var exManager:EXManager = new EXManager(); exManager.setImageCallback = function(pageX:Number, pageY:Number, listBytes:Array):void{ var ba:ByteArray = new ByteArray(); for(var i:int = 0; i<listBytes.length; i++){ ba.writeInt(listBytes[i]);
ソースは
ここからダウンロードでき
ます注:この例は、JPG拡張子の画像でのみ機能しますが、他の形式に簡単に拡張できます。
wmode:opaqueプロパティは、その上にdivを表示するために必要であるため、フラッシュドライブのスクロールは機能しません。 解決策があれば、私はそれらを聞いてうれしいです。
この例を実行するには、少なくともローカルサーバーに配置する必要があります。
更新:提案されているように、mouseWheelイベントでグリッチを克服するには、次をjsに追加する必要があります。
function wheel(event){ var delta = 0; if (!event) event = window.event;
また、フラッシュに追加します。
private function externalMouseWheelHandler(delta:int):void { var globalPoint:Point = new Point(stage.mouseX, stage.mouseY); var objects:Array = stage.getObjectsUnderPoint(globalPoint); if (!objects || !objects.length) { return; } var target:DisplayObject = objects[objects.length - 1] as DisplayObject; if (!target) { return; } target = (target is InteractiveObject) ? target : target.parent; if (!target) { return; } var localPoint:Point = target.globalToLocal(globalPoint); var mouseEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL); mouseEvent.localX = localPoint.x; mouseEvent.localY = localPoint.y; mouseEvent.delta = delta; target.dispatchEvent(mouseEvent); }
アップデート2:いくつかの実験の後、データを分割して転送すること、および
getInt8
ではなく
getInt8
介してバッファーから読み取る方が良いことが明らかになりました。 最初のケースで想定されているように、ファイル長は必ずしも4の倍数ではありません。
Javascript function setImage(bufer) { if (swfReady){ var dataview = new DataView(bufer); var byteLength = bufer.byteLength;
ActionScript _exManager.sendDataStartCb = function(pageX:Number, pageY:Number, fileName:String):void { prevtime = getTimer(); }; _exManager.sendDataCb = function(listBytes:Array):void { for (var i:int = 0; i < listBytes.length; i++) { ba.writeByte(listBytes[i]);