2011-01-06 11 views
41

Also habe ich VideoView onMeasure erweitert, um das Video so zu skalieren, dass es in eine Vollbildansicht passt.Video in einem VideoView positionieren

hier, wie:

public void setVideoAspect(int w,int h){ 
    wVideo=w; 
    hVideo=h; 
    onMeasure(w, h); 
} 
@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    if(wVideo!=0 && hVideo!=0) 
    setMeasuredDimension(wVideo,hVideo); 
} 

Ich nenne setVideoAspect() mit den Display-Metriken (Breite, Höhe) des Bildschirms. Das Problem ist, dass diese Methode das Video so streckt, dass es in den Bildschirm passt. Ich möchte das Seitenverhältnis beibehalten können. (Ich habe 4: 3-Video und 3: 2 Bildschirmgröße.) Ich habe den Folowing Code verwenden die zurückgehaltenen Verhältnis Messungen zu der Ansicht zu geben:

int height = (int) (metrics.widthPixels*3/(float)4); 
         int width= metrics.widthPixels; 
         mVideoView.setVideoAspect(width,height); 

So tut dies dem Job, aber es gibt ein Problem: es gibt mir ein 4: 3 Video mit der Breite des Bildschirms und skaliert die Höhe richtig, aber es zentriert das Video nicht. (Es schneidet nur den unteren Teil des Videos ab, nicht gleich oben und unten.) Ich habe ein relatives Layout, das den VideoView enthält, wobei die Schwerkraft des VideoView-Sets zentriert ist.

+0

können Sie stellen den kompletten Code dafür zur Verfügung ... Ich bin schlecht stecken geblieben –

Antwort

106

Verwenden Sie stattdessen ein FrameLayout. Ich bin mir nicht sicher, warum, aber wenn ich eine lineare oder relative in meinem Code verwende, wird es nicht zentrieren, aber Frame tut es. Hier ist die XML, die mein Video auf den Bildschirm passen, um das Verhältnis zu erhalten und Zentrierung es:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/bg"> 
<!-- Video player --> 
<VideoView android:id="@+id/surface_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center"> 
</VideoView> 
</FrameLayout> 
+0

funktioniert mein Code damit? – DArkO

+1

Wenn Sie mit Android arbeiten, wird die Größe des Videos für Sie automatisch angepasst (wenn Sie im Querformat den Bildschirm wahrscheinlich vertikal ausfüllen und dann horizontal skalieren, um das Verhältnis zu halten), dann brauchen Sie diesen Code nicht. Es sollte mit diesem Code arbeiten, wenn Sie es immer noch benötigen, aus welchem ​​Grund auch immer. – Cameron

+2

Ich weiß nicht warum, aber dies wird nicht bei Google angezeigt, wenn nach dem Ausrichten eines Videos in einem VideoView gesucht wird. Ich musste anfangen, die Frage zu schreiben, bevor ich diese mir nahe stehende Antwort erhielt. Vielen Dank! :) – jlindenbaum

7

Um das Videos in dem RelativeLayout zum Zentrum Ich habe sowohl layout_gravity="center" ad layout_centerInParent="true". Es funktioniert auf meinem Android 4.3 Telefon. Dieser Code ist innerhalb onCreate einer Tätigkeit in meinem Code

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <VideoView android:id="@+id/surface_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:layout_centerInParent="true" /> 
</RelativeLayout> 
+1

Wenn Sie VideoView zu match_parent haben, zehn nimmt es den gesamten Raum von RelativeLayout also Android: layout_gravity = "center" und Android: layout_centerInParent = "true" sollte keine Wirkung haben. – Malachiasz

7

Camerons Antwort in einer programmatischen Art und Weise (in wie ich Fall, dass jemand sie braucht) ('this' auf die Aktivität bezieht sich unterhalb)

FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
      LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 

    FrameLayout fl = new FrameLayout(this); 

    fl.setLayoutParams(lp); 

    VideoView vv = new VideoView(this); 

    FrameLayout.LayoutParams lp2 = new FrameLayout.LayoutParams(lp); 

    lp2.gravity = Gravity.CENTER; 

    vv.setLayoutParams(lp2); 

    fl.addView(vv); 

    setContentView(fl); 
+0

Das hat auch für mich funktioniert. –

Verwandte Themen