0

こんにちは、私は次のレイアウトを持っています:

<SurfaceView 
    android:id="@+id/surf_camera_preview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center" /> 

<TextureView 
    android:id="@+id/txv_camera_preview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center" />     

<LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:layout_gravity="center_horizontal" 
    android:background="#66000000" > 

        <Button
            android:id="@+id/btn_snap"
            android:layout_width="wrap_content"
            android:layout_height="96dp"
            android:text="Take Picture"
            android:onClick="onSnapClicked"
            android:textSize="36sp" />

        <Button
            android:id="@+id/btn_elaborate"
            android:layout_width="wrap_content"
            android:layout_height="96dp"
            android:text="Elaborate"
            android:onClick="onElaborateClicked"
            android:textSize="36sp" />   

TextureView と SurfaceView を使用します (SurfaceView を削除できると思いますが、現時点では方法がわかりません)。

次のメイン アクティビティ:

public class MainActivity extends Activity implement TextureView.SurfaceTextureListener {

private static final String    TAG = "MainActivity";    

// Local references to layout components
private TextureView mTxvCameraPreview;  
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;    

// Camera manager
private CameraManager mCameraManager;   

// Storage directory
private File mBaseOutDir;
private int mcounter = 0; 


// Activity life-cycle -----------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Initialize layout and components
    setContentView(R.layout.activity_main);     
    mTxvCameraPreview = (TextureView)findViewById(R.id.txv_camera_preview);
    mSurfaceView = (SurfaceView) findViewById(R.id.surf_camera_preview);

    // Camera managing
    mCameraManager = new CameraManager(this);
    mTxvCameraPreview.setSurfaceTextureListener(this);
    mSurfaceHolder = mSurfaceView.getHolder();      
}

@Override
protected void onResume() {
    super.onResume();

    if (mTxvCameraPreview.isAvailable())
        mCameraManager.startPreview(mTxvCameraPreview.getSurfaceTexture());     
}

@Override
protected void onPause() {
    super.onPause();
    mCameraManager.stopPreview();
}


// Button call-backs -------------------------------------------------------
public void onSnapClicked(View view) {
    Log.i(TAG, "called: onSnapClicked");
    mcounter++;
    mCameraManager.takeSnapshot(mSnapDir,mcounter);
}   

public void onElaborateClicked(View view) {
    Log.i(TAG, "called: onElaborateClicked");

    // Elaborate and save output combined picture
    mCameraManager.ElaborateAndSave(mSnapDir);

    // Stop the preview
    mCameraManager.stopPreview();

    // Lock Surface
    Canvas canvas = mSurfaceHolder.lockCanvas();

    // Draw bitmap
    File imgFile = new  File(mSnapDir, "combined.jpg");
    if(imgFile.exists()){
        Log.i(TAG, "file: combined.jpg found!");                
        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());    
        canvas.drawBitmap(myBitmap, 0, 0, null);
        mSurfaceHolder.unlockCanvasAndPost(canvas);     
    }
    else{
        Log.i(TAG, "file: combined.jpg not found!!!");          
    }
}   

// TextureView call-backs --------------------------------------------------
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
    mCameraManager.startPreview(surface);       
}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
    mCameraManager.stopPreview();
    return true;
}

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

@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {} // Unused

}

プログラムは、onElaborateClicked(View view) が呼び出されるときのほぼ最後までうまく動作します (いくつかのショットを取り、それらを精巧に作成し、出力 "combined.jpg" ファイルをディレクトリ mSnapDir に保存します)。エラボレーションが正しく実行され、プレビューが停止しますが、画面にビットマップを表示しようとすると機能しません。getHolder() を呼び出すために SurfaceView を追加しました (おそらく最も簡単な方法があります)。

質問は次のとおりです。

1) ビットマップが表示されないのはなぜですか (存在します!)? おそらく、SurfaceView は TextureView の「背面」にあり、表示されませんか?

2) SurfaceView を追加することを避け、TextureView で直接すべての作業を行うことができますか? 最終的なビットマップを表示するためだけに SurfaceView を追加しました (他の方法はわかりません)。

どんな助けでも本当に感謝します。前もって感謝します!

4

0 に答える 0