2012-10-10 21 views
6

Sono completamente perplesso su qualcosa che ho pensato sarebbe la cosa più semplice di sempre. Sto cercando di riprodurre un video all'interno di una cornice in un layout relativo.Riproduci video su una parte dello schermo

Si noti che l'applicazione è progettata per funzionare su un dispositivo molto specifico (scheda Internet Archos 101) in modalità orizzontale, e i video sono pre-codificati con una dimensione molto specifica di 480x360, motivo per cui il layout ne ha alcuni dimensioni.

Ecco il layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<!-- Background --> 
<ImageView 
    android:layout_width="980dp" 
    android:layout_height="568dp" 
    android:src="@drawable/bg_video" /> 

<TextView 
    android:id="@+id/video_headtext" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="73dp" 
    android:layout_marginLeft="255dp" 
    android:textColor="#FFFFFF" 
    android:textSize="16dp" /> 

<TextView 
    android:id="@+id/video_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="#FFFFFF" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="112dp" /> 

<VideoView 
    android:id="@+id/video_videocontainer" 
    android:layout_width="480dp" 
    android:layout_height="360dp" 
    android:layout_below="@id/video_title" 
    android:layout_marginTop="10dp" 
    android:layout_centerHorizontal="true" /> 

</RelativeLayout> 

carico il video utilizzando questo codice

player = (VideoPlayer) findViewById(R.id.video_videocontainer); 
player.setVideoURI(videoUri); 

Il codice funziona, ma mentre il VideoView è correttamente all'interno del telaio, il video stesso svolge da qualche parte nel parte superiore dello schermo e solo una parte di essa viene mostrata in VideoView.

Esempio di cosa succede here (Questo è solo un video temporaneo per il debug). Screenshot del video nello stesso momento here.

Come si può vedere, VideoView mostra solo parte del video, riempiendo il resto con il nero.

Sono sicuro che mi manca qualcosa di veramente semplice, ma non riesco a capire cosa.

Grazie in anticipo.

EDIT: Ho provato a scrivere una classe VideoPlayer che si estende VideoView e sovrascrive onMeasure come questo

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    setMeasuredDimension(480, 360); 
} 

public void changeVideoSize() 
{ 
    getHolder().setFixedSize(480, 360); 

    requestLayout(); 
    invalidate(); 
} 

Ma non aiuta un singolo bit.

EDIT 2: provato con SurfaceView e MediaPlayer, stesso risultato. Ho la sensazione di non aver capito il principio della riproduzione di un video su Android. Rimanere abbastanza bloccato qui.

EDIT 3: Ho provato su un Samsung Galaxy HD e il video mostra correttamente all'interno del telaio. Mi chiedo se questo è un problema con il tablet o con 2.2?

EDIT 4: AVD in esecuzione in 2.2 non esegue correttamente il rendering del video. AVD in esecuzione 4.1 fa. Immagino che lo restringe un po '.

risposta

3

Ho avuto un problema simile con un video che aveva un profilo troppo alto per quel particolare dispositivo (2.1) da gestire e funzionava bene per Android 4.0.

Oltre a questo, sto utilizzando SurfaceView e il trucco è stato quello di aggiungere i listener agli eventi per MediaPlayer (setOnVideoSizeChangedListener in particolare) e il callback alla superficie collegata agli eventi del mediaplayer.

+0

ho riscritto con un SurfaceView e ora sto affrontando qualcosa di veramente strano. Il video viene riprodotto all'esterno di SurfaceView, proprio come con VideoView. Solo che non è ritagliata e mostra in cima a tutto. Anche quando uso 'setDisplay (null)', il video mostra ancora! –

+0

hai implementato il callback del supporto della superficie e collegato gli eventi per esso? – petrumo

+0

Sono riuscito a ottenere un po 'meglio il video dopo aver seguito il tuo esempio. Non è ottimale e non riesco ancora a credere che sia così difficile posizionare un video all'interno di una vista, ma per ora funziona. Grazie! –

0

Imposta l'attributo VideoView setZOrderOnTop su true e controlla se funziona. Per esempio se ho un VideoView chiamato qvideo tutto

qvideo.setZOrderOnTop(true); 
+0

Sfortunatamente questo non cambia nulla. –

Problemi correlati