PDA

Просмотр полной версии : Картинка теряет качество при увеличении


slavnovik
05.10.2013, 18:13
Добрый день, у меня есть приложение во флеше, которая загружаю внешнюю картинку
код:

var logoloader:Loader = new Loader();

logoloader.load(new URLRequest("logo.png" ));
helpers_logo.addChild(logoloader);

Картинка растровая, следовательно, когда пользователь увеличивает размеры флешки, то картинка тоже увеличивается и теряет кач-во. Можно ли в as3 сделать так, что картинка не меняла размеры, если менять размеры флешки?

П.с. Админы, скорее всего заголовок не очень точный, но как назвать по-другому не знаю.

C4Grey
05.10.2013, 18:42
Нужно настроить Stage(получить доступ к экземпляру Stage можно через соответствующее свойство stage любого DisplayObject-а):
stage.scaleMode = StageScaleMode.NO_SCALE;
Устанавливает режим масштабирования контента, по умолчанию используется пропорциональное масштабирование, потому картинка(как и остальной контент внутри Flash Player-а) и изменяется в размерах.

slavnovik
05.10.2013, 19:02
Нужно настроить Stage(получить доступ к экземпляру Stage можно через соответствующее свойство stage любого DisplayObject-а):
stage.scaleMode = StageScaleMode.NO_SCALE;
Устанавливает режим масштабирования контента, по умолчанию используется пропорциональное масштабирование, потому картинка(как и остальной контент внутри Flash Player-а) и изменяется в размерах.


Что-то не помогает, ну или я что-то не так делаю

Akopalipsis
05.10.2013, 19:34
Вот так попробуйте
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

slavnovik
05.10.2013, 19:57
Вот так попробуйте
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

тупо добавить в код? А конкретно к картинке это нельзя применить?

Добавлено через 1 минуту
Просто мне надо, чтоб остальные объекты увеличивались, только картинка прежняя

Akopalipsis
05.10.2013, 20:01
Тогда делайте контейнер который будет масштабироваться как Вам нужно и туда вставляйте картинку.
По другому вроде бы нельзя.

slavnovik
05.10.2013, 20:03
Тогда делайте контейнер который будет масштабироваться как Вам нужно и туда вставляйте картинку.
По другому вроде бы нельзя.

А можно подробнее? Я в ас только начинаю...

Akopalipsis
05.10.2013, 20:24
А можно подробнее? Я в ас только начинаю...
я Вам наверное не верный совет дал по поводу контейнера. Точнее такой способ поможет, но нужно вообще все обьекты пересчитывать и перерисовывать..

Добавлено через 7 минут
я сам только учусь и меня не кода не покидает мысль, которая может стать Вам ответом - тебе кажется что знаний хватает до тех пор, пока ты отрывки кода пишешь. Вот даже на Вашем примере, казалось бы просто картинку масштабировать, а тут уже нужно несколько лет опыту. По другому не как.

Добавлено через 9 минут
Тут нужно создавать модель, которая возьмёт под свой контроль все координаты и размеры. Подписывать сцену на ресайз, по которому эта модель будет все пересчитывать и говорить о перерисовке.

in4core
05.10.2013, 20:51
Только через скейлМоде.Носкейл. Дальше подписываемся на ресайз, и ресайзем ВСЕ, что нам нужно так, как нужно, а картинку не трогаем. Сунуть в контейнер - мысль логичная, тогда придется скейлить только контейнер, а картинку держать в другом контейнере, который не скейлится. - все просто

Добавлено через 3 минуты
2 строчки кода, короче

slavnovik
05.10.2013, 20:56
Только через скейлМоде.Носкейл. Дальше подписываемся на ресайз, и ресайзем ВСЕ, что нам нужно так, как нужно, а картинку не трогаем. Сунуть в контейнер - мысль логичная, тогда придется скейлить только контейнер, а картинку держать в другом контейнере, который не скейлится. - все просто

Добавлено через 3 минуты
2 строчки кода, короче

Можете продемонстрировать эти строчки? Желательно, с пояснениями, чтоб хоть чему-то научиться

Akopalipsis
05.10.2013, 21:15
in4core Вы об этом? Как тут пару строчками обойтись? Что значит "ресайзеть как хочется" ? Пересоздавать все приложение каждый раз?
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;

public class Main extends Sprite
{

public function Main()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(event:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

stage.addEventListener(Event.RESIZE, stage_resizeHandler);
stage.addEventListener(Event.ACTIVATE, stage_resizeHandler);
}

private function stage_resizeHandler(event:Event):void
{

}

}

}

in4core
06.10.2013, 00:12
stage.addEventListener(Event.ACTIVATE, stage_resizeHandler); Это не надо.

private function stage_resizeHandler(event:Event):void
{
container.scaleX = container.scaleY = someValue;
}
Чего пересоздавать собрались? Человек как я понял конкретно ставит задачу, чтобы работало как SHOW_ALL - Для всего, но только не для одной картинки.

slavnovik
06.10.2013, 00:42
Это не надо.

private function stage_resizeHandler(event:Event):void
{
container.scaleX = container.scaleY = someValue;
}
Чего пересоздавать собрались? Человек как я понял конкретно ставит задачу, чтобы работало как SHOW_ALL - Для всего, но только не для одной картинки.

Ничего не понимаю >_<

Как мне сделать это именно для logoloader....

Akopalipsis
06.10.2013, 15:38
slavnovik если Вы этот код примените, то отпишитесь, ухудшается ли качество помещаемых в контейнер обьектов.
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import game_lines.Config;

public class Main extends Sprite
{
private var _rect0:Sprite;
private var _rect1:Sprite;
//контейнер в котором всё будет масштабироватся
private var _container:Sprite;
//переменная хранящая значение диагонали сцены в самом начале
private var _stageStartDiagonal:Number;
//переменная хранящая значение диагонали сцены при каждом ресайзе
private var _stageNowDiagonal:Number;
//переменная хранящая значение в процентах для масштабирования контейнера
private var _difference:Number;

public function Main()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(event:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

stage.addEventListener(Event.RESIZE, stage_resizeHandler);
stage.addEventListener(Event.ACTIVATE, stage_resizeHandler);

//находим длину диагонали сцены в самом начале
_stageStartDiagonal = Math.sqrt(stage.stageWidth * stage.stageWidth + stage.stageHeight * stage.stageHeight);

//создаём контейнер который будет масштабироваться
_container = new Sprite();
super.addChild(_container);


_rect0 = new Sprite();
_rect0.graphics.beginFill(0x272B9E);
_rect0.graphics.drawRect(0, 0, 150, 90);
_rect0.graphics.endFill();

super.addChild(_rect0);

_rect1 = new Sprite();
_rect1.graphics.beginFill(0x87269F);
_rect1.graphics.drawRect(0, 0, 150, 90);
_rect1.graphics.endFill();

//все что поместить в этот контейнер будет масштабироваться
_container.addChild(_rect1);

_container.x = 150;
_container.y = 0;
}

private function stage_resizeHandler(event:Event):void
{
//находим длину диагонали после ресайза
_stageNowDiagonal = Math.sqrt(stage.stageWidth * stage.stageWidth + stage.stageHeight * stage.stageHeight);
//находим процентный коэфициент
_difference = (100 * _stageNowDiagonal / _stageStartDiagonal) / 100;

//приравниваем контейнер этому коэфициенту
_container.scaleX = _difference;
_container.scaleY = _difference;
}

}

}