Autore Topic: Sovrapposizione VideoView e ImageView  (Letto 899 volte)

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Sovrapposizione VideoView e ImageView
« il: 18 Gennaio 2013, 23:54:51 CET »
0
Ciao a tutti, nel mio layout, oltre ad avere diversi elementi nel mio layout.xml ho :

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/spinview"
   style="@style/stylePP"
   android:background="@color/background" >
   
      .......
         
       <VideoView android:id="@+id/spinview_pickrock" android:layout_height="fill_parent" android:layout_width="fill_parent" android:visibility="gone" android:layout_centerInParent="true" android:layout_below="@+id/spin_patchtop"/>
        <ImageView android:id="@+id/spin_covervideo" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" android:layout_centerInParent="true" android:src="@drawable/bgvideobetween" android:visibility="gone"  android:layout_alignTop="@+id/spinview_pickrock"/>
     .......
    />

La risorsa drawable che carico nella ImageView è esattamente uguale al primo frame del video che carico in VideoView. Questo perché quando la mia activity parte, faccio vedere per un paio di secondi la mia ImageView e nel frattempo carico il mediaPlayer nel videoView. Quando il video è pronto nascondo la foto e faccio vedere il video. Caricherò nella mia Imageview anche un altra risorsa drawable che sarà esattamente uguale all'ultimo frame del videoView, quando il video è finito. Questa è la logica con cui sto andando avanti. Il problema è questo:
quando il video finisce e carico l'ImageView esattamente uguale all'ultimo frame del video l'immagine è leggermente più stretta del video, infatti quando avviene lo scambio si vede che il contenuto del video non combacia perfettamente con quello dell'immagine. Questo è strano perché ho ridimensionato imageView,VideoView e bitmap esattamente della stessa misura. Il codice che posto l'ho usato per adattare questi 3 oggetti al mio schermo android.

La mia VideoView la ridimensiono in OnPrepare():

Codice (Java): [Seleziona]
videoRock.setOnPreparedListener(new OnPreparedListener(){

                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                                Log.d("ON PREPARED","OK");

                               
                                int mediaWidth=videoRock.getWidth();
                                int mediaHeight=videoRock.getHeight();
                                float videoRatio=(float)mediaWidth/(float)mediaHeight;

                               
                                Display display=getWindowManager().getDefaultDisplay();
                                int screenWidth=display.getWidth();
                                int screenHeight=display.getHeight();
                                float screenRatio = (float) screenWidth/ (float) screenHeight;
                               
                                android.view.ViewGroup.LayoutParams lp = videoRock.getLayoutParams();
                                if(videoRatio > screenRatio)
                                {
                                        lp.width=screenWidth;
                                        lp.height=(int)((float) screenWidth / videoRatio);
                                }
                                else
                                {
                                        lp.width=(int) (videoRatio * (float) screenHeight);
                                        lp.height=screenHeight;
                                }
                                videoRock.setLayoutParams(lp);
                                Log.d("NEW VIDEOHEIGHT",String.valueOf(lp.height));
                                Log.d("NEW VIDEOWIDTH",String.valueOf(lp.width));
                        }
                       
                });

Questo è il metodo per ridimensionare ImageView e bitmap:


Codice (Java): [Seleziona]
private void scaleImage(Bitmap bit)
        {

                android.view.ViewGroup.LayoutParams lp = videoCover.getLayoutParams();
                lp.height=videoRock.getHeight();
                lp.width=videoRock.getWidth();
                videoCover.setLayoutParams(lp);
                Bitmap resizeBit=Bitmap.createScaledBitmap(bit, videoCover.getWidth(), videoCover.getHeight(), false);
                videoCover.setImageBitmap(resizeBit);
                Log.d("resizedBitmap height",String.valueOf(resizeBit.getHeight()));
                Log.d("resizedBitmap width",String.valueOf(resizeBit.getWidth()));

               
        }

Questo metodo lo utilizzo quando VideoView finisce, quindi in onComplete():

Codice (Java): [Seleziona]
videoRock.setOnCompletionListener(new OnCompletionListener(){

                        @Override
                        public void onCompletion(MediaPlayer mp) {
                               
                               
                                if(firstVideoLoad)
                                {
                                       
                                        setAlphaEnd(false);
                                        Bitmap bi =BitmapFactory.decodeResource(getResources(), R.drawable.bgvideoend);
                                        scaleImage(bi);

                                        enablePickBtn();

                                }

Le dimensioni di ImageView, VideoView e Bitmap coincidono perfettamente...
Qualcuno ha qualche idea?

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Sovrapposizione VideoView e ImageView
« Risposta #1 il: 29 Gennaio 2013, 00:15:12 CET »
0
Sto cercando di risolvere questo problema fissando le dimensioni della mia videoview e ImageView a 480x800. Nonostante questo non riesco a sovrapporre esattamente i due widget. A questo punto mi sta venendo un dubbio colossale:
Se voglio visualizzare un'immagine a 480x800 cosa dovrei fare? Devo settare i parametri dell'Imageview a wrap_content e scalare la mia bitmap a 480x800 oppure devo fissare le dimensioni della mia ImageView a 480x800 e settare come android:src la mia bitmap e scegliere come parametro di scala fitXY? Vi chiedo questo perché nonostante io abbia settato a wrap_content altezza e larghezza della mia imageview e abbia scalato a 480x800 la mia bitmap, se non aggiungo android:scale="fitXY", mi ritrovo un margine destro e sinistro non indifferente (non capisco il motivo dato che ho fissato delle misure statiche che coincidono con il mio schermo).
Ho letto guide varie ma senza risultati..
qualche idea?

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Sovrapposizione VideoView e ImageView
« Risposta #2 il: 31 Gennaio 2013, 23:54:44 CET »
0
Qualcuno sa dirmi perchè non riesco ad impostare l'altezza della videoView prima che parta il video?
I parametri screenWidth e screenHeight corrispondono alla larghezza e altezza del mio display.
Codice (Java): [Seleziona]
videoRock.setOnPreparedListener(new OnPreparedListener(){

                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                                Log.d("ON PREPARED","OK");
                                int videoWidth=0;//339
                                int videoHeight=0;//480
                               
                                android.view.ViewGroup.LayoutParams lp = (android.view.ViewGroup.LayoutParams)videoRock.getLayoutParams();

                               
                                if(screenWidth>=339)
                                {
                                        videoHeight=(int)((float)480 / (float)339 * (float) screenWidth);

                                        videoWidth=screenWidth;
                                       
                                       

                                }
                                lp.height=videoHeight;
                                lp.width=videoWidth;
                               
                                Log.d("HEIGHT VIDEOHEIGHT PARAMETER",String.valueOf(videoHeight));
                                Log.d("WIDTH VIDEOWIDTH PARAMETER",String.valueOf(videoWidth));
                               
                               
                                videoRock.setLayoutParams(lp);

                                Log.d("HEIGHT VIDEO ROCK",String.valueOf(videoRock.getMeasuredHeight()));
                                Log.d("WIDTH VIDEO ROCK",String.valueOf(videoRock.getMeasuredWidth()));

                        }
                       
                });

Conosco a priori le misure del mio video 339x480. Ridimensiono la sua larghezza e altezza precisamente a 480x679. Dal lob generato, il valori di videoHeight=679, il valore di videoWidth=480. Dopo aver dettato questi parametri come layout per la mia videoView (videoRock), il log mi dice che la larghezza di videoRock coincide (480), mentre l'altezza è di 616 invece di 679. Qualcuno sa dirmi perchè? Grazie

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Sovrapposizione VideoView e ImageView
« Risposta #3 il: 02 Febbraio 2013, 00:07:06 CET »
0
Se a qualcuno potrebbe interessare..
ho risolto ricalcolando le dimensioni della mia videoView e Imageview, calcolando prime le dimensioni del display e dell'altezza a disposizione (dato che in totale, altri 2 widget mi occupavano 97 dip in altezza):

Codice (Java): [Seleziona]
private void scaleVideoView()
        {
                        Display display=getWindowManager().getDefaultDisplay();
                //queste dimensioni le conosco a priori
                        final int videoWidth=339;
                        final int videoHeight=480;
               
                        int screenWidth= display.getWidth();
                        int screenHeight= display.getHeight();
                        int screenHeightFree= screenHeight-convertDipToPixels(97);
                 
       
                       
                        int videoWidthTemp=0;
                        int videoHeightTemp=0;
                       
                        android.view.ViewGroup.LayoutParams lp = (android.view.ViewGroup.LayoutParams)videoRock.getLayoutParams();

                        if(videoWidth<=screenWidth)
                        {
                                videoHeightTemp= (int)Math.rint(((float)videoHeight * (float)screenWidth/(float)videoWidth ));
                                videoWidthTemp=screenWidth;
                               
                                if(videoHeightTemp>screenHeightFree)
                                {
                                        videoWidthTemp=(int)Math.rint((((float)videoWidth*(float)screenHeightFree)/(float) videoHeight));
                                        videoHeightTemp=screenHeightFree;
                                }
                        }
                        else if(videoWidth>screenWidth)
                        {
                                videoWidthTemp=(int)Math.rint((((float)videoWidth*(float)screenHeightFree)/(float) videoHeight));
                                videoHeightTemp=screenHeightFree;
                        }
               
                       
                        lp.width=videoWidthTemp;
                        lp.height=videoHeightTemp;
                        videoRock.setLayoutParams(lp);
                       
        }