2011-01-06 36 views
41

Videoyu tam ekran görünümüne sığacak şekilde büyütmek için VideoView'un onMeasure'ı genişlettim.Video İçinde Video Konumlandırma

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); 
} 

Ben ekranın ekran ölçümlerine (genişlik, yükseklik) ile setVideoAspect() diyoruz: Burada

nasıl. Sorun, bu yöntemin videoyu ekranın içine sığacak şekilde uzatmasıdır. En boy oranını koruyabilmek istiyorum. Ben görünümüne tutulan oran ölçümleri vermek için folowing kodu kullanılır (: 3 video ve 3 2 ekran boyutunu ben 4 vardır.):

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

Yani bu işi yapar ama bir sorun vardır: o verir ekranın genişliğine sahip bir 4: 3 video ve yüksekliği doğru şekilde ölçeklendiriyor ancak videoyu ortalamıyor. (Sadece videonun alt kısmını üstte ve altta eşit bir şekilde kırpmaktadır.) VideoView'u içeren bir göreli düzende VideoView'un merkezileştirilmesi için yerçekimi ayarlanmıştır.

+0

('bu' aşağıda etkinliğe değinmektedir) can Bunun için eksiksiz bir kod sağladım ... –

cevap

106

Bunun yerine bir FrameLayout kullanmayı deneyin. Neden olduğundan emin değilim, ama kodumda bir Doğrusal veya Bağımlı kullanırsam, ortalamaz, ancak Çerçeve yapar. İşte oranını korumak ve ortalayarak, ekrana videomu sığdırmak XML'dir: RelativeLayout videoyu ortalamak amacıyla

<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

kodunun kötü bir şekilde kalması benim kodumun bununla çalışmasını sağlıyor mu? – DArkO

+1

Eğer Android ile iyi iseniz, videoyu sizin için otomatik olarak yeniden boyutlandırırsınız (eğer manzara modundaysa, büyük olasılıkla ekranı dikey olarak dolduracak ve ardından oranı korumak için yatay olarak boyutlandıracaktır). Bu kodlardan herhangi birine ihtiyacınız olacağını düşünmüyorum. Yine de bu kod ile çalışmalı, yine de neden olursa olsun – Cameron

+2

nedenine ihtiyacım varsa, nedenini bilmiyorum, ancak bu bir VideoView içindeki bir videoyu hizalamak için arama yaparken Google’da görünmüyor. Soruyu yazmaya başlamak zorundaydım, bana verilen bu cevabı almadan önce. Teşekkürler! :) – jlindenbaum

7

ben hem layout_gravity="center" reklamı layout_centerInParent="true" eklendi. Android 4.3 telefonumda çalışıyor.

<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

Eğer VideoView match_parent varsa, on RelativeLayout tam alan alıyor bu yüzden android: layout_gravity = "center" ve android: layout_centerInParent = "true" herhangi bir etkisi olmamalıdır. – Malachiasz

7

programlı bir şekilde Cameron'un Cevap (benim gibi durumda birileri buna ihtiyacı içinde) Bu kod benim kodundaki bir faaliyetin onCreate içindedir

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

Bu benim için de çalıştı. –

İlgili konular