当前位置:   article > 正文

照相机预览、拍照以及适配问题的完美解决_surfaceview.getholder().setformat(pixelformat.tran

surfaceview.getholder().setformat(pixelformat.transparent)部分机型无效

         前段时间在做face++相关的功能,对于照相机也是进行了一番研究,小有收获,很感谢有一些大神已经写了相应的博客,让我在他们的项目上进行完善和优化,修复了一些bug,并对机型适配做了一些处理,目前已经保证了团队里面十多部安卓手机的完美适配,具体项目资源可以在http://download.csdn.net/detail/shan286/9799622这个网址上下载。好的,话不多说,直接上代码。

1、首先是关于照相机的预览功能,这里就要说到SurfaceView这个控件,我在布局最底层放了一个自定义的MySurfaceView,然后在它的上层放一个自定义的TakePhotoView,这个TakePhotoView主要是用于当用户想要在拍照的时候绘制自己想要的图片时,就可以在这个View中实现,这里我是画了一个带橙色框框的图片放在了里面。MySurfaceView的代码如下:

  1. import android.content.Context;
  2. import android.graphics.PixelFormat;
  3. import android.util.AttributeSet;
  4. import android.util.Log;
  5. import android.view.SurfaceHolder;
  6. import android.view.SurfaceView;
  7. /**
  8. * Created by xueli on 2016/11/16.
  9. *
  10. * 1、注意点:surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁
  11. * 2、实现过程:继承SurfaceView并实现SurfaceHolder.Callback接口
  12. * ----> SurfaceView.getHolder()获得SurfaceHolder对象
  13. * ----> SurfaceHolder.addCallback(callback)添加回调函数
  14. * ----> SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布
  15. * ----> Canvas绘画
  16. * ----> SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。
  17. */
  18. public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
  19. private static final String TAG = "MySurfaceView";
  20. private Context mContext;
  21. private SurfaceHolder mSurfaceHolder;
  22. public MySurfaceView(Context context, AttributeSet attrs) {
  23. super(context, attrs);
  24. mContext = context;
  25. mSurfaceHolder = getHolder();
  26. mSurfaceHolder.setFormat(PixelFormat.TRANSPARENT);//translucent半透明 transparent透明
  27. mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  28. mSurfaceHolder.addCallback(this);
  29. }
  30. @Override
  31. public void surfaceCreated(SurfaceHolder holder) {
  32. //在创建时激发,一般在这里调用画图的线程。
  33. Log.i(TAG, "surfaceCreated...");
  34. }
  35. @Override
  36. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  37. int height) {
  38. //在surface的大小发生改变时激发
  39. Log.i(TAG, "surfaceChanged...");
  40. }
  41. @Override
  42. public void surfaceDestroyed(SurfaceHolder holder) {
  43. //销毁时激发,一般在这里将画图的线程停止、释放。
  44. Log.i(TAG, "surfaceDestroyed...");
  45. CameraInterface.getInstance().doStopCamera();
  46. }
  47. public SurfaceHolder getSurfaceHolder() {
  48. // SurfaceHolder当作surface的控制器,用来操纵surface
  49. return mSurfaceHolder;
  50. }
  51. }

TakePhotoView的代码如下:

  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Color;
  4. import android.graphics.Paint;
  5. import android.graphics.Rect;
  6. import android.graphics.drawable.BitmapDrawable;
  7. import android.util.AttributeSet;
  8. import android.view.View;
  9. import com.sherry.ui.R;
  10. import com.sherry.util.DeviceInfoUtil;
  11. /**
  12. * Created by xueli on 2016/11/16.
  13. *
  14. * 自定义拍照框View
  15. *
  16. */
  17. public class TakePhotoView extends View {
  18. private Context mContext;
  19. private Paint mPaint;
  20. public TakePhotoView(Context context, AttributeSet attrs) {
  21. super(context, attrs);
  22. this.mContext = context;
  23. mPaint = new Paint();
  24. mPaint.setAntiAlias(false);
  25. }
  26. @Override
  27. protected void onDraw(Canvas canvas) {
  28. // 拍照框预览的宽高设置
  29. Rect frame = new Rect(0, 0, DeviceInfoUtil.getScreenWidth(mContext), DeviceInfoUtil.getScreenHeight(mContext) * 17 / 25);
  30. mPaint.setColor(Color.GRAY);
  31. Rect faceRect = new Rect();
  32. faceRect.left = frame.left;
  33. faceRect.right = frame.right;
  34. faceRect.top = frame.top;
  35. faceRect.bottom = frame.bottom;
  36. canvas.drawBitmap(((BitmapDrawable) (getResources().getDrawable(R.drawable.take_photo_bg))).getBitmap(), null, faceRect, mPaint);
  37. }
  38. }

2、照相机处理类------CameraInterface

(1)在CameraInterface这个类里面对照相机进行一些处理,包括照相机的开启、预览、拍照、销毁等方法,这里参考博客http://blog.csdn.net/yanzi1225627/article/details/33028041,可以说给我提供了很大的帮助。不过我在它的实现上进行了优化和改进,解决了部分手机的黑屏、拍照或预览变形等问题。因为我这边要求的是拍照之后显示图片在下一个页面进行显示,所以拍照之后不会只是暂停然后继续进行预览,另外要注意的是,我这边使用的是前置摄像头,所以在doOpenCamera()方法中要判断手机摄像头的个数,让它选择开启前置摄像头。具体代码如下:

  1. /**
  2. * 打开Camera
  3. *
  4. * @param callback
  5. */
  6. public void doOpenCamera(CamOpenOverCall
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/102892
推荐阅读
相关标签
  

闽ICP备14008679号