您的位置:首页 > 其它

自制Camera例子——更改摄像头预览大小

2016-05-30 11:36 399 查看
我们仍然通过Camera.Parameters去修改摄像头的属性。
parameter.setPreviewSize(w,h) 去修改显示大小。
注意:里面的w,h并不是随意书写的,也是要手机的相机支持才行。否则重置parameter的时候会失败。所以我们在修改Camera显示大小的时候,还是要首先获取当前手机所支持的显示大小列表列表,然后再从列表中遍历获取跟我们指定大小最合适(根据需求而定)的一组值就可以了。
MainActivity:
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

//Camera显示最大宽度
public static final int MAX_W = 200;
//Camera显示最大高度
public static final int MAX_H = 200;

private SurfaceView camera_view;
private Camera camera;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});

camera_view = (SurfaceView) findViewById(R.id.camera_view);
SurfaceHolder holder = camera_view.getHolder();
holder.addCallback(this);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
Camera.Parameters parameters = camera.getParameters();

//设置显示试图,显示视图
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
//设置相机方向,钟祥
parameters.set("orientation", "portrait");

camera.setDisplayOrientation(90);
//对于Android 2.2及以上版本
parameters.setRotation(90);
} else {
//横向
parameters.set("orientation", "landscape");
camera.setDisplayOrientation(0);
//对于Android 2.2及以上版本
parameters.setRotation(90);
}

//设置Carema显示大小
//当前最适合的宽度
int bestW = 0;
//当前最适合的高度
int bestH = 0;
//获取相机所有支持的显示大小列表
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
if (sizes != null && sizes.size() > 0) {
Iterator<Camera.Size> cel = sizes.iterator();
while (cel.hasNext()) {
Camera.Size size = cel.next();
/**
* 根据需求修改最合适的款、高
* 这里选择的是:当前大小大于最佳大小,但小于设定的上限就修改
*/
if (size.width > bestW && size.width < MAX_W &&
size.height > bestH && size.height < MAX_H) {
bestW = size.width;
bestH = size.height;
}
}
}

//当最佳值都不为0的时候,修改显示大小
if (bestW != 0 && bestH != 0) {
parameters.setPreviewSize(bestW, bestH);
//修改SurfaceView显示视图大小
ViewGroup.LayoutParams params = camera_view.getLayoutParams();
params.width = bestW;
params.height = bestH;
	      camera_view.setLayoutParams(params);
} camera.setParameters(parameters); camera.setPreviewDisplay(holder); } catch (Exception e) { camera.release(); e.printStackTrace(); } camera.startPreview(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); ; camera.release(); camera = null; } @Override protected void onDestroy() { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } super.onDestroy(); }}XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.my.camerademo.MainActivity"
tools:showIn="@layout/activity_main">

<SurfaceView
android:id="@+id/camera_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Demo下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  camera 摄像头