Статьи

Спросите Activetuts + Редакторы # 2

Пришло время для другого Поста Редакторов ; шанс для вас озвучить ваши вопросы и получить исчерпывающий ответ от Майкла и меня. На этот раз Майкл уже ответил на несколько вопросов, оставшихся с прошлого раза …


Все, что вам нравится, но старайтесь держать его в рамках предмета, найденного на Activetuts +. Если у вас есть вопрос о Джастине Бибере, уходите.


Не волнуйся, мы знаем людей. Мы сделаем все от нас зависящее, чтобы ответить на ваш вопрос!


Как только мы соберем подходящее количество вопросов, мы ответим на них и опубликуем результаты. Если на этот раз ваш вопрос не попадет в шорт-лист, очень скоро будет еще один пост с вопросом редакторов .

[контактная форма 1 «Контактная форма 1»]

Sarvan

Майкл Джеймс Уильямс:

Эй, Сарван,

Хороший вопрос. API Graph Facebook очень глубокий; Я мог бы написать целую книгу об использовании ее с Flash ( и я не говорю метафорически ), но, к сожалению, она не включала бы полный метод добавления кнопки «Нравится» на Facebook.

Насколько я понимаю, Facebook не хочет, чтобы вы разрабатывали свои собственные кнопки «Мне нравится»; они хотят убедиться, что любая нажатая кнопка «Мне нравится» является официальной кнопкой «Мне нравится» на Facebook. Это понятно, но разочаровывает, если вы являетесь разработчиком Flash, потому что это означает, что нет простого способа получить кнопку «Нравится» в вашей RIA или игре.

Умные ребята на byHook.com нашли способ обойти это — хотя и с некоторыми ограничениями — ознакомьтесь с их полным методом (и предысторией) на Facebook Like Button во Flash: Повесть о сломанных мечтах и ​​замученных душах .

С тех пор Facebook стал более снисходительным в отношении лайков; Теперь вы можете создать кнопку « /OBJECT_ID/likes для постов, комментариев и фотографий (но не, скажем, страниц), используя Graph API, опубликовав запрос Graph в /OBJECT_ID/likes . Это включает в себя вход пользователя в Facebook через ваш SWF, что, в свою очередь, означает регистрацию вашего SWF в качестве приложения на Facebook и настройку токенов аутентификации и всякого рода вещей, которые я не могу здесь осветить. Но это должно работать.

Другая альтернатива, которую, как я видел, используют люди, — это создать элемент div, содержащий кнопку «Мне нравится», отображаемую в JavaScript, как позволяет Facebook , и (в соответствующее время) поместить элемент div над SWF на вашей HTML-странице, чтобы он выглядел как часть SWF. Это довольно запутанный, хотя.

Подделка функциональности кнопки «Поделиться» намного проще; Graph API упрощает публикацию на собственной стене пользователя, отправляя запрос Graph в /me/feed — хотя, опять же, вам нужно заставить их войти в систему через SWF и настроить токены аутентификации и все такое прочее.


Амир Хамид

Майкл Джеймс Уильямс:

Привет, Амир!

Я собираюсь предположить, что вы используете объект NetStream для потоковой передачи реального видео и подключаете его к объекту Video , который находится в списке отображения, чтобы показать канал, поэтому ваш код выглядит примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
public var vid:Video = new Video();
public var ns:NetStream;
public var nc:NetConnection = new NetConnection();
 
public function init():void
{
    addChild(vid);
    nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
}
 
public function onNetStatus(event:NetStatusEvent):void
{
    if (event.info.code == «NetConnection.Connect.Success»)
    {
        ns = new NetSream(nc);
        video.attachNetStream(nc);
        stream.play(«http://example.com/videoName.flv»);
    }
}

Я уверен, что у вас сложнее, но это пересекает основную идею.

Чтобы выяснить, насколько далеко находится мышь, мы можем использовать свойство stageX любого MouseEvent и свойство stageWidth сцены, например:

1
2
3
4
5
6
7
8
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
 
//…
 
public function onMouseMove(event:MouseEvent):void
{
    var fraction:Number = event.stageX / stage.stageWidth;
}

Если мышь находится на полпути через сцену, fraction будет 0,5; если это крайний левый, fraction будет 0; и если это крайний правый, fraction будет 1.

Теперь мы можем использовать метод NetStream.seek() для перехода к определенному количеству секунд видео или, по крайней мере, приблизительно к этой точке; это фактически переходит к ближайшему ключевому кадру в видео до этого количества секунд, и ключевые кадры обычно разбиваются на 10-50 кадров. Так что, если бы мы знали общую длину видео, мы могли бы сделать это:

1
2
3
4
5
public function onMouseMove(event:MouseEvent):void
{
    var fraction:Number = event.stageX / stage.stageWidth;
    ns.seek(fraction * totalLengthOfVideo);
}

(Примечание. С помощью этого кода нам нужно добавить прослушиватель MouseEvent после загрузки видео, иначе возникнут проблемы.)

К сожалению, нет свойства ns.length которое сообщает нам длину видео. Но мы можем получить длину через metadata потока.

Перед вызовом NetStream.play() мы должны добавить функцию обработчика событий, которая будет запускаться, когда сервер видео отправляет описательную информацию — метаданные — о видео:

01
02
03
04
05
06
07
08
09
10
public function onNetStatus(event:NetStatusEvent):void
{
    if (event.info.code == «NetConnection.Connect.Success»)
    {
        ns = new NetSream(nc);
        ns.onMetaData = onReceiveMetaData;
        video.attachNetStream(nc);
        stream.play(«http://example.com/videoName.flv»);
    }
}

В этой функции-обработчике мы присвоим свойство duration метаданных переменной, к которой мы можем обратиться позже:

1
2
3
4
5
6
7
8
public var totalLengthOfVideo:Number;
 
//…
 
public function onReceiveMetaData(theMetaData:Object)
{
    totalLengthOfVideo = theMetaData.duration;
}

И вот оно! Код нужно немного привести в порядок, но там есть все, что вам нужно 🙂


Praveen

Майкл Джеймс Уильямс:

Отметил;) Мы будем работать над тем, чтобы получить больше таких на сайте. (Если кто-то читает какие-то безумные анимационные навыки, которыми он хочет поделиться, свяжитесь с нами !)

А пока посмотрите некоторые уроки анимации из наших архивов: