Temat: Problem z linkiem w aplikacji AIR

Witam!

Na wstępie zaznaczę ze jestem grafikiem, temat programowania nie jest moja mocna strona dlatego proszę o wyrozumiałość.

Chcę w aplikacji AIR tworzonej za pomocą Adobe Flash Builder 4.6 uzyskać efekt aby w umieszczonej stronie html za pomocą komponentu HTML była możliwość otwarcia okna domyślnej przeglądarki internetowej po kliknięciu w baner w aplikacji AIR.

Ze strony http://www.twoja-strona24.pl/air/banery.rar można pobrać plik projektu flexa z zalinkowanymi banerami.

Zdążyłem już zorientować się że problem polega na specyficzym sposobie bezpieczeństwa flash playera i w zasadzie znalazłem opisy rozwiązania problemu, o ile dobrze zrozumiałem opisy należy użyć klasę URLRequest jednak jako "zielony" w programowaniu nie wiem jak to zastosować w praktyce.

Cel jest następujący chcę aby w aplikacji AIR po kliknięciu w baner otwierała się zdefiniowana strona www w przeglądarce (przypomnę ze plik z banerami to zwykła strona HTML umieszczona na serwerze moim i dodana do aplikacji AIR za pomocą komponentu HTML.

Proszę o pomoc i przykładowy kod rozwiązania a najlepiej o zmodyfikowanie mojego przykładu.
Sebastian Z.

Sebastian Z. Konsultant /
Freelancer jako
Feerie Software

Temat: Problem z linkiem w aplikacji AIR

Pana problem mniej więcej można opisać tak: "Chciałbym mieć taki samochód, w którym będzie rower, jak się będzie tym rowerem pedałować, to samochód będzie jechał". Za bardzo się to kupy nie trzyma.

Skoro baner jest w html i strona docelowa jest w html, to do czego ta aplikacja AIR?

W ogólności, poprawne rozwiązanie istnieje, ale nie ma ani nic wspólnego z URLRequest, ani de facto z sandboxem Flash Playera, ponieważ w aplikacji AIR większość jego ograniczeń nie obowiązuje. Jest jednak dość karkołomne, ponieważ sam problem jest kuriozalny. Wymagałoby obsługi ExternalInterface, oraz dodatkowego kodu Javascript w stronie zawierającej banner, który wołałby z powrotem zewnętrzną aplikację AIR a w niej polecenie otworzenia adresu URL w przeglądarce.

Rozwiązanie pośrednie, które może działać albo nie (nie jestem pewien) - jeśli rozmiar bannerów jest zawsze taki sam i jest to jedyne co jest na stronie, można dobrać tak rozmiar komponentu HTML w AIR żeby obejmował tylko te bannery, a potem dodać kod obsługi kliknięcia w komponent HTML (które poniekąd będzie kliknięciem w banner). Wyglądałoby to mniej więcej tak:

<fx:Script>
<![CDATA[
private function onHtmlClick(e:MouseEvent ):void {
navigateToURL(new URLRequest( "http://www.strona.com"), "_blank");
}
]]>
</fx:Script>

<mx:HTML x="38" y="30" width="754" location="http://www.twoja-strona24.pl/air/01.html"
click="onHtmlClick(event)"/>
Szymon Rybka

Szymon Rybka Flex Developer

Temat: Problem z linkiem w aplikacji AIR

Poprawnym rozwiazaniem jest ustawienie lub stworzenie obiektu host na kontrolce htmlowej i tam obsluzenie linka. Nie potrzeba zadnych js.

Temat: Problem z linkiem w aplikacji AIR

Sens stosowania jest taki ze jak się zapewne domyślacie Państwo aplikacja AIR ma nie tylko zawierać ten rotator banerów.

Jednak problem z linkiem opisany prze zemnie wcześniej burzy sens budowania całości gdzie jednym z elementów jest ów baner.

Czy mogę Szymonie poprosić o rozwinięcie Twojej podpowiedzi (przykład kodu jak to rozwiązanie zastosować w praktyce)
Szymon Rybka

Szymon Rybka Flex Developer

Temat: Problem z linkiem w aplikacji AIR

W mxmlu:

<mx:HTML htmlHost="MyHtmlHost()" />

W Klasie as3

package
{ import flash.events.Event;
import flash.events.LocationChangeEvent;
import flash.html.HTMLHost;
import flash.html.HTMLLoader;
import flash.html.HTMLWindowCreateOptions;
import flash.net.URLRequest;
import flash.net.navigateToURL;
public class MyHtmlHost extends HTMLHost
{

public function MyHtmlHost(defaultBehaviors:Boolean=true)
{
super(defaultBehaviors);
}
override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader
{
var htlmLoader:HTMLLoader;
htlmLoader = new HTMLLoader();
htlmLoader.addEventListener(LocationChangeEvent.LOCATION_CHANGE, onLocationHange);
return htlmLoader;
}
protected function onLocationHange(event:Event):void
{
var htlmLoader:HTMLLoader = event.target as HTMLLoader;
htlmLoader.removeEventListener(LocationChangeEvent.LOCATION_CHANGE, onLocationHange);
var location:String = String( (event.target as Object).location );

var urlReq:URLRequest = new URLRequest(location);
navigateToURL(urlReq); }
}
}

Następna dyskusja:

Flex [AIR] + Zend AMF + Pos...




Wyślij zaproszenie do