写真のプレビュー サイズが携帯電話の画面より小さいアプリがあります。これを修正する方法について多くの投稿やアイデアを読みましたが、プレビューはまだ歪んでいます。
写真の端が画面に表示されないように、プレビュー領域をそのままにして、プレビューを「ストレッチして中央に再配置」することが理想的です。
私が知る限り、写真の高さと幅、および写真の高さと幅のすべての正しい値を取得していますが、ストレッチ係数をどこでどのように調整できるかわかりません。現在、640x480 (または任意のサイズ) の写真が小さいプレビュー エリアに詰め込まれています。
私が使用しているコードは次のとおりです。
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
public Camera camera;
boolean writingFile = false;
Size theBiggest=null;
Size screenSize=null;
Float cameraRatio=null;
Preview(Context context) {
super(context);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
//
// surfaceCreate is called the first time the Camera Tab is loaded
//
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where to draw.
camera = Camera.open();
camera.setDisplayOrientation(90);
// Get For Photo Size
Parameters camparams = camera.getParameters();
// Find the Largest Possible Photo Size
List<Size> sizes = camparams.getSupportedPictureSizes();
int maxWidth = 0;
int maxHeight = 0;
for (Size s : sizes) {
if (s.width > maxWidth || s.height > maxHeight) {
maxWidth = s.width;
maxHeight = s.height;
theBiggest = s;
}
}
// Set Photo Size
camparams.setPictureSize(theBiggest.width, theBiggest.height);
camera.setParameters(camparams);
} // end surfaceCreate()
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
// Because the CameraDevice object is not a shared resource, it's very
// important to release it when the activity is paused.
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
camera.setDisplayOrientation(90);
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = getBestPreviewSize(w, h);
parameters.setPreviewSize(size.width, size.height); // preview size
camera.setParameters(parameters);
camera.startPreview();
}
private Camera.Size getBestPreviewSize(int width, int height)
{
// Get For Photo Size
Camera.Parameters camparams = camera.getParameters();
// Find the Largest Possible Preview Sizes
List<Size> sizes = camparams.getSupportedPreviewSizes();
Camera.Size result=null;
for (Size s : sizes) {
if (s.width <= width && s.height <= height) {
if (result == null) {
result = s;
} else {
int resultArea=result.width*result.height;
int newArea=s.width*s.height;
if (newArea>resultArea) {
result=s;
}
} // end else (result=null)
} // end if (width<width&&height<height)
} // end for
return result;
} // end function
}
ここに私のレイアウトxmlファイルがあります
<FrameLayout android:layout_weight="1"
android:id="@+id/preview"
android:fitsSystemWindows="true"
android:layout_height="0dp"
android:layout_width="wrap_content">
</FrameLayout>
<Button android:text="Take Photo"
android:id="@+id/buttonClick"
android:layout_height="wrap_content"
android:layout_width="200dp"
android:layout_gravity="center"
android:textSize="12sp">
</Button>