问题描述
我们正在尝试类似 Instagram
相机屏幕。即允许用户使用正方形
照片。在执行它时,U.i必须能够让用户在 fullScreen
模式下看到相机。我们要强制用户在肖像
模式下拍摄图像
We are trying to build something similar to Instagram
Camera screen. i.e allow the user taking square
photos. While doing it out U.i must be able to let the user see the camera on fullScreen
mode. We want to force the user to take an image in a portrait
mode
我们计算相机
的最佳
比率>
We are calculating the best
ratio available from camera
by
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) h / w;
if (sizes == null) {
return null;
}
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) {
continue;
}
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
全屏。
$ b b
Make it full screen.
public FrameLayout setCameraLayout(int width, int height) {
float newProportion = (float) width / (float) height;
// Get the width of the screen
int screenWidth = this.customCameraActivity.getWindowManager().getDefaultDisplay()
.getWidth();
int screenHeight = this.customCameraActivity.getWindowManager().getDefaultDisplay()
.getHeight();
float screenProportion = (float) screenWidth / (float) screenHeight;
// Get the SurfaceView layout parameters
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)preview.getLayoutParams();
if (newProportion > screenProportion) {
lp.width = screenWidth;
lp.height = (int) ((float) screenWidth / newProportion);
} else {
lp.width = (int) (newProportion * (float) screenHeight);
lp.height = screenHeight;
}
//calculate the amount that takes to make it full screen (in the `height` parameter)
float propHeight = screenHeight / lp.height;
//make it full screen(
lp.width = (int)(lp.width * propHeight);
lp.height = (int)(lp.height * propHeight);
frameLayout.setLayoutParams(lp);
return frameLayout;
}
setCameraLayout调用者
OnCreate
c>活动之后 surfaceChanged
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (getHolder().getSurface() == null) {
return;
}
try {
cameraManager.getCamera().stopPreview();
} catch (Exception e) {
// tried to stop a non-existent preview
}
try {
Camera.Parameters cameraSettings = cameraManager.getCamera().getParameters();
cameraSettings.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
this.cameraView.setCameraLayout(mPreviewSize.width, mPreviewSize.height);
cameraManager.getCamera().setParameters(cameraSettings);
cameraManager.getCamera().setPreviewDisplay(holder);
cameraManager.getCamera().startPreview();
} catch (Exception e) {
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
目标
全屏相机预览手机。
Goal
Fullscreen camera preview on phone.
没有变化,这是 GOOD!,它有与电话
相同的 height
这也是 GOOD!。 但是!,预览
的宽度大于手机宽度
),所以它的结果是相机的中心不在手机的中心。我们已经考虑过的可能解决方案:
Now we are getting the preview with no distortion which is GOOD! and it has the same height
as the phone
as well which is also GOOD!. But! the width of the preview
is bigger than the phone width
(of-course) so it turns out the the center of the camera is not on the center of the phone. Possible solutions we have thought about:
-
移动
使预览中心位于屏幕中心。 -
crop
布局并仅绘制
move
the layout left to negative position to make the preview center in the center of the screen.crop
the layout and draw only the center of thenew preview
that should be visible to thephone screens
$ b可以看到新预览 b
任何想法如何解决这个问题?
感谢老大! :)
Any ideas how to overcome this issue?
Thanks alot! :)
推荐答案
我成功管理了预览,通过设置SurfaceView的重力:
I managed successfully center the preview by setting gravity of SurfaceView:
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(wid, hei);
lp.gravity = Gravity.CENTER;
mSv.setLayoutParams(lp);
代码段取自,如果你有耐心来解密它,欢迎使用代码。我想我解决了类似的问题(预览旋转,扭曲,适合/填充)
The code snippet is taken from here, and you're welcome to use the code if you have the patience to decipher it. I think I was solving similar issues (preview rotation, distortion, fit-in/fill)
好运。
这篇关于Android全屏相机 - 同时保持相机选择的比率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!