Просмотр полной версии : Картинка теряет качество при увеличении
slavnovik
05.10.2013, 18:13
Добрый день, у меня есть приложение во флеше, которая загружаю внешнюю картинку
код:
var logoloader:Loader = new Loader();
logoloader.load(new URLRequest("logo.png" ));
helpers_logo.addChild(logoloader);
Картинка растровая, следовательно, когда пользователь увеличивает размеры флешки, то картинка тоже увеличивается и теряет кач-во. Можно ли в as3 сделать так, что картинка не меняла размеры, если менять размеры флешки?
П.с. Админы, скорее всего заголовок не очень точный, но как назвать по-другому не знаю.
Нужно настроить 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 минут
Тут нужно создавать модель, которая возьмёт под свой контроль все координаты и размеры. Подписывать сцену на ресайз, по которому эта модель будет все пересчитывать и говорить о перерисовке.
Только через скейлМоде.Носкейл. Дальше подписываемся на ресайз, и ресайзем ВСЕ, что нам нужно так, как нужно, а картинку не трогаем. Сунуть в контейнер - мысль логичная, тогда придется скейлить только контейнер, а картинку держать в другом контейнере, который не скейлится. - все просто
Добавлено через 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
{
}
}
}
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;
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.