Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.09.2014, 17:53
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 1  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
По умолчанию Косметическая проблема ScaleFactor

У нас есть:
  • Приложение, которое скейлится под любой размер.
  • Content.scaleFactor (например, если он равен двойке, то все значения и размеры нужно делить на два).
Задача:
Правильно "заресайзить" некоторые константы.

Например, есть константа BUTTON_OFFSET.
Чтобы получить её на маленьком экране я пишу BUTTON_OFFSET / Content.scaleFactor.
Это как-то некрасиво что-ли.

Сейчас делаю так:
Код AS3:
public static function getBackButtonOffset():int {
	return BACK_BUTTON_OFFSET / Content.scaleFactor;
}
То есть делаю оболчку для константы.
Но это тоже как-то не очень.

Какие у вас есть варианты?

Старый 14.09.2014, 18:15
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 2  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Код AS3:
const BUTTON_OFFSET:int = BUTTON_OFFSET / Content.scaleFactor;
Вы вот так делали ?

Старый 14.09.2014, 18:16
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 3  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Хоть Content.scaleFactor не изменяется в процессе работы приложения, он рассчитывается в рантайме.
Так что такой вариант не подойдёт.

Старый 14.09.2014, 18:17
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 4  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Если так не нравится, то сделайте вот так -
Код AS3:
const DEFAULT_SCALE:int = 1;
const BUTTON_OFFSET:int = DEFAULT_SCALE:int / Content.scaleFactor;
Добавлено через 3 минуты
Дело в том, что константы задают только для того, чтобы компилятор их винлайнел в место вызова.
Если такое условие не выполняется, то значит константа просто не нужна.
И Ваш вариант с getBackButtonOffset тоже не может быть заменой константе, так как не инлайнится, то есть не выполняет задачу константы и так же такая запись вообще каждый раз считает условие.
Вот такой get можно присваивать какой-то константе...

Чет я фигню сказал о ТОЛЬКО для инлайна Главная цель неизменяемость.
Сделайте getter, то же не меняется.

Старый 14.09.2014, 18:35
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 5  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Я знаю для чего нужна константа
Я говорю как правильно и красиво решить проблему, чтобы не плодить на кажду константу геттер.
Но это пока что лучший для меня вариант.

Старый 14.09.2014, 19:29
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 6  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
А че тут сложного? Определяете константы метрических параметров для "стандартного" (по Вашему мнению или по задумке дизайнера) размера экрана. А потом для каждого события ресайза пересчитываете эти самые метрики и сохраняете их в соответсвующих переменных. Само собой, что приложение будет пользоваться переменными, а не константами. Если ресайз случится только на старте (подгонка под выделеный размер), то все круто. Но если есть возможность ресайзить в прцессе жизненного цикла прилжения, то есть два варианта:
Код:
1. Запускаем пересчет параметров, а потом перерисовку окна приложения.
2.	1. Просим юзверя подождать
	2. Запускаем пересчет параметров
	3. Перерисовываем ресурсы под нужные параметры
	4. Перерисовываем экран приложения
	5. Продолжаем работу приложения

Старый 14.09.2014, 19:54
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 7  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Ребят, вы не ту проблему решаете)
Я уже всё сделал, мне интересно как красивее обернуть константу.
Перечитайте мой пост.

ЗЫ.: scaleFactor уже дан, он рассчитывается один раз вначале.
Экраны устройства статичные, не думаю что кто-то на андроид сможет поменять размер экрана во время работы приложения.
Потому и рассчитывается всего один раз.

Добавлено через 3 минуты
То есть меня интересует как бы вы поступили:
1. Создали перменную , которая будет равна константе / scale factor.
2. "Константа" изначально будет переменной и потом после расчёта scale factor я делю все "константы" на него.
3. Геттер, который возвращает константу поделенную на скейл фактор
4. ???

Старый 14.09.2014, 20:22
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 8  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Первое, я не правильно понял вопрос и ответ дал тоже неправильный.
Второе, Вы спросили вообще не пойми чего.
Как красиво сделать константу... А делаете геттер. При чем тут константа?)
И или я опять не понял или Вы спросили -
Код AS3:
// У меня есть два всойства
var a = 5;
var и = 5;
// Как красивей будет -
a + b;
b + a;
var c = a;
c + b
a * 2 + b - a
И Вы даже не геттер, а обычный метод называете константой.

Старый 14.09.2014, 20:53
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 9  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
чтоб было красивее я бы вообще не делал какие то константы конкретно для какой то кнопки или элементов интерфейса.
а писал бы прям в лоб.
Код AS3:
			backButton.x = 30;
			backButton.y = otherButton.y + 30 / Content.scaleFactor;
тут надо исходить из того сколько раз эти специфичные константы будут использоваться
если один раз на один элемент, то красивее и удобнее и быстрее написать формулу позиционирования в месте позиционирования. и константу BACK_BUTTON_OFFSET я бы тоже не заводил. просто выделил бы позиционирование элементов в отдельный метод для каждого контейнера этих элементов.
а если прям совсем хочется отделить то
Код AS3:
		public static function get BACK_BUTTON_OFFSET ():int
		{
			return 30 / Content.scaleFactor;
		}
в коде ты не думаешь что это геттер и пишешь так же как писал раньше

Старый 14.09.2014, 21:11
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 10  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Хах, интересный вариант - отказаться от констант, "запихнув" их в геттеры.
Возьму на заметку, но посмотрю на варианты других участников форума.

Есть ли минусы у подхода, который предложил Nooob в конце своего поста?

Добавлено через 6 минут
Цитата:
Сообщение от Gerbert Посмотреть сообщение
И Вы даже не геттер, а обычный метод называете константой.
Вы неправильно прочитали мои сообщения или я неправильно выразился

Опишу еще раз:
Есть константа const BUTTON_OFFSET = 30 например.
Но вдруг оказывается что у пользователя экран в два раза меньше чем нужно!
Изменяем размер всех кнопок, соответственно и расстояние между ними (offset).
Для этого вначале работы приложения рассчитывается scaleFactor (defaultWidth/stageWidth например).
Соответственно нам нужно "поделить константу" на scaleFactor, но суть константы от этого теряется.
Значит нам нужно красиво обойти эту преграду, чтобы константа формально оставалась константой, но при этом задавалась не при компиляции, а в рантайме (один раз при рассчёте scaleFactor).
Метод Nooob кажется подходит. Но интересны еще вариант

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:18.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.