2016-05-25 28 views
5

Sto utilizzando google ufficiale sample per aggirare la registrazione video utilizzando Camera API 2. ma il problema è che non sono in grado di renderlo a schermo intero poiché ho limitato l'orientamento dello schermo solo al ritratto. Ecco l'xml che ho modificato e lo official xml.Telecamera 2: impossibile registrare video a schermo intero?

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <AutoFitTextureView 
     android:id="@+id/texture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" /> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true"> 

     <Button 
      android:id="@+id/video" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="@string/label_record" /> 

     <ImageView 
      android:id="@+id/info" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical|right" 
      android:contentDescription="Description" 
      android:padding="20dp" 
      android:src="@drawable/ic_more" /> 

    </FrameLayout> 

</RelativeLayout> 

penso qui è l'impostazione della dimensione dello schermo video razione aspetto al TextureView ma non ho potuto fare a schermo intero. Qualsiasi aiuto è molto apprezzato.

mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class)); 
mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, mVideoSize); 
int orientation = getResources().getConfiguration().orientation; 
if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
} else { 
    mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth()); 
} 

enter image description here

risposta

1

È necessario gestire le dimensioni di anteprima per controllare le dimensioni dello schermo della registrazione. utilizzare lo stesso metodo chooseVideoSize per rendere l'anteprima a schermo intero ottenendo le dimensioni di output della classe SurfaceTexture.

private static Size chooseVideoSize(Size[] choices) { 
     for (Size size : choices) { 
      if (size.getWidth() == size.getHeight() * 4/3 && size.getWidth() <= 1080) { 
       return size; 
      } 
     } 
     Log.e(TAG, "Couldn't find any suitable video size"); 
     return choices[choices.length - 1]; 
    } 

che è

mPreviewSize = chooseVideoSize(map.getOutputSizes(SurfaceTexture.class)); 
+0

Sì .. E 'working..thanks :) – Stella

1

forse si potrebbe implementare un metodo transform che scala e ruota l'TextureView per l'orientamento corretto.

private void transformImage(int width, int height) { 
    if (mPreviewSize == null || mTextureView == null) { 
     return; 
    } 
    Matrix matrix = new Matrix(); 
    int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
    RectF textureRectF = new RectF(0, 0, width, height); 
    RectF previewRectF = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth()); 
    float centerX = textureRectF.centerX(); 
    float centerY = textureRectF.centerY(); 
    if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) { 
     previewRectF.offset(centerX - previewRectF.centerX(), 
       centerY - previewRectF.centerY()); 
     matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL); 
     float scale = Math.max((float) width/mPreviewSize.getWidth(), 
       (float) height/mPreviewSize.getHeight()); 
     matrix.postScale(scale, scale, centerX, centerY); 
     matrix.postRotate(90 * (rotation - 2), centerX, centerY); 
    } 
    mTextureView.setTransform(matrix); 
} 

Dopo di che si dovrebbe chiamare trasformare metodo dal onResume:

public void onResume() { 
    super.onResume(); 
    if (mTextureView.isAvailable()) { 
     transformImage(mTextureView.getWidth(), mTextureView.getHeight()); 
    } else { 
     mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); 
    } 
} 

E su SurfaceTextureListener.Callback:

private TextureView.SurfaceTextureListener mSurfaceTextureListener = 
     new TextureView.SurfaceTextureListener() { 
      @Override 
      public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
       transformImage(width, height); 
      } 

      @Override 
      public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
      } 

      @Override 
      public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
       return false; 
      } 

      @Override 
      public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
      } 
     }; 

Source.

Problemi correlati