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自定义相机SurfaceView形式,SurfaceView是一个功能强大的控件,它拥有独立的绘图表面(不与其宿主窗口共享同一个绘图表面)。由于其拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行...
自定义利用SurfaceView实现拍照.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
自定义相机实现单拍和连拍功能 SurfaceView surfaceView = (SurfaceView) this .findViewById(R.id.surfaceView); //SurfaceHolder是surface的控制器 surfaceView.getHolder() .setType(SurfaceHolder....
Android圆形相机预览窗口,圆形SurfaceView
自定义的相机,只有很简单的前后摄像头拍照和录像
自定义surfaceview实现抽奖转盘,根据慕课网视频手敲的
用SurfaceView自定义绘制时钟效果,attr自定义属性效果,时钟秒针每秒绘制一次,分针没分绘制一次
采用surfaceView录制视频,采用surfaceView录制视频,采用surfaceView录制视频
自定义surfaceVIew,讲解在子线程中绘制的demo
最近要搞一个项目要用到拍照功能,搞了许多项目都没有一个特别满意的,后来现在自己网上找了一个然后改进了一下,支持拍照录视频,而且连变焦都有,支持横批拍照,闪光灯功能,前后摄像头切换都有。
android surfaceview自定义拍照 绘制头像轮廓 注明:是借用网上的demo基础上进行修改的
用surfaceview做android游戏开发,自己写的,希望可以帮助大家。
SurfaceView一般用于游戏中,但是有时候我们自定义View的时候,自定义View现有的功能区不能达到我们预期的效果,所以surfaceview也是一个不错的选择.这个demo是一个surfaceview的基础应用,适合新手.
Android使用SurfaceView实现墨迹天气的风车效果.zip源码资源下载Android使用SurfaceView实现墨迹天气的风车效果.zip源码资源下载
7.Android游戏开发之旅七 自定义SurfaceView 8.Android游戏开发之旅八 SurfaceView类实例 9.Android游戏开发之旅九 VideoView类剖析 10.Android游戏开发之旅十 位图旋转 11.Android游戏开发之旅11 View中手势...
自定义照相机,在界面中预览,拍照,并显示拍照后的图片
用Android组件写的自定义相机,SurfaceView、Camera,有个框,有拍照按钮、确定按钮和取消按钮,原生写法,较为简陋,喜欢研究原生组件的可以下载练手
这是一款android进度条自定义的控件,用到了混合模式,进度条覆盖到文字的时候,覆盖到哪里,哪里变成白色,
Android 相机控制:自定义相机Test实例 ,author 孙尚磊,可实现设置相机的各种参数,对焦的方式,照片的类型,对焦监听,拍照成功回调函数,验证手机是否有sdcard,相片预览,相机与SurfaceView绑定,预览的图片...
主要为大家详细介绍了Android中关于自定义相机预览界面拉伸问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下