android camera surfaceview 变形,使用Camera预览显示变形问题
本人使用Camera显示预览图竖屏显示会有一些拉伸。感觉被拉长了。本人已经选择了最接近的比例了,但是还是有拉伸。packagecom.example.zxing_android;importjava.io.IOException;importjava.util.List;importcom.example.zxing_android.R.color;importandroid.app.A...
本人使用Camera显示预览图竖屏显示会有一些拉伸。感觉被拉长了。
本人已经选择了最接近的比例了,但是还是有拉伸。
package com.example.zxing_android;
import java.io.IOException;
import java.util.List;
import com.example.zxing_android.R.color;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout.LayoutParams;
/**
*/
public class CameraActivity extends Activity {
SurfaceView mSurface;
SurfaceHolder mSurfaceHolder;
Camera mCamera;
boolean isInit;
Button btn;
// int viewWidth, viewHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mSurface = (SurfaceView) findViewById(R.id.camera);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(null);// 自动对焦
}
});
mSurfaceHolder = mSurface.getHolder(); // get the camera holder
mSurfaceHolder.addCallback(new Callback() {
@Override
public void surfaceCreated(SurfaceHolder arg0) {
mCamera = Camera.open(); // open camera
isInit = false;
try {
mCamera.setPreviewDisplay(mSurfaceHolder); // set the //
} catch (IOException e) {
e.printStackTrace();
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
mCamera.startPreview(); // state preview
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// mSurface.setLayoutParams(new LayoutParams(viewWidth,
// viewHeight));
mCamera.setPreviewCallback(null); // !这个必须在前,不然退出出错
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
initCamera(width, height);
}
});
}
private void initCamera(int width, int height) {
if (!isInit) {
// viewWidth = width;
// viewHeight = height;
isInit = true;
mCamera.autoFocus(null);
Camera.Parameters parameters = mCamera.getParameters();
// 摄像头旋转
// if (android.os.Build.VERSION_CODES.GINGERBREAD >
// android.os.Build.VERSION.SDK_INT) {
mCamera.setDisplayOrientation(90);
// } else {
// parameters.set("rotation", 180);
// }
List previewSizes = mCamera.getParameters().getSupportedPreviewSizes();
double aspectTolerance = Double.MAX_VALUE;
int preWidth = 0, preHeight = 0;
double scale = ((double) width) / height;
for (int i = 0, len = previewSizes.size(); i
Size s = previewSizes.get(i);
double sizeScale = ((double) s.height) / s.width;
if (Math.abs(scale - sizeScale)
aspectTolerance = Math.abs(scale - sizeScale);
preWidth = s.height;
preHeight = s.width;
}
}
if (preWidth != 0) {
parameters.setPreviewSize(preWidth, preHeight);
// mSurface.setLayoutParams(new LayoutParams(720, 1280));
Size s = parameters.getPreviewSize();
Log.e("", s.width + " " + s.height);
}
}
}
}
解决方案
10
输出下getSupportedPreviewSizes的全部值。例如1080*720
假如你竖屏是用整个手机屏幕显示预览,那么手机的长宽比例和预览返回的相差太多了。拉伸应该是不可避免。
不想拉伸的话就缩小屏幕显示的范围吧。
90
引用:
应该先设置预览参数再打开预览图。
CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明使用Camera预览显示变形问题!
更多推荐
所有评论(0)