Я новичок в кодировании, особенно в ActionScript 3.0 и Adobe Animate.
Я пытаюсь на практике разработать для Android-смартфонов простое приложение для камеры, позволяющее снимать и сохранять фотографии.
Основная проблема - правильная альбомно-портретная ориентация «фотоконтейнера» на экране мобильного телефона. Таким образом, при вращении смартфона (портрет-пейзаж) «фото-контейнер» исчезает с экрана смартфона. Очевидно, свойства x и y выходят за пределы экрана. Я пробовал много разных подходов, но мне чего-то не хватает: (
Есть ли где-нибудь ясное решение, которое я мог бы изучить, чтобы понять, что я делаю неправильно? Например, пример кода для изучения для «reverse»-инженерные "цели, чтобы помочь мне понять, как работает ориентация камеры?
(Еще одна большая проблема - это" разрешения ", но, во всяком случае, я не смею начать с этого, прежде чем понять, как работает ориентация ...)
Я очень расстроен и разочарован, и я не знаю, что делать, потому что, похоже, в Интернете не так много ресурсов о ActionScript 3.0, и когда я что-то нахожу, это действительно устарело!
Большое спасибо за каждый тип справки или руководства.
PS: похоже, что в AIR изначально присутствует ошибка, поскольку ориентация изображения по умолчанию на экране, в то время как вкнижная / горизонтальная позиция повернута на 90 градусов против часовой стрелки (!)
Пока мой код:
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.StageAspectRatio;
import flash.system.Capabilities;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.display.MovieClip;
import flash.events.StageOrientationEvent;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;
import flash.events.GestureEvent;
import flash.events.MouseEvent;
import flash.media.Camera;
import flash.events.TouchEvent;
import flash.display.BitmapData;
import flash.media.CameraRoll;
import flash.media.Video;
import flash.sensors.Geolocation;
import flash.events.StatusEvent;
import flash.net.URLRequest;
//basic UI
var headerr:MovieClip;
var footerr:MovieClip;
var backgroundd:MovieClip;
var consolee:TextField;
var consoleFormat:TextFormat = new TextFormat;
var photoContainer:MovieClip;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
//////////////////// START //////////////////////////
var camera:Camera;
var video:Video;
var cameraBitmapData:BitmapData;
var cameraBitmap:Bitmap;
function setCamera():void {
camera = Camera.getCamera();
camera.setMode(800, 600, 24); // background.width, background.height
video = new Video(800, 600); // background.width, background.height
cameraBitmapData = new BitmapData(800, 600, false, 0xFFFFFF);
cameraBitmap = new Bitmap(cameraBitmapData);
video.attachCamera(camera);
photoContainer.addChild(cameraBitmap);
stage.removeEventListener(Event.ENTER_FRAME, loop);
stage.addEventListener(Event.ENTER_FRAME, loop);
}
function loop(e:Event):void {
if (video && cameraBitmapData) {
cameraBitmapData.draw(video, null, null, null, null, true)};
}
//-----------------------------------------------------
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
//tap anywhere on STAGE to shoot & save an image
stage.addEventListener(TouchEvent.TOUCH_TAP, saveImage);
function saveImage(event:TouchEvent):void {
var capture = new BitmapData(background.width, background.height);
capture.draw(video);
var cameraRoll = new CameraRoll();
cameraRoll.addBitmapData(capture);
}
///////////////////// END///////////////////////////////////////
this.stage.addEventListener(Event.RESIZE, adjustAppLayout);
function adjustAppLayout(e:Event):void {
header.width = stage.stageWidth;
header.height = stage.stageHeight*0.10;
footer.width = stage.stageWidth;
footer.height = stage.stageHeight*0.02;
footer.y = stage.stageHeight-footer.height;
background.width = stage.stageWidth;
background.height = stage.stageHeight-footer.height-header.height;
background.y = header.height;
consoleFormat.size = stage.stageHeight*0.03;
console.defaultTextFormat = consoleFormat;
console.width = stage.stageWidth;
console.height = background.height - 20;
console.y = header.height + 10;
photoContainer.scaleX = 1;
photoContainer.scaleY = 1;
photoContainer.y = header.height;
photoContainer.x = 0; //<--------- header.width
setCamera();
}
stage.autoOrients = true;
stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onChange);
function onChange(event:StageOrientationEvent):void {
console.appendText(event.afterOrientation + "\n");
/*
if (event.afterOrientation==StageOrientation.DEFAULT) {
photoContainer.rotation=90;
photoContainer.x=800;
photoContainer.y=0;
} else if (event.afterOrientation==StageOrientation.ROTATED_RIGHT) {
photoContainer.rotation=0;
photoContainer.x=0;
photoContainer.y=0;
} else if (event.afterOrientation==StageOrientation.ROTATED_LEFT) {
photoContainer.rotation=-90;
photoContainer.x=0;
photoContainer.y=600;
}
*/
switch (event.afterOrientation) {
case StageOrientation.DEFAULT:
// re-orient display objects based on the default/correct-side-up orientation.
photoContainer.rotation = 90;
//photoContainer.scaleX = 1;
//photoContainer.scaleY = 1;
photoContainer.x = header.width;
photoContainer.y = header.height;
break;
case StageOrientation.ROTATED_RIGHT:
// Re-orient display objects based on right-hand orientation.
photoContainer.rotation = 360;
//photoContainer.scaleX = 1;
//photoContainer.scaleY = 1;
photoContainer.x = 0;
photoContainer.y = console.height;
break;
case StageOrientation.ROTATED_LEFT:
// Re-orient display objects based on left-hand orientation.
photoContainer.rotation = 0;
//photoContainer.scaleX = 1;
//photoContainer.scaleY = 1;
photoContainer.x = 0;
photoContainer.y = console.height;
break;
/*
case StageOrientation.UPSIDE_DOWN:
// Re-orient display objects based on upside-down orientation.
photoContainer.rotation = 360;
photoContainer.scaleX = 1;
photoContainer.scaleY = 1;
photoContainer.x = console.width;
photoContainer.y = console.height + 10;
break;
*/
}
}
Обновленный кодЗа ним следует (включает кнопку спуска затвора для камеры, функцию геолокации с соответствующей кнопкой, а также некоторую обратную связь датчиков на консоли на экране) с немного лучшим результатом, но все жеОтнюдь не идеально, что касается поворота / ориентации фотоконтейнера на экране смартфона:
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.StageAspectRatio;
import flash.system.Capabilities;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.display.MovieClip;
import flash.events.StageOrientationEvent;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;
import flash.events.GestureEvent;
import flash.events.MouseEvent;
import flash.media.Camera;
import flash.events.TouchEvent;
import flash.display.BitmapData;
import flash.media.CameraRoll;
import flash.media.Video;
import flash.sensors.Geolocation;
import flash.events.StatusEvent;
import flash.net.URLRequest;
var headerr:MovieClip;
var footerr:MovieClip;
var backgroundd:MovieClip;
var consolee:TextField;
var consoleFormat:TextFormat = new TextFormat;
//=====================================================
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
//////////////////// START //////////////////////////
var camera:Camera;
var video:Video;
var cameraBitmapData:BitmapData;
var cameraBitmap:Bitmap;
function setCamera():void {
camera = Camera.getCamera();
camera.setMode(800,600, 24);
video = new Video(800, 600);
cameraBitmapData = new BitmapData(800, 600, false, 0xFFFFFF);
cameraBitmap = new Bitmap(cameraBitmapData);
video.attachCamera(camera);
photoContainer.addChild(cameraBitmap);
stage.removeEventListener(Event.ENTER_FRAME, loop);
stage.addEventListener(Event.ENTER_FRAME, loop);
}
function loop(e:Event):void {
if (video && cameraBitmapData) {
cameraBitmapData.draw(video, null, null, null, null, true)};
}
//-----------------------------------------------------
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
////tapping on shutter button
shutter_btn.addEventListener(TouchEvent.TOUCH_BEGIN, interaction_feedback);
//dim button
function interaction_feedback(event:TouchEvent):void {
shutter_btn.alpha -=0.5;
}
//shoot & save an image
shutter_btn.addEventListener(TouchEvent.TOUCH_TAP, saveImage);
function saveImage(event:TouchEvent):void {
var capture = new BitmapData(800, 600); //background.width, background.height same?
capture.draw(video);
var cameraRoll = new CameraRoll();
cameraRoll.addBitmapData(capture);
}
//light-back button
shutter_btn.addEventListener(TouchEvent.TOUCH_END, interaction_feedbackEnd);
function interaction_feedbackEnd(event:TouchEvent):void {
shutter_btn.alpha = 1;
}
//---------------------------------------------------------
///// GPS
if(Geolocation.isSupported){
var geoloc = new Geolocation();
geoloc.addEventListener(GeolocationEvent.UPDATE, onUpdate);
}
function onUpdate(e:GeolocationEvent):void {
console.appendText("latitude: " + e.latitude + "\n");
console.appendText("longitude: " + e.longitude + "\n");
console.appendText("altitude: " + e.altitude + "\n");
console.appendText("horizontal accuracy: " + e.horizontalAccuracy + "\n");
console.appendText("vertical accuracy: " + e.verticalAccuracy + "\n");
console.appendText("heading: " + e.heading + "\n");
console.appendText("speed: " + e.speed + "\n");
console.appendText("timestamp: " + e.timestamp + "\n");
geoloc.removeEventListener(GeolocationEvent.UPDATE, onUpdate);
var longitude = e.longitude;
var latitude = e.latitude;
nav_btn.addEventListener(MouseEvent.CLICK, navClick);
var navigate:URLRequest = new URLRequest( "http://maps.google.com/?q=" + String(latitude) + ", " + String(longitude) );
function navClick(event:MouseEvent):void {
navigateToURL(navigate);
}
}
///////////////////// END///////////////////////////////////////
this.stage.addEventListener(Event.RESIZE, adjustAppLayout);
function adjustAppLayout(e:Event):void {
header.width = stage.stageWidth;
header.height = stage.stageHeight*0.10;
footer.width = stage.stageWidth;
footer.height = stage.stageHeight*0.02;
footer.y = stage.stageHeight-footer.height;
background.width = stage.stageWidth;
background.height = stage.stageHeight-footer.height-header.height;
background.y = header.height;
consoleFormat.size = stage.stageHeight*0.03;
console.defaultTextFormat = consoleFormat;
console.width = stage.stageWidth;
console.height = background.height - 20;
console.y = header.height + 10;
shutter_btn.x = stage.stageWidth / 2;
shutter_btn.y = stage.stageHeight-footer.height-75;
nav_btn.x = stage.stageWidth / 2;
nav_btn.y = stage.stageHeight-background.height-50;
photoContainer.scaleX = 1;
photoContainer.scaleY = 1;
photoContainer.y = header.height;
}
stage.autoOrients = true;
stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onChange);
setCamera();
function onChange(event:StageOrientationEvent):void {
console.appendText(event.afterOrientation + "\n");
if (event.afterOrientation==StageOrientation.DEFAULT) {
photoContainer.rotation=90;
photoContainer.x = photoContainer.width;
photoContainer.y = photoContainer.height;
} else if (event.afterOrientation==StageOrientation.ROTATED_RIGHT) {
photoContainer.rotation=0;
photoContainer.x=0;
photoContainer.y=0;
} else if (event.afterOrientation==StageOrientation.ROTATED_LEFT) {
photoContainer.rotation=0;
photoContainer.x=0;
photoContainer.y=0;
}
}
//myChecks
console.appendText("screenDPI: " + Capabilities.screenDPI + "\n");
console.appendText("screenResolutionX: " + Capabilities.screenResolutionX + "\n");
console.appendText("screenResolutionY: " + Capabilities.screenResolutionY + "\n");
console.appendText("Camera: " + Camera.isSupported + "\n");
console.appendText("CameraUI: " + CameraUI.isSupported + "\n");
console.appendText("Microphone: " + Microphone.isSupported + "\n");
Мозговой штурм приветствуется! Спасибо