`
crazysumer
  • 浏览: 49602 次
社区版块
存档分类
最新评论

【2013.07.15】自定义SurfaceView、自定义相机

 
阅读更多

1.自定义SurfaceView

SurfaceView是一个跟TextView、ImageView同等的控件,我们可以自定义TextView等,当然也可以自定义SurfaceView。在引用的时候,只需写出自定义SurfaceView的全类名即可。

新建CameraView类,继承自SurfaceView

 

public class CameraView extends SurfaceView implements
		android.view.SurfaceHolder.Callback {

	Camera camera;
	SurfaceHolder holder;
	Parameters para;

	/**
	 * @描述 官方文档说raw是未经压缩的图像数据,尝试着去写,但是未能成功
	 * 小提示 (NOTE: the data will be null if there
	 *     is no raw image callback buffer available or the raw image callback
	 *     buffer is not large enough to hold the raw image)
	 * */
	PictureCallback rawCallback = new PictureCallback() {

		@Override
		public void onPictureTaken(byte[] data, Camera camera) {
			camera.stopPreview();
			savePhoto(data);
			camera.startPreview();

		}
			//这样的写入照片是错误的,无法载入图片
		private void savePhoto(byte[] data) {

			String dirPath = Environment.getExternalStorageDirectory()
					.getAbsolutePath() + "/AAcamera/";
			File dirFile = new File(dirPath);
			if (!dirFile.exists()) {
				dirFile.mkdirs();
			}
			String fileName = String.valueOf(System.currentTimeMillis())
					+ ".jpeg";
			System.out.println(dirPath);
			File file = new File(dirPath + fileName);
			FileOutputStream fos;

			if (!file.exists()) {
				try {
					file.createNewFile();
					FileInputStream fis = new FileInputStream(new String(data));
					
					fos = new FileOutputStream(file);
					int len = -1;
					while((len = fis.read())!= -1){
						fos.write(data, 0, len);
					}

					fis.close();
					fos.flush();
					fos.close();

				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		}
	};
/**
 * 
 * @描述  jpeg  callback  在此保存jpeg格式的图片
 * */
	PictureCallback jpegCallback = new PictureCallback() {

		@Override
		public void onPictureTaken(byte[] data, Camera camera) {

			camera.stopPreview();
			savePhoto(data);
			camera.startPreview();

		}

		private void savePhoto(byte[] data) {
			Bitmap bm = null;
			if (data != null) {
				bm = BitmapFactory.decodeByteArray(data, 0, data.length);

				String dirPath = Environment.getExternalStorageDirectory()
						.getAbsolutePath() + "/AAcamera/";
				File dirFile = new File(dirPath);
				if (!dirFile.exists()) {
					dirFile.mkdirs();
				}
				String fileName = String.valueOf(System.currentTimeMillis())
						+ ".jpeg";
				System.out.println(dirPath);
				File file = new File(dirPath + fileName);
				FileOutputStream fos;
				if (!file.exists()) {
					try {
						file.createNewFile();
						fos = new FileOutputStream(file);

						bm.compress(CompressFormat.JPEG, 100, fos);
						fos.flush();
						fos.close();

					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}

		}
	};

	public CameraView(Context context) {
		super(context);
	}

	public CameraView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public CameraView(Context context, AttributeSet attrs) {
		super(context, attrs);
		holder = this.getHolder();
//		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//已经废除,去掉不会报错
		holder.addCallback(this);
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		//这几个参数设置并未看到效果
/*		para = camera.getParameters();
		para.setPictureSize(1024, 768);
		para.setPictureFormat(PixelFormat.JPEG);
		para.setFlashMode(Parameters.FLASH_MODE_ON);
		para.setPreviewSize(1024, 768);*/
		camera.startPreview();
	}

	public void takePhoto() {

		camera.takePicture(null, null, null, jpegCallback);
//		camera.takePicture(null, null, raw, null);

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		try {
			camera = Camera.open(0);//如果有多个摄像头,这里可以设置成不同的摄像头
			camera.setPreviewDisplay(holder);

		} catch (IOException e) {
			e.printStackTrace();
			camera.release();
			camera = null;
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		camera.release();

	}

}

 

 

 

在布局文件中去使用

 <com.saya.mycamera.CameraView
        android:id="@+id/cv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.58" />

 

今天很长一段时间,我这样使用都报错,说我包含这个控件的xml有问题,原来我在CameraView中只写了

	public CameraView(Context context) {
		super(context);
	}

 这个构造方法,把这个带属性的构造方法加上就可以使用了。

	public CameraView(Context context, AttributeSet attrs) {
		super(context, attrs);
		holder = this.getHolder();
//		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//已经废除,去掉不会报错
		holder.addCallback(this);
	}

 

 

在Activity中去使用

public class CameraActivity extends Activity implements OnClickListener {

	private CameraView cv;
	private Button takePhoto;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_camera);
		cv = (CameraView) findViewById(R.id.cv);
		takePhoto = (Button) findViewById(R.id.takePhoto);
		takePhoto.setOnClickListener(this);

	}

	@Override
	public void onClick(View v) {

		cv.takePhoto();

	}

}

 

 

存储原始文件,以及照片的设置还没有成功,明天继续。

 

 

分享到:
评论

相关推荐

    android.hardware.camera2自定义相机

    在Android平台上,`android.hardware.camera2`是官方提供的高级相机API,它提供了更精细的控制和更高的灵活性,使得开发者能够创建具有专业级别的自定义相机应用。这个API在Android 5.0(API级别21)引入,替代了...

    android自定义相机SurfaceView形式

    android自定义相机SurfaceView形式,SurfaceView是一个功能强大的控件,它拥有独立的绘图表面(不与其宿主窗口共享同一个绘图表面)。由于其拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行...

    Android实现自定义照相机

    在Android平台上,自定义相机是一项常见的功能,它允许开发者根据特定需求定制相机界面和功能,以提供更加个性化和丰富的用户体验。下面将详细讲解如何在Android中实现自定义相机。 首先,你需要创建一个新的`...

    Android源码——SurfaceView添加组件view不被组件覆盖.zip

    1. 使用`SurfaceView.setZOrderOnTop(false)`:这会将SurfaceView设置为在视图层次结构中的底层,使得其他View可以显示在其上方。但是,这样可能会影响SurfaceView的性能,因为它将不再位于自己的独立窗口中。 2. ...

    Android圆形相机预览窗口,圆形SurfaceView

    4. **开启相机预览**:在自定义的SurfaceView中,你需要设置一个`SurfaceHolder.Callback`,在`SurfaceCreated()`方法中初始化相机,并在`SurfaceChanged()`方法中调整相机预览的尺寸以匹配SurfaceView的大小。...

    自定义相机实现连拍

    自定义相机实现单拍和连拍功能 SurfaceView surfaceView = (SurfaceView) this .findViewById(R.id.surfaceView); //SurfaceHolder是surface的控制器 surfaceView.getHolder() .setType(SurfaceHolder....

    采用surfaceView录制视频

    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { // 实现onSurfaceCreated, onSurfaceChanged, onSurfaceDestroyed方法 }); ``` 3. **配置MediaRecorder**:设置视频源(通常为Camera),...

    安卓拍照上传录像监控录屏相关-自定义利用SurfaceView实现拍照.rar

    本资料主要探讨的是如何利用SurfaceView自定义实现拍照功能,这对于深入理解Android多媒体处理和图形渲染机制至关重要。 SurfaceView是Android系统提供的一种可以创建独立于应用程序主线程的显示表面的视图组件。在...

    Android自定义SurfaceView 拍照,删除+浏览+自动对焦

    综上所述,创建一个自定义SurfaceView的拍照应用需要处理多个环节,包括相机的初始化、预览设置、拍照、视频录制、高级功能(如变焦、横屏、自动对焦)以及图片管理。这个过程涉及到Android系统的多个API,需要对...

    Android调用系统相机和自定义相机实例圆形取景框。Camera工具类

    总的来说,创建一个带有圆形取景框的自定义相机需要对Android的相机API有深入理解,同时也需要掌握图形绘制和SurfaceView的相关知识。通过不断实践和调试,可以打造出满足特定需求的相机应用。在实际项目中,可以...

    android自定义SurfaceView源代码

    这个源代码可能包含了一个自定义的SurfaceView类,用于实现更高效、更灵活的游戏界面。下面,我们将深入探讨SurfaceView及其在Android游戏开发中的应用。 SurfaceView是Android系统提供的一个视图组件,它允许...

    Android相机调用和自定义相机Demo源码

    SurfaceHolder holder = surfaceView.getHolder(); holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { try { camera = Camera.open(); ...

    Camera进阶,自定义拍照录像界面

    在自定义相机界面时,首要任务是创建一个`SurfaceView`或`TextureView`来显示相机的实时预览。`SurfaceView`适用于旧版本的Android,而`TextureView`在API 14及以上版本提供更好的性能和灵活性,支持硬件加速。 2....

    用SurfaceView自定义时钟

    在Android开发中,`SurfaceView`是一个特殊类型的视图,常用于高性能的图形渲染,例如游戏、视频播放或自定义绘图,如本例中的时钟应用。它提供了直接访问到设备的帧缓冲区,允许开发者在单独的线程中进行低级别的...

    android surfaceview自定义拍照 绘制头像轮廓

    这个项目"android surfaceview自定义拍照 绘制头像轮廓"是基于网上现有的示例代码进行了修改,用于实现一个自定义的拍照功能,并且在拍摄的照片上能够绘制出人像的轮廓。下面我们将深入探讨`SurfaceView`以及如何...

    CameraSurfaceView.java

    自定义的相机,只有很简单的前后摄像头拍照和录像

    Android SurfaceView 实现实时显示摄像头视频

    我们需要通过`SurfaceView.getHolder()`获取`SurfaceHolder`实例,并注册回调以便在Surface准备好时进行操作。 ```java SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder holder = ...

    android 自定义相机,Camera和camera2.TextureView,相机遮罩层demo

    在Android开发中,自定义相机是一项常见的需求,它允许开发者根据特定的应用场景或者设计风格定制相机界面和功能。本文将详细讲解如何使用Camera API和Camera2 API结合TextureView来实现一个自定义相机,并添加相机...

    Android自定义SurfaceView——实现画板功能

    在Android开发中,自定义`SurfaceView`是一个常见的需求,特别是在需要进行高性能图形绘制或视频播放等场景。本示例中的“Android自定义SurfaceView——实现画板功能”旨在教你如何利用`SurfaceView`创建一个可以...

    自定义surfaceVIew

    自定义SurfaceView是一种在Android应用开发中常见的技术,主要用于实现高性能的图形绘制和视频播放等需求。SurfaceView是Android系统提供的一个特殊的视图组件,它有自己的独立渲染线程,允许开发者在后台进行复杂的...

Global site tag (gtag.js) - Google Analytics