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.