1. 程式人生 > >android自定義相機、連續(自動)聚焦、點選(觸控)聚焦、變焦、拍照後自定義裁剪、旋轉

android自定義相機、連續(自動)聚焦、點選(觸控)聚焦、變焦、拍照後自定義裁剪、旋轉

最近做了一個圖片識別、以及搜尋的小專案,其中有一個模組是拍照以及拍照後對圖片進行剪下,開始用的系統的相機和裁剪,由於系統的相機和裁剪多出了一些不必要的步驟和啟動慢等等帶給使用者的體驗不好,故自己寫了一個,下面給大家簡要介紹下:

自定義相機:定義SurfaceView得到SurfaceHolder,然後添加回調

<span style="white-space:pre">		</span>surface_camera = (SurfaceView) findViewById(R.id.camera_preview);
		view_focus = findViewById(R.id.view_focus);
		surface_holder = surface_camera.getHolder();
		surface_holder.addCallback(this);
在回撥中將SurfaceView和camera關聯在一起,然後進行初始化、連續對焦然後銷燬,這裡簡單把程式碼粘一下
@Override
	public void surfaceCreated(SurfaceHolder holder) {
		
		if(camera != null){
			try {
				camera.setPreviewDisplay(surface_holder);
			} catch (IOException e) {
				System.out.println(e);
			}
		}

		mode = MODE.FOCUSING;
		updateCameraParameters();
		camera.startPreview();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		
		camera.autoFocus(new AutoFocusCallback() {

			@Override
			public void onAutoFocus(boolean arg0, Camera arg1) {
				// TODO Auto-generated method stub
				if (arg0) {
					updateCameraParameters();// 實現相機的引數初始化
				}
			}
		});
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		if (camera != null && holder != null) {
			camera.stopPreview();
			camera.release();
			camera = null;
		}
	}
在實現連續對焦的方式我是採用的感測器實現的,通過手機位置或者說角度發生微弱變化然後呼叫對焦功能,這樣子和實際的系統自帶的相機的體驗差不多
	@Override
		public void onSensorChanged(SensorEvent arg0) {
			// TODO Auto-generated method stub
			
			float x = arg0.values[0];
		    float y = arg0.values[1];
		    float z = arg0.values[2];
		    
		    if (!mInitialized){
		        mLastX = x;
		        mLastY = y;
		        mLastZ = z;
		        mInitialized = true;
		    }
		    
		    float deltaX  = Math.abs(mLastX - x);
		    float deltaY = Math.abs(mLastY - y);
		    float deltaZ = Math.abs(mLastZ - z);
		    
		    if(deltaX > .3 || deltaY > .3 || deltaZ > .3){
		    	
		    	if(CustomCameraView.camera != null){
		    		cameraView.setFocus();
		    	}
		    }
		 
		    mLastX = x;
		    mLastY = y;
		    mLastZ = z;
		}
變焦的話,就不多說了就是簡單的silder實現的,“點選對焦”簡單呼叫自動對焦實現的,這裡也存在了一個問題就是開啟相機之後,如果進行了點選對焦之後就不能進行連續對焦了,這裡我只用到了連續對焦沒有使用點選對焦,所以就沒有深入探究原因。

拍照後儲存

<span style="white-space:pre">	</span>/**
	 * 拍照
	 */
	public void takePicture() {
		
		if (camera != null) {
			camera.takePicture(null, null, new PictureCallback() {

				@Override
				public void onPictureTaken(byte[] data, Camera camera) {
					File folder = new File(Environment
							.getExternalStorageDirectory().getAbsolutePath()
							+ CUSTOMECAMERA_PHOTO_PATH);
					if (folder.exists() == false) {
						folder.mkdirs();
					}
					File pictureFile = new File(folder.getAbsoluteFile(),
							"temp.jpg");
					
					try {
						FileOutputStream fos = new FileOutputStream(pictureFile);
						fos.write(data);
						fos.close();
						
						if (onTakePictureInfo != null) {
							onTakePictureInfo.onTakePictureInofo(true);
						}

					} catch (Exception e) {
						if (onTakePictureInfo != null) {
							mode = MODE.NONE;
							onTakePictureInfo.onTakePictureInofo(false);
						}
					}
				}
			});
			
			mode = MODE.NONE;
		}
	}

關於剪下拿到了的原始碼,在上面進行了簡要的修改,我這裡需要的是橫屏,最後的結果:

拍照介面


裁剪介面

下載地址:http://download.csdn.net/detail/u012350993/8285313,裡面一些東西我沒有去除,檔案有點略大。