こんにちは、私は次のレイアウトを持っています:
<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 を追加しました (他の方法はわかりません)。
どんな助けでも本当に感謝します。前もって感謝します!