0

Увеличение, прокручивание изображения с контролами

Виктор 4 years ago in Applications / i3 Pro updated 4 years ago 9

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

Чтобы можно было сделать следующие:

нажал кнопку - "первый этаж"

открылся план первого этажа.

на нем все мелкое, чтобы поместился в часть экрана смартфона. Тогда я увеличиваю изображение, прокручиваю к спальне, вижу в итоге на полэкрана эту спальню с ламочками и кликаю нужную мне.

Как такое сделать?


Или еще пример, если не понятно.

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


Вот такой эффект хочу понять, как получить на иридии.

Помогите, пожалуйста, разобраться, был бы признателен за помощь.

+1

Знаю только один способ: с помощью атрибутов ScaleX, ScaleY

в библиотеке анимации есть эффект ScaleXY

http://dev.iridiummobile.net/Animation_API


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

если вместе с этим масштабировать несколько элементов, то можно изменять весь Popup

http://wiki2.iridiummobile.ru/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_iRidium_Script#.D0.9C.D0.B0.D1.81.D1.88.D1.82.D0.B0.D0.B1.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0....


Для управления отлично подойдут IR.GESTURE_PINCH_IN, IR.GESTURE_PINCH_OUT

http://wiki2.iridiummobile.ru/Gestures_API


Для подложки должно быть правильно выставлено свойство "Image Stretch"


Я использую StaticList для перемещения "между этажами", но есть свои особенности

Эх, перешел по ссылке пока писал сообщение)) Теперь все заново.

Спасибо, Андрей! Да, получается, надо на примитивном уровне работать. Воздействовать на координаты, ширины объектов. Увеличение попапов не подходит, т.к. в иридии баг на эту тему, поле активного действия не меняется с изменением размера айтема. Пока что приходится вручную каждый айтем модифицировать. Пока не знаю, как выбрать все айтемы на попапе, чтобы автоматизировать процесс, надеюсь, мне ответят в тикете, что есть такая возможность.
И еще большое спасибо за страницу примерами, не попадалась она мне. Wiki устроен так, что всегда будет возможность открыть для себя что-то новое))
Думал, может есть способ по-красивше, ведь это масштабирование, должно быть, как мне кажется, по умолчанию. Ставишь галку - и как перетаскивание попапа - true false. А вот нет, нужно самому с каждой координатой возиться.
Про статик лист я тоже думал, но одно дело этажи - другое по карте ползать, я не нашел способа применить его в этой задаче.
Если еще какие идеи будут у коллег - пишите, с благодарностью разберу.

+1

Если по индексу item'а, не подходит?

http://support.iridiummobile.net/topics/11534-/#comment-70764

Оно! Отлично! Спасибо, Андрей! На шаг приблизился к созданию человеческой функиции. Может, вы знаете, как программно задать положение нового, создаваемого из срипта айтема по отношению к другим, которые уже есть? Например есть 10 айтемов на попапе. Я хочу создать скриптом новый айтем вставив его между первым и всеми остальными?

+1

Положение - в смысле координаты? Только высчитывать новые координаты и сдвигать каждый элемент поочередно, если отказались от List (в котором "положение" задается индексом, не Static)


Я использую Clone "образца" (это несколько Item), который находится за пределами видимой области экрана, вычисляется "середина" образца, клон сдвигается на относительную величину, которая соответствует координатам.

var mvItms = function(x,y,m)
{
   var right=0, bottom=0;
   for (var i = 2; i < arguments.length; i++) {
      right = Math.max(right,arguments[i].X+arguments[i].Width);
      bottom = Math.max(bottom,arguments[i].Y+arguments[i].Height);
   }
   //(right-m.X)/2 - width of goup of elements  
   var revX = (x-m.X)-Math.round((right-m.X)/2); //m.x>x ?
   var revY = (y-m.Y)-Math.round((bottom-m.Y)/2);
   for (var i = 2; i < arguments.length; i++) {
      arguments[i].X += revX;
      arguments[i].Y += revY;
   }
};

//что-то в этой функции отсутствует вычисление left - MIN, top-MIN, 
//видимо первый элемент (m) - расположен "выше, левее остальных"

вызов функции примерно следующий

...
var name="nmEl_"+1;
var MainEl=page.GetItem("Main_T").Clone(this.name+"M");
var SecondEl=page.GetItem("Second_T").Clone(this.name+"S");
var ThrdEl=page.GetItem("Thrd_T").Clone(this.name+"T");

mvItms(200, 300,MainEl, SecondEl, ThrdEl, ..);
...

Да, координаты буду расчитывать. Пока другое делаю, не могу приступить к реализации функции.. Но ваше решение, думаю, как раз то, что нужно.


А вот положение имеется в виду - порядок. Вглубь. Хочу джойстик накинуть на попап программно. Чтоб через него понимать куда двигать изображение. Потому этот джойстик надо именно вставить между айтемом-подложкой и остальными айтемами, чтобы он не перекрывал к ним доступ.

Да, видимо z-order не поменять

http://support.iridiummobile.net/topics/9525-pozitsiya-z-u-sozdannogo-cherez-js-elemeta/

Можно заново создавать элементы клонированием и удалять оригинал в нужном порядке. Это если уже созданные Item.

function setZOrder(orderList)
{
   var e, nm;
   for (e in orderList){
   e=orderList[e];
   IR.Log(e);
      nm=e.Name;
      e.Name="__deleted"
      e.Clone(nm);
      IR.DeleteItem(e)
   }
};

var page=IR.GetItem("Page 1");
setZOrder([page.GetItem("BG"),page.GetItem("Item 3"),page.GetItem("Item 4"),page.GetItem("TOP")])

В клиенте Win (эмулятор) есть баг - клонируются не все свойства.

А через CreateItem - не удается добиться нужного порядка?

CreateItem создает айтем над остальными. Если попап прорисован, а я потом накидываю через CreateItem

джойстик, айтемы на попапе становятся перекрытыми.

Техподдержка подствредила, что Z програмно не задать. Если на винде баги, буду отказываться от идеи использовать клонирование. Либо вручную попробую перенести свойства. Сначала надо бы оценить необходимость таких костылей) А то сделать человеческую функцию на не очень человеческой платформе может оказаться еще более увлекательной задачей))

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