PDA

Просмотр полной версии : подгонка изображения под размеры окна с сохранением пропорций.


Visors
08.09.2017, 12:58
Добрый день.
Помогите решить проблему.

Файл флэша загружает фотографию по названию из той папки, в которой он сам располагается.
Но он очень странно ее отображает - не растягивает по размерам окна с сохранением пропорций, а выводит части рисунка - за границы окна.

Подскажите - как заставить флэш - подгонять отображение фотографии - под размеры окна, с сохранением пропорций ?
(может быть нужно какую-то опцию включить?)

ZackMercury
08.09.2017, 14:55
Нужно написать код, который будет масштабировать картинку под размеры окна.

Visors
08.09.2017, 16:43
ZackMercury, сейчас код выглядит так:

import flash.net.URLRequest;
import flash.display.Loader;

var loader:Loader = new Loader();
loader.load(new URLRequest("file.png"));
addChild(loader);


Что именно в него надо добавить, чтобы картинка масштабировалась под размеры окна ?

undefined
08.09.2017, 16:56
Делать ПОСЛЕ загрузки

var scale:Number=Math.min(windowWidth/loader.width),windowHeight/loader.height);
loader.scaleX=loader.scaleY=scale;

ZackMercury
08.09.2017, 17:41
Я почему-то уверен, что ТС добавит этот код после loader.load :)

Visors
08.09.2017, 17:54
undefined, что-то не работает.
Код выглядит так:

import flash.net.URLRequest;
import flash.display.Loader;

var loader:Loader = new Loader();
loader.load(new URLRequest("file.png"));
var scale:Number=Math.min(windowWidth/loader.width),windowHeight/loader.height);
loader.scaleX=loader.scaleY=scale;
addChild(loader);


также пробовал другое расположение строчки кода:

import flash.net.URLRequest;
import flash.display.Loader;

var loader:Loader = new Loader();
loader.load(new URLRequest("file.png"));
addChild(loader);

var scale:Number=Math.min(windowWidth/loader.width),windowHeight/loader.height);
loader.scaleX=loader.scaleY=scale;



import flash.net.URLRequest;
import flash.display.Loader;

var loader:Loader = new Loader();
var scale:Number=Math.min(windowWidth/loader.width),windowHeight/loader.height);

loader.load(new URLRequest("file.png"));

addChild(loader);
loader.scaleX=loader.scaleY=scale;

Почему-то не работает ни в том, ни в другом случае, ни в третьем случае.

undefined
08.09.2017, 18:04
Я почему-то уверен, что ТС добавит этот код после loader.load :)

Как в воду глядел

Добавлено через 16 минут
Visors, ты замечал что в интернете все грузится не моментально?

Visors
08.09.2017, 18:45
undefined, насчет того, что в интернете все грузится не моментально - не совсем понял что вы имеете ввиду.
Да в интернете грузится не моментально - но все же грузится.
Здесь ничего не грузится, картинка не загружается и через минуту.

При нажатии Ctrl+Enter во всех трех вариантах выдается ошибка "1086: Синтаксическая ошибка: ожидается точка с запятой перед div."

undefined
08.09.2017, 18:55
Visors,я специально написал что выставлять размеры картинке надо ПОСЛЕ ОКОНЧАНИЯ ЕЕ ЗАГРУЗКИ.

var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
addChild(loader);
loader.load(new URLRequest("1.jpg"));
//тут загрузка только началась!
function onComplete(e:Event):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
//загрузка окончена!
}
"1086: Синтаксическая ошибка: ожидается точка с запятой перед div."
Что за div?Очевидно ошибка в твоем коде.Покупать flash ide ради этого я не буду.

Visors
08.09.2017, 19:11
undefined, вел только этот этот код (больше ничего) в пустой файл fla и добавил код масштабирования рисунка (после загрузки).

var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
addChild(loader);
loader.load(new URLRequest("1.jpg"));
//тут загрузка только началась!
function onComplete(e:Event):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
//загрузка окончена!
}
var scale:Number=Math.min(windowWidth/loader.width),windowHeight/loader.height);
loader.scaleX=loader.scaleY=scale;


Не работает - картинку не загружает (ни моментально, ни через минуту)

undefined
08.09.2017, 19:26
думаю так понятнее

var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
addChild(loader);
loader.load(new URLRequest("1.jpg"));
//тут загрузка только началась!
//тут ты просто описываешь функцию ее код не выполняется(!) т.к. никто функцию не вызвал(пока)
function onComplete(e:Event):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
//загрузка окончена!
}
//тут все еще ничего не загружено,loader.width/loader.height=0;
//тут деление на 0
var scale:Number=Math.min(windowWidth/loader.width),windowHeight/loader.height);
loader.scaleX=loader.scaleY=scale;

FlashRus
08.09.2017, 19:29
1. Вам-же сказали - дождитесь окончания загрузки и в обработчике onComplete отскейлите размер изображения. До его загрузки размеры loader'a ещё не известны.

2. Изображение на самом деле загружается, но вы уже его отскейлили по scale равному Infinity, т.к. loader.width и loader.height на тот момент равны нулю. В следствии этого вы ничего не наблюдаете.

ZackMercury
08.09.2017, 19:43
Случай запущенный, человек вообще не хочет разбираться с тем, что ему советуют, он хочет копипастнуть и чтобы всё сработало. Народ думает, что он хоть что-то понимает, но по видимому, он не понимает и не хочет понимать.

Предлагаю перенести топик в Вакансии.

Добавлено через 9 минут
P.S. У меня подозрение, что он так и оставил windowWidth, windowHeight. И да, undefined, там лишняя скобка.

Visors
08.09.2017, 20:21
1. Вам-же сказали - дождитесь окончания загрузки и в обработчике onComplete отскейлите размер изображения. До его загрузки размеры loader'a ещё не известны.

Вопрос: А зачем вообще нужно узнавать размер изображения ?
Содержимое файла jpg - будет постоянно меняться как и его размеры.
Я имел ввиду - как заставить флэш как-то подгонять размеры фотографии под окно - какими бы размеры фотографии не были ?
Еще вопрос: Вы написали - дождитесь окончания загрузки. Как мне узнать, что загрузка закончена? Должен быть какой-то звуковой сигнал или какой-то другой тип оповещения?

2. Изображение на самом деле загружается, но вы уже его отскейлили по scale равному Infinity, т.к. loader.width и loader.height на тот момент равны нулю. В следствии этого вы ничего не наблюдаете.

Как можно кодом - узнать width и height фотофайла - автоматически без того, чтобы каждый раз вручную "скейлить" изображение при каждой смене jpg ?

Добавлено через 1 минуту
ZackMercury, знаете что - я действительно довольно плохо разбираюсь в программе флэш, поэтому и пишу на этот форум.

undefined
08.09.2017, 20:33
Я имел ввиду - заставить флэш как-то подгонять размеры фотографии под окно - какими бы они не были ?
Что бы сделать это надо знать:
1)Размер изображения
2)Размер окна
Как можно кодом - узнать width и height фотофайла - автоматически без того, чтобы каждый раз вручную "скейлить" изображение при каждой смене jpg ?
До загрузки файла никак.В десятый раз - выставлять размеры надо после окончания загрузки, внутри функции onComplete, когда известны все размеры.
И да, undefined, там лишняя скобка.
Да,вот правильный вариант
var scale:Number=Math.min(windowWidth/loader.width,windowHeight/loader.height);

Visors
08.09.2017, 20:43
Что бы сделать это надо знать:
1)Размер изображения
2)Размер окна

Как можно узнать размер окна?
Ведь я могу растянуть его во весь экран, или наоборот сжать до минимума - размеры окна постоянно меняются.

undefined
08.09.2017, 20:47
Как можно узнать размер окна?
все,я сдаюсь

ZackMercury
08.09.2017, 21:21
Visors, если вы пишете на форум, значит вы хотите чему-то научиться, чего я не вижу. Судя по всему, вы ничего не гуглите, а вместо этого задаёте глупые вопросы людям, без какого-либо уважения. Если не учитесь - то вам на биржу фриланса или в раздел Вакансии.
По AS3 есть замечательная документация от Adobe (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/), разработчиков языка. А если вы не программист и не собираетесь этим заниматься, то ищите программиста в Вакансиях.

Visors
08.09.2017, 21:46
ZackMercury, я неплохо разбираюсь в VisulBasic.
И вот там, чтобы смасштабировать фотографию на форме - достаточно просто щелкнуть в свойствах инструмента на этой форме и выбрать опцию - масштабирование. Вот и все - это простейшая операция.
То же в языке Autoit - дело пары минут - смасштабировать изображение по размерам окна.

Я если честно и представить себе не мог, что во флэше (который вроде бы предназначен работать с графикой) - простое масштабирование фотографии в окне - это такая фантастическая по сложности задача, ради которой надо специально нанимать программиста и платить ему деньги.

undefined
08.09.2017, 21:57
Visors,ты спросил как узнать размер окна.Это тебе виднее что у тебя за окно.В общем случае узнать размер визуального объекта можно с помощью свойств width и height.

ZackMercury
08.09.2017, 22:01
Visors, проблема не во флеше, а в том, что вам всё, что вам нужно знать для того, чтобы выполнить задачу сказали ещё в самом начале темы. Остальное можно легко найти через поисковик. Вот и вся проблема. Вам даже код за вас написали, а вы даже не можете им воспользоваться.

Книжки читать, я так понимаю, вам советовать бесполезно?

Visors
08.09.2017, 22:15
undefined, вы же сами сказали - что для того, чтобы заставить флэш подгонять размеры любой фотографии под окно - какими бы они не были....
Нужно:
1-Знать размеры этой фотографии.
2-Знать размер окна.

Окно у меня - самое обыкновенное. Это окно открытого файла swf, в котором выполняется код загрузки изображения. Это окно - выглядит как окно Windows - его можно растянуть - по высоте и по ширине - как любое другое окно в котором воспроизводится файл swf.
Вообще мне несколько странно вам объяснять - что такое окно Windows.
Я думаю вы все-таки знаете что это такое.

Меня интересует вопрос - как автоматически подогнать размер изображения под размер окна.
Я открываю swf файл, тут же загружается jpg - но не как в моем примере, а заполняя окно - по ширине или по высоте с сохранением пропорций, или даже без пропорций - растягиваясь под размер окна.
А окно может быть быть любое - его можно растягивать - вверх-вниз и изображение на этом окне так же будет менять свой размер.

Добавлено через 19 минут
ZackMercury, я имел ввиду не вписывание вручную - размеров фотографии в код - всякий раз при ее смене.
А автоматическое выравнивании фотографии - по размеру окна, размер которого может постоянно меняться.

undefined
08.09.2017, 23:05
Правильно говорить "на всю рабочую область флэшки".Под окном обычно подразумевается нечто,нарисованное внутри этой области.Размеры рабочей области можно получить из свойств stage.stageWidth/stage.stageHeight.Как сделать чтоб оно автоматически подстраивалось при растяжении/сжатии флэшки читаем тут (http://www.flasher.ru/forum/showthread.php?t=119513)

Visors
08.09.2017, 23:19
undefined, ясно.
Буду читать.
Спасибо за ответы.

undefined
08.09.2017, 23:43
import flash.display.*;
import flash.events.*;
import flash.net.*;

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("1.jpg"));
addChild(loader);
stage.addEventListener(Event.RESIZE, update);
function onComplete(e:Event):void
{
e.target.removeEventListener(Event.COMPLETE, onComplete);
(e.target.content as Bitmap).smoothing = true;
update();
}
function update(e:Event = null):void {
loader.scaleX = loader.scaleY = 1;
var scale:Number=Math.min(stage.stageWidth /loader.width,stage.stageHeight/loader.height);
loader.scaleX = loader.scaleY = scale;
loader.x = stage.stageWidth * 0.5 - loader.width * 0.5;
loader.y = stage.stageHeight* 0.5 - loader.height * 0.5;
}

Писал не в flash ide,поэтому могут быть ошибки, но вроде все верно.

Visors
09.09.2017, 14:05
undefined, вот прямо - именно то, что нужно.
Огромное спасибо.