前言:最近开发需要用到USB外接摄像头,公司提供了一个简单的demo供参考,结果实际运行的时候发现拍照界面的两边会出现彩色的波动条纹一直晃,一开始以为是底层驱动的问题,后来仔细看了下还是代码的问题。demo里的设计思想是绘制一个全局的自定义相机界面,开启一个线程把bitmap图片宽高比设置成4:3一帧帧的显示在界面上形成动态的视觉。但是因为bitmap比实际的画布小所以造成了两边一直晃动的感觉。
原demo代码:
<pre name="code" class="java">package com.camera.simplewebcam; import android.app.Activity; import android.os.Bundle; public class Main extends Activity { CameraPreview cp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); cp = (CameraPreview) findViewById(R.id.cp); } }
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.camera.simplewebcam.CameraPreview
android:id="@+id/cp"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
</span>
<span style="font-size:18px;">package com.camera.simplewebcam;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Runnable {
private static final boolean DEBUG = true;
private static final String TAG="WebCam";
protected Context context;
private SurfaceHolder holder;
Thread mainLoop = null;
private Bitmap bmp=null;
private boolean cameraExists=false;
private boolean shouldStop=false;
// /dev/videox (x=cameraId+cameraBase) is used.
// In some omap devices, system uses /dev/video