2014-06-15 105 views
0

我已经创建了自定义相机,可以在一个框架内拍照。但我不打算用一个按钮来捕捉照片,而是一个ontouch事件。我试了几次,但只要我把onTouchListener,它崩溃。我应该使用手势吗?Android自定义相机触摸拍照

这是我的代码。

MainActivity -

public class MainActivity extends Activity { 
private Camera mCamera; 
private CameraPreview mCameraPreview; 
private File pictureFile; 
private Drawable d2; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    ImageView iv = new ImageView(this); 
    iv.setImageResource(R.drawable.richard2); 
    mCamera = getCameraInstance(); 
    mCameraPreview = new CameraPreview(this, mCamera); 
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
    //  final ImageView view = (ImageView) findViewById(R.id.imageView1); 
    preview.addView(mCameraPreview); 
    preview.addView(iv);  


    Button captureButton = (Button) findViewById(R.id.button_capture); 
    captureButton.setOnClickListener(new View.OnClickListener() { 
     @SuppressLint("NewApi") 
     @Override 
     public void onClick(View v) { 
      mCamera.takePicture(null, null, mPicture); 
      //File file1 = getOutputMediaFile(); 
      //Bitmap myBitmap = BitmapFactory.decodeFile(file1.getAbsolutePath()); 
      //Drawable drawable = new BitmapDrawable(getResources(), myBitmap); 
      //view.setBackground(R.drawable.drawable); 
      //view.setImageBitmap(myBitmap); 

     } 
    }); 
} 

/** 
* Helper method to access the camera returns null if it cannot get the 
* camera or does not exist 
* 
* @return 
*/ 
private Camera getCameraInstance() { 
    Camera camera = null; 
    try { 
     camera = Camera.open(); 
    } catch (Exception e) { 
     // cannot get camera or does not exist 
    } 
    return camera; 
} 

PictureCallback mPicture = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     pictureFile = getOutputMediaFile(); 

     if (pictureFile == null) { 
      return; 
     } 
     try { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
     } catch (FileNotFoundException e) { 

     } catch (IOException e) { 
     } 
    } 
}; 

private static File getOutputMediaFile() { 
    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      "MyCameraApp"); 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d("MyCameraApp", "failed to create directory"); 
      return null; 
     } 
    } 
    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") 
      .format(new Date()); 
    File mediaFile; 
    mediaFile = new File(mediaStorageDir.getPath() + File.separator 
      + "IMG_" + timeStamp + ".jpg"); 

    return mediaFile; 
    } 
} 

相机类 -

 public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback   { 
    private SurfaceHolder mSurfaceHolder; 
    private Camera mCamera; 

     // Constructor that obtains context and camera 
     @SuppressWarnings("deprecation") 
     public CameraPreview(Context context, Camera camera) { 
    super(context); 
    this.mCamera = camera; 
    this.mSurfaceHolder = this.getHolder(); 
    this.mSurfaceHolder.addCallback(this); 
    this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     try { 
    mCamera.setDisplayOrientation(90); 
     mCamera.setPreviewDisplay(surfaceHolder); 
     mCamera.startPreview(); 
     } catch (IOException e) { 
     // left blank for now 
     } 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, 
     int width, int height) { 
    // start preview with new settings 
    try { 
    mCamera.setPreviewDisplay(surfaceHolder); 
    mCamera.startPreview(); 
    } catch (Exception e) { 
    // intentionally left blank for a test 
} 
} 
} 

最后,XML文件。

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/container" 
    android:orientation="vertical" > 


<FrameLayout 
    android:id="@+id/camera_preview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 

    /> 

<Button 
    android:id="@+id/button_capture" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:text="9419K" /> 

    </LinearLayout> 
+1

logcat说什么? – eleven

回答

0

有一件事我没有尝试是把一个onclick监听器,所以事实证明,它的工作原理。

preview.setOnClickListener(new View.OnClickListener() { 
     @SuppressLint("NewApi") 
     @Override 
     public void onClick(View v) { 
      mCamera.takePicture(null, null, mPicture); 
    } 
});