Camera2 API に問題があります。基本的には Google のサンプル コード (Camera2Basic) を使用していますが、TextureView のサイズを変更して、画面全体に広がらないようにしています。画面にはToolBar
.
私が得ているプレビュー表示は非常に歪んでいます。
The TextureView size is w:1080 h:1620 (2/3)
The preview size is w:720 h:480 (3/2)
configureTransform のコードは次のとおりです。
private void configureTransform(int viewWidth, int viewHeight) {
if (null == mTextureView || null == mPreviewSize || null == activity) {
return;
}
Log.i(CameraFragment.LOG_TAG, "viewWidth: " + viewWidth + " viewHeight: " + viewHeight + " ratio: " + (float)viewWidth/(float)viewHeight);
Log.i(CameraFragment.LOG_TAG, "previewWidth: " + mPreviewSize.getWidth() + " previewHeight: " + mPreviewSize.getHeight() + " ratio: " + (float)mPreviewSize.getWidth()/(float)mPreviewSize.getHeight());
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
Matrix matrix = new Matrix();
RectF viewRect = new RectF(0, 0, viewWidth, viewHeight);
RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth());
float centerX = viewRect.centerX();
float centerY = viewRect.centerY();
if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {
bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());
matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
float scale = Math.max(
(float) viewHeight / mPreviewSize.getHeight(),
(float) viewWidth / mPreviewSize.getWidth());
matrix.postScale(scale, scale, centerX, centerY);
matrix.postRotate(90 * (rotation - 2), centerX, centerY);
} else if (Surface.ROTATION_180 == rotation) {
matrix.postRotate(180, centerX, centerY);
}
mTextureView.setTransform(matrix);
}