2011-01-06 2 views
41

Итак, я расширил видеоизображение VideoView, чтобы увеличить видео, чтобы оно соответствовало полноэкранному просмотру.Позиция видео внутри видеообзора

вот как:

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

Я называю setVideoAspect() с метриками отображения (ширина, высота) экрана. Проблема заключается в том, что этот метод растягивает видео, чтобы он находился внутри экрана. Я хочу удержать соотношение сторон. (У меня есть 4: 3 видео и 3: 2 размера экрана.) Я использовал ниже код, чтобы дать нераспределенное измерение соотношения с точкой зрения:

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

Так что это делает работу, но есть проблема: он дает мне 4: 3 видео с шириной экрана и правильно масштабирует высоту, но оно не центрирует видео. (Он просто обрезает нижнюю часть видео, а не сверху и снизу). У меня есть относительный макет, содержащий VideoView, с гравитацией видеообзора, установленным в центр.

+0

может вы предоставляете полный код для этого ... Я застрял плохо –

ответ

106

Попробуйте вместо этого использовать FrameLayout. Я не уверен, почему, но если я использую Linear или Relative в моем коде, он не будет центрировать, но Frame делает. Вот XML, который соответствует моему видео на экран, сохраняя соотношение и центрированное:

<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

ли мой код работает с этим? – DArkO

+1

Если у вас все в порядке, Android автоматически изменит размер видео для вас (если в ландшафте, скорее всего, будет заполнять экран по вертикали, а затем будет горизонтально, чтобы сохранить соотношение). Я не думаю, что вам понадобится какой-либо из этого кода. Он должен работать с этим кодом, хотя, если вам все еще нужно по какой-либо причине – Cameron

+2

Я не знаю почему, но это не отображается в Google при поиске выравнивания видео в VideoView. Я должен был начать писать вопрос, прежде чем я получил этот связанный ответ, предложенный мне. Благодаря! :) – jlindenbaum

7

Для того, чтобы центрировать видео в RelativeLayout я добавил как layout_gravity="center" объявление layout_centerInParent="true". Он работает на моем телефоне Android 4.3.

<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

, если у вас есть VideoView to match_parent, десять занимает полное пространство RelativeLayout, поэтому android: layout_gravity = "center" и android: layout_centerInParent = "true" не должно иметь никакого эффекта. – Malachiasz

7

Ответ Камерона в программный способ (на случай, если кто-то, как мне это нужно) Этот код находится внутри OnCreate одного из видов деятельности в моем коде («это» ниже, относится к деятельности)

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

Это работало и на меня. –

Смежные вопросы