Статьи

Titanium Mobile: создание галереи Dribbble для iPad

Из этого туториала вы узнаете, как использовать элементы управления SplitWindow и Popover в Titanium Mobile при создании потрясающей галереи фотографий из Dribbble. Попутно вы будете работать с запросами веб-служб, контейнерами изображений и другими распространенными компонентами Titanium Mobile. Давайте начнем!

Приложение Dribbble для iPad

В этом уроке мы рассмотрим, как использовать два специфичных для iPad элемента пользовательского интерфейса в Titanium Mobile для создания приложения. В частности, это приложение будет галереей, показывающей самые популярные работы на Dribbble. Хотя большинство одинаковых инструментов и элементов пользовательского интерфейса используются для создания приложений для телефонов и планшетов, существуют различия. Самая очевидная разница в разработке планшета — это размер экрана.

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

Однако при работе с планшетом у вас гораздо больше места и, как правило, вы хотите отображать навигацию и контент одновременно, оставляя пункты меню доступными, когда пользователь просматривает контент. Вы также часто хотите временно наложить некоторую информацию на контент. Именно здесь вступают в действие специальные элементы управления splitView и Popover для iPad.


Начните с создания нового мобильного проекта в Titanuim. Введите название проекта, идентификатор приложения и URL-адрес компании, которые вы хотите. Для целей развертывания снимите все опции, кроме iPad, так как это руководство предназначено специально для iPad. Затем нажмите Готово.

Это создает файловую структуру и необходимые файлы для мобильного проекта. Наше внимание сосредоточено на файле app.js (в папке ресурсов), поскольку именно здесь мы будем размещать наш код. Файл «app.js» содержит приложение по умолчанию, с которого можно начать, но, поскольку мы не будем использовать его в этом руководстве, вы можете удалить весь код по умолчанию в этом файле. После удаления кода по умолчанию у вас останется чистая отправная точка.


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

С помощью этого API вы можете получать доступ к изображениям в Dribbble различными способами, включая поиск людей, списки дебютов и список самых популярных изображений. В этом уроке мы рассмотрим самые популярные. Для получения дополнительной информации об API, посетите официальную документацию .

Через этот API Dribbble отправляет свои изображения через объект JSON, который структурирован следующим образом:

ПРИМЕЧАНИЕ: изображение выше было взято прямо с http://dribbble.com/api

Внутри этого JSON-объекта находится массив, называемый «выстрелами», который содержит различную информацию об изображении. Частями этих данных, с которыми мы будем работать, являются заголовок, image_url, image_teaser_url, имя игрока, twitter_screen_name и местоположение.

Чтобы вызвать API из Titanium, вы создаете HTTPClient (в данном случае с именем «myRequest»):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
var jsonObject;
var shots;
var myRequest = Ti.Network.createHTTPClient({
    onload: function(e) {
            jsonObject = JSON.parse(this.responseText)
            shots = jsonObject.shots
        },
    onerror: function(e) {
        alert(e.error);
    },
    timeout:5000
});
myRequest.open(«GET», «http://api.dribbble.com/shots/popular»);
myRequest.send();

В этом фрагменте кода мы вызываем URL-адрес http://api.dribbble.com/shots/popular и после загрузки помещаем ответ в переменную с именем jsonObject. Мы используем JSON.parse для преобразования строки, отправленной из Dribbble, в объект JSON, что упрощает навигацию. Переменная «выстрелы» содержит массив, содержащий информацию для изображений. Вы можете увидеть, как это выглядит, добавив «alert (shots)» в функцию загрузки.


Целью макета splitview является одновременное отображение двух окон. Первое окно — это навигация (которая в нашем случае будет содержать миниатюры), а второе окно — для хранения контента (содержащего увеличенное изображение). Добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
var nav = Ti.UI.createWindow({
   backgroundColor:’#efeeea’,
});
 
var content = Ti.UI.createWindow({
   backgroundColor:’#e2e1df’,
});
 
var splitWin = Ti.UI.iPad.createSplitWindow({
    masterView:nav,
    detailView:content,
    showMasterInPortrait:true,
    });
 
splitWin.open();

Здесь мы создаем два окна, которые будут формировать наш макет, окна навигации и содержимого. Nav будет содержать наши миниатюры и поэтому определяется как masterView при создании разделенного окна. MasterView находится слева и традиционно содержит навигацию. По умолчанию masterView разделенного окна не отображается в портретной ориентации. Чтобы увидеть это в действии, взгляните на почтовый клиент на iPad в книжной и альбомной ориентации. Когда он исчезает, необходимо создать альтернативную форму навигации. Для простоты мы будем держать masterView видимым в обоих направлениях для этого приложения, установив для свойства showMasterInPortrait значение true.

Чтобы изменить ориентацию в симуляторе iOS, выберите «Оборудование»> «Повернуть вправо» в главном меню симулятора или нажмите «Command» →.


API Dribbble отправляет информацию по 15 изображениям за раз, что слишком много для отображения в доступном пространстве. Мы можем создать scrollView с именем scroll и добавить его в окно навигации, чтобы позволить пользователю прокручивать более длинный список.

1
2
3
4
5
var scroll = Ti.UI.createScrollView({
    contentHeight: ‘auto’,
showVerticalScrollIndicator:true,
    })
nav.add(scroll)

Мы уже поместили информацию для создания миниатюр в массив «выстрелов». Теперь мы можем создать функцию, которая использует эту информацию для создания миниатюр.

01
02
03
04
05
06
07
08
09
10
11
12
function loadThumbnails (){
    for (var i = 0; i < shots.length; i++) { // loops for each image
        var thumb = Ti.UI.createImageView({ // creates thumb
            image:shots[i].image_teaser_url, // sets image to smaller version of image
            largeImage:shots[i].image_url, // remembers URL of full size image for later use
            player:shots[i].player, // remembers information on user who created image
            height:150, // sets height
            top:i*170, // positions from top
         })
    scroll.add(thumb) // adds thumb to scrollview
    }
}

Давайте пройдемся по тому, что делает эта функция. Для каждого из объектов в массиве снимков (т. Е. Для каждого изображения, которое мы покажем) мы создаем представление изображения с именем «thumb». Свойство image этого представления устанавливается на URL-адрес уменьшенной версии изображения (image_teaser_url). Это версия изображения размером 150px X 200px. Мы также пользуемся этой возможностью, чтобы запомнить URL для полноразмерного изображения. Мы делаем это, добавляя новое свойство с именем largeImage и присваивая ему значение shots [i] .image.url. Мы будем использовать это позже, чтобы узнать, какое изображение загрузить в область содержимого. Таким же образом мы запоминаем информацию о человеке, который создал изображение, помещая его в созданное нами свойство с именем «player».

Затем мы определяем размер и располагаем большой палец и добавляем его к свитку. Эта функция должна вызываться после загрузки данных, поэтому добавьте loadThumbnails(); к функции загрузки, которую вы создали ранее.

1
2
3
4
5
onload: function(e) {
    jsonObject = JSON.parse(this.responseText);
    shots = jsonObject.shots;
    loadThumbnails ();
},

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


Создайте новое представление изображения, чтобы оно содержало увеличенное изображение, и добавьте его в окно содержимого. Это изображение, которое отображается, когда пользователь выбирает одну из миниатюр. Изображения из Dribbble имеют размер 400×300 пикселей, поэтому вы создаете представление изображений, добавив этот код:

1
2
3
4
5
var mainImage = Ti.UI.createImageView({
    width:400,
    height:300,
 })
content.add(mainImage)

Когда нажата одна из больших пальцев, мы хотим, чтобы она загружала соответствующее увеличенное изображение, URL которого мы запомнили большим пальцем как свойство largeImage. Чтобы сделать это, мы добавляем eventListener к каждому большому пальцу, поскольку он создается в цикле for.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
function loadThumbnails (){
    for (var i = 0; i < shots.length; i++) {
        var thumb = Ti.UI.createImageView({
            image:shots[i].image_teaser_url,
            largeImage:shots[i].image_url,
        player:shots[i].player,
            height:150,
            top:i*170,
 
                    })
        thumb.addEventListener(‘touchstart’, function(e)
            {
                mainImage.image = e.source.largeImage;
            });
    scroll.add(thumb)
            }
    }

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


Всплывающие окна являются вторым элементом пользовательского интерфейса, характерным для разработки iPad. Они позволяют добавлять слой информации в существующий макет.

1
2
3
4
var popover = Ti.UI.iPad.createPopover({
    width:250, height:110,
    arrowDirection:Ti.UI.iPad.POPOVER_ARROW_DIRECTION_DOWN,
});

Этот код создает объект popover, определяет размер содержимого внутри него и устанавливает направление стрелки popover (и, таким образом, позиционирование popover). Варианты позиционирования поповера:

1
2
3
4
5
Ti.UI.iPad.POPOVER_ARROW_DIRECTION_UP
Ti.UI.iPad.POPOVER_ARROW_DIRECTION_DOWN
Ti.UI.iPad.POPOVER_ARROW_DIRECTION_LEFT
Ti.UI.iPad.POPOVER_ARROW_DIRECTION_RIGHT
Ti.UI.iPad.POPOVER_ARROW_DIRECTION_ANY

Мы хотим, чтобы этот поповер появлялся над mainImage при нажатии. Для этого мы создаем eventListener для mainImage и показываем всплывающее окно.

1
2
3
4
mainImage.addEventListener(‘touchstart’, function(e)
{
    popover.show({view:mainImage});
});

Это определяет mainImage как представление, к которому прикреплен поповер.

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var profilePic = Ti.UI.createImageView({
    width:80,
    height:80,
    left:0
    })
var twitterName = Ti.UI.createLabel({
    width:140,
    left:120,
    color:’#ffffff’,
    font:{fontSize:16},
    top:30,
    height:30
})
var location = Ti.UI.createLabel({
    color:’#ffffff’,
    font:{fontSize:16},
    left:120,
    width:140,
    top:60,
    height:30
})
 
popover.add(profilePic)
popover.add(twitterName);
popover.add(location);

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

В созданной ранее функции прослушивания событий сенсорного запуска добавьте информацию для заголовка всплывающего окна, изображения профиля, имени Twitter и местоположения.

1
2
3
4
5
6
7
8
9
thumb.addEventListener(‘touchstart’, function(e)
{
    mainImage.image = e.source.largeImage;
         
    popover.title = e.source.player.name;
    profilePic.image = e.source.player.avatar_url;
    twitterName.text = e.source.player.twitter_screen_name;
    location.text = e.source.player.location;
});

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
var myRequest = Ti.Network.createHTTPClient({
    onload: function(e) {
            jsonObject = JSON.parse(this.responseText);
            shots = jsonObject.shots;
            loadThumbnails ();
        },
    onerror: function(e) {
        alert(e.error);
    },
    timeout:5000
});
myRequest.open(«GET», «http://api.dribbble.com/shots/popular»);
myRequest.send();
 
var nav = Ti.UI.createWindow({
   backgroundColor:’#efeeea’,
});
var content = Ti.UI.createWindow({
   backgroundColor:’#e2e1df’,
});
 
var splitWin = Ti.UI.iPad.createSplitWindow({
    masterView:nav,
    detailView:content,
    showMasterInPortrait:true,
    });
splitWin.open();
 
var scroll = Ti.UI.createScrollView({
        contentHeight: ‘auto’,
        showVerticalScrollIndicator:true,
    })
nav.add(scroll)
 
 
function loadThumbnails (){
    for (var i = 0; i < shots.length; i++) { // loops for each image
        var thumb = Ti.UI.createImageView({ // creates thumb
            image:shots[i].image_teaser_url, // sets image to smaller version of image
            largeImage:shots[i].image_url,
            player:shots[i].player,
            height:150, // sets height
            top:i*170, // positions from top
         })
    thumb.addEventListener(‘touchstart’, function(e)
    {
        mainImage.image = e.source.largeImage;
         
        popover.title = e.source.player.name;
        profilePic.image = e.source.player.avatar_url;
        twitterName.text = e.source.player.twitter_screen_name;
        location.text = e.source.player.location;
         
    });
    scroll.add(thumb) // adds thumb to scrollview
    }
}
 
var mainImage = Ti.UI.createImageView({
    width:400,
    height:300,
 })
content.add(mainImage)
var popover = Ti.UI.iPad.createPopover({
    width:250, height:110,
});
mainImage.addEventListener(‘touchstart’, function(e)
    {
        popover.show({view:mainImage});
    });
var profilePic = Ti.UI.createImageView({
    width:80,
    height:80,
    left:0
    })
var twitterName = Ti.UI.createLabel({
    width:140,
    left:120,
    color:’#ffffff’,
    font:{fontSize:16},
    top:30,
    height:30
})
var location = Ti.UI.createLabel({
    color:’#ffffff’,
    font:{fontSize:16},
    left:120,
    width:140,
    top:60,
    height:30
})
popover.add(profilePic)
popover.add(twitterName);
popover.add(location);