Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

TAndroidVideo-Bug?

  Alt 23. Apr 2014, 16:22
Hi,

ich hänge gerade an einem Fehler in der Videoklasse von Firemonkey. Die Wiedergabe von Webstreams funktioniert nicht richtig, genauer gesagt wird die Anzeige nicht auf das Vollbild skaliert.
Was ich genau geändert habe, damit es überhaupt geht ist folgendes:

Delphi-Quellcode:
 TOnPreparedListener = class(TJavaLocal, JMediaPlayer_OnPreparedListener)
  private
    FParent: TAndroidVideo;
  public
    constructor Create(const Parent: TAndroidVideo);
    procedure onPrepared(mp: JMediaPlayer); cdecl;
  end;

...
constructor TOnPreparedListener.Create(const Parent: TAndroidVideo);
begin
  inherited Create;
  FParent := Parent;
end;

procedure TOnPreparedListener.onPrepared(mp: JMediaPlayer); cdecl;
var
  width, height: Integer;
begin
  CallInUIThread(
    procedure
    begin
      width := mp.getVideoWidth;
      height := mp.getVideoHeight;
      Toast('Start Video: ' + inttostr(width) + 'x' + inttostr(height));
      FParent.FVideoSize := TSize.Create(width, height);
      FParent.RealignView;
    end);
end;
..
constructor TAndroidVideo.Create(const AFileName: string);
begin
  inherited Create(AFileName);
  FVideoSize := TSize.Create(0, 0);
  CallInUIThread(
    procedure
    begin
      FOnPrepareListener := TOnPreparedListener.Create(Self);

      FDialog := TJDialog.JavaClass.init(SharedActivity, -1);
      FDialog.setCancelable(True);
      FVideoPlayer := TJVideoView.JavaClass.init(SharedActivity);
      FVideoPlayer.setOnPreparedListener(FOnPrepareListener);
      FVideoPlayer.setVideoPath(StringToJString(FileName));

      FVideoPlayer.setMediaController(TJMediaController.JavaClass.init
        (SharedActivity));
      FVideoPlayer.requestFocus(0);

      FLayout := TJLinearLayout.JavaClass.init(SharedActivity);
      FLayout.addView(FVideoPlayer);

      FDialog.setContentView(FLayout);
      RealignView;
    end);

  FOrientationChangedId := TMessageManager.DefaultManager.SubscribeToMessage
    (TOrientationChangedMessage, OrientationChangedHandler);
end;

procedure TAndroidVideo.RealignView;
const
  GreatThatScreen = 100;
  // To be sure that destination rect will fit to fullscreen
var
  VideoRect: TRectF;
begin
  if Assigned(FLayout) and (not FVideoSize.IsZero) then
  begin
    VideoRect := TRectF.Create(0, 0, FVideoSize.width * GreatThatScreen,
      FVideoSize.height * GreatThatScreen);
    VideoRect.Fit(TRectF.Create(0, 0, Screen.Size.width, Screen.Size.height));

    FLayout.setPadding(VideoRect.Round.Left, VideoRect.Round.Top,
      Screen.Size.width - VideoRect.Round.Right, Screen.Size.height -
      VideoRect.Round.Bottom);
  end;
end;
Ich bekomme die korrekte Bildgröße geliefert, aber er pappt beim RealignView das Bild an die obere linke Ecke und belässt die Größe der Anzeige bei ziemlich genau dem was onPrepared geliefert wird.

Hat jemand eventuell eine Idee? Das scheint als ob FLayout einfach nicht verwendet wird.
  Mit Zitat antworten Zitat