Christian Mueller

Flex 3 ApplicationUpdaterUI Labels ändern

Es kann vorkommen, dass man per code die Labels der ApplicationUpdaterUI-Komponente ändern möchte. Ich habe einige Seiten dazu gefunden, aber ohne hilfreiche Informationen.

Hier ein einfacher Weg:

/**
 * @author Christian Müller
 * @date 02.11.2010
 * @url http://www.christian-mueller-design.de
 */
var updater : ApplicationUpdaterUI = new ApplicationUpdaterUI();
updater.configurationFile          = "conf.xml";

// bestehendes resourcebundle laden und anpassen
// wichtig ist das bundle "ApplicationUpdaterDialogs"
var resBundle : ResourceBundle     = ResourceBundle( ResourceManager.getInstance().getResourceBundle( String( ResourceManager.getInstance().localeChain ), "ApplicationUpdaterDialogs" ) );
if (!resBundle) {
 resBundle = new ResourceBundle( String( ResourceManager.getInstance().localeChain ), "ApplicationUpdaterDialogs");
}
resBundle.content["titleWindow"] = "Aktualisiere:";
resBundle.content["titleUpdate"] = "Update verfügbar";
[..]
// neues resourcebundle zuweisen
ResourceManager.getInstance().addResourceBundle( resBundle );
ResourceManager.getInstance().update();
updater.checkNow();

weitere Information in der Flex Dokumentation: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/air/update/ApplicationUpdaterUI.html

Flex SDK 3.5a bugfix auto-updater UI

Heute wurde ein kleines update zur aktuellen SDK-Version 3.5 veröffentlicht. Wer mit der SDK 3.5 versucht hat das native UpdateWindow zum laufen zu bringen, wird sich über dieses update freuen. Mir ging es vor kurzem auch so und ich musste erstmal auf die Version 3.4 wechseln. Im Zusammenhang mit dem Flashplayer 10 ist es natürlich ratsamer die aktuellste SDK zu verwenden.

Man hatte das Problem, dass in der auto-update UI kein Skin geladen wurde und somit ein Update nicht möglich war. Man konnte noch den Umweg gehen, ohne Benutzerbestätigung ein Update auszuführen, aber wer möchte das schon. ;)

Das update hat auch keinen Einfluss auf Anwendungs-Signierung und caching. Habe ich auch schon getestet und kann diese bestätigen.

The refreshed build, SDK 3.5a, has only a few files modified in order to fix this issue and this change does not affect the signing and caching of the SDK 3.5 RSLs originally released in December.

Die neue sdk 3.5a steht in allen 3 Versionen zur Verfügung.
Hier die offizielle Meldung im Adobe blog.

Flex Videodisplay und direkte Zeitmarken

Ich habe momentan das Problem, dass ich bei der Videodisplay-Komponente nicht direkt an eine bestimmte Stelle springen kann. Dieses Problem lässt sich momentan leider nicht umgehen, da man an der Methode seek() nichts anpassen kann. Aus diesem Grund habe ich begonnen einen kleinen workaround zu erstellen. Dazu auch nochmal vielen Dank für den Tipp beim Flex UG event, zu den keyframes innerhalb des Videos, die bei H.264 nochmal anders gesetzt werden.

Der workaround sieht so aus, dass das Video erst dann wieder eingeblendet wird, wenn die Zeitmarke erreicht ist. Das Videodisplay springt automatisch, durch die seek Methode einen kleinen Schritt zurück und das mache ich mir zu nutze. Beim setzten der playheadtime und anschließendem play(), wird ein bitmap erzeugt und über das Video gelegt. Ebenso wird die Lautstärke auf 0 gesetzt. Wird die Zeitmarke wieder erreicht, wird das bitmap entfernt und die Lautstärke zurückgesetzt. Bis zu diesem Punkt wird auch die update-Methode unterbrochen.

/**
 * @author Christian Müller
 * @date 16.01.2010
 * @url http://www.christian-mueller-design.de
 */
package de.cmd.videodisplay {
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.PixelSnapping;
  import flash.display.Sprite;

  import mx.controls.VideoDisplay;
  import mx.events.VideoEvent;

  public class AccurateVideoDisplay extends VideoDisplay {

    private var _targetPositionSet  : Boolean; // if new position set from outside
    private var _targetPlayHeadTime : Number;  // playheadtime video has to reach
    private var _targetVolume       : Number;  // video volume on new playheadtime

    private var _overlayImage       : Sprite;  // sprite containing screenshot of video while loading

    public function AccurateVideoDisplay() {
      super();
      _targetPositionSet     = false;
      playheadUpdateInterval = 50;
      addEventListener( VideoEvent.PLAYHEAD_UPDATE, onPlayHeadUpdateTrigger ); // overwrite event
    }

    override public function get playheadTime():Number {
      return super.playheadTime;
    }

    override public function set playheadTime( value:Number ):void {
      // set target values
      _targetPositionSet  = true;
      _targetPlayHeadTime = value;
      _targetVolume       = this.volume;

      // set new playheadtime
      super.playheadTime  = value;

      // create and add screenshot
      displayWaitingImage();
    }

    override public function play():void {
      super.play();
    }

    // called when playheadtime changes
    private function onPlayHeadUpdateTrigger( event:VideoEvent ):void {

      // playhead update event will not be dispatched until targetplayheadtime reached
      // outside nothing will happen until targettime
      if ( _targetPositionSet ) {
        event.stopImmediatePropagation();
      }

      // check if target playheadtime reached
      if ( playheadTime >= _targetPlayHeadTime ) { // success
      // screenshot existing
        if ( _overlayImage != null ) {
        var index : Number = getChildIndex( _overlayImage );
          if ( index > -1 ) {
          // remove screenshot and recreate old state
          removeChildAt( index );
          _overlayImage      = null;
          volume             = _targetVolume;
          _targetPositionSet = false;
          }
        }
      }
    }

    // create screenshot of current videoposition
    private function displayWaitingImage():void {
      // set remove sound and add screenshot
      volume = 0;

      var screenshot : BitmapData = new BitmapData( this.width, this.height );
      screenshot.draw( this );
      var overlayImageBmp : Bitmap = new Bitmap( screenshot, PixelSnapping.AUTO, true );
      _overlayImage = new Sprite();
      _overlayImage.addChild( overlayImageBmp );
      addChild( _overlayImage );
    }
  }
}

Der Entwicklungsstand ist ehr als Alpha zu bezeichnen, da nur Standardoperationen verwendet werden. Allerdings dient sie schonmal als gute Basis.

Ich würde mich auch über andere Ratschläge oder Weiterentwicklungen freuen.

Aktualisierungproblem Flex Combobox

Auf pixeltex.com habe ich einen kleinen Artikel zum Problem der dynamischen Aktualisierung der Flex Combobox geschrieben. Seit einigen SDKs besteht das Problem darin, dass bei Änderung des Dataproviders die Dropdown-Liste nicht angepasst wird. Das kann dann störend sein, wenn zur Anwendungslaufzeit die Liste mehrfach angepasst wird.

zum Artikel:
Flex-Snippet: aktualisieren der Liste einer Combobox zur Laufzeit

Twitter

  • Quatsch Comedy Club -
    http://t.co/zp15KjYs
    2012/02/04 00:27
  • Admiralspalast im Winter -
    http://t.co/fxafCyb8
    2012/02/04 00:55
  • Wow, did not know that #cycling in #britain is so dangerous
    http://t.co/Ug6EvIY2
    2012/01/30 18:27
  • wow RT @FITC: Using a data visualization of the children's brain waves @B__REEL created upholstery for a unique chair
    http://t.co/ohZEYpTy
    2012/01/30 17:04
  • Ha, ok. It was the fault of the #MWSearch extension. Nice to know
    2012/01/30 09:14