Android自定义相机聚焦和显示框

本文实例为大家分享了Android自定义相机聚焦和显示框的具体代码,供大家参考,具体内容如下

先看使用效果,白色圆框,放大后缩写并变淡隐藏

下面是代码

public class CameraFocusView extends AppCompatImageView {

 String TAG = getClass().getName();
 //显示的圆宽显示的位置
 public float currnetX = 40;
 public float currentY = 50;

 Paint paint;
 //半径大小
 float radis = 100;
 //透明度
 int alpha = 255;
 boolean isAlpha = false;
 private ValueAnimator scaleAnimator,colorAnimator;

 public CameraFocusView(Context context) {
 super(context);
 init();
 }

 public CameraFocusView(Context context, @Nullable AttributeSet attrs) {
 super(context, attrs);
 init();
 }

 public CameraFocusView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init();
 }

 public void init() {
 scaleAnimator = new ValueAnimator();
 scaleAnimator.setFloatValues(80, 70, 90);
 scaleAnimator.setDuration(500);
 scaleAnimator.setInterpolator(new LinearInterpolator());
 //伸缩动画效果
 scaleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
  radis = (float) animation.getAnimatedValue();
  invalidate();
  if (radis == 90){
   isAlpha = true;
   colorAnimator.start();
  }
  }
 });

 colorAnimator = new ValueAnimator();
 colorAnimator.setIntValues(255,0);
 colorAnimator.setDuration(3000);
 colorAnimator.setInterpolator(new LinearInterpolator());
 //显示透明度动画效果
 colorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
  alpha = (int) animation.getAnimatedValue();
  invalidate();
  }
 });

 //初始化不显示
 setVisibility(GONE);
 }

 //开始现在圆框
 public void startAnimator() {
 isAlpha = false;
 if (scaleAnimator != null) {
  Log.e(TAG, "startAnimator: scaleAnimator != null");
  setVisibility(VISIBLE);
  scaleAnimator.start();
 } else {
  Log.e(TAG, "startAnimator: scaleAnimator == null");
 }
 }

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 //画笔设置
 paint = new Paint();
 paint.setStyle(Paint.Style.STROKE);//画笔属性是空心圆
 paint.setStrokeWidth(2);//设置画笔粗细
 // 抗锯齿
 paint.setAntiAlias(true);
 paint.setColor(Color.WHITE);
 paint.setAlpha(255);
 if (isAlpha){
  if (alpha > 0 && alpha < 155){
  paint.setAlpha(155);
  }else if (alpha == 0){
  setVisibility(GONE);
  }
 }
 canvas.drawCircle(currnetX, currentY, radis, paint);

 }
}

主界面图

调用方式,点击屏幕就能显示

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
 String TAG = getClass().getName();
 SurfaceView surfaceview;
 SurfaceHolder surfaceHolder;
 Camera camera;
 AutoFocusCallBackClass autoFocusCallBackClass;
 CameraFocusView cameraFocusView;

 SensorControler sensorControler;

 int width = 480;
 int height = 800;
 int surfaceViewWidth = 480;
 int surfaceViewHeight = 800;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 ConstraintLayout root = findViewById(R.id.root);

 surfaceview = findViewById(R.id.surfaceview);
 surfaceHolder = surfaceview.getHolder();

 Display display = getWindowManager().getDefaultDisplay();
 width = display.getWidth();
 height = display.getHeight();
 cameraFocusView = new CameraFocusView(this);
 cameraFocusView.setMinimumWidth(width);
 cameraFocusView.setMinimumHeight(height);
 root.addView(cameraFocusView);

 surfaceview.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
  float reax = motionEvent.getX();
  float reay = motionEvent.getY();
  focusTouch(reax,reay);
  return false;
  }
 });

 surfaceHolder.addCallback(this);
 }

 @Override
 protected void onStart() {
 super.onStart();
 if (sensorControler != null){
  sensorControler.start();
 }
 }

 @Override
 protected void onStop() {
 super.onStop();
 if (sensorControler != null){
  sensorControler.stop();
 }
 }

 public void focusTouch(float reac_x, float reac_y){
 int areaX = (int)(reac_x / surfaceview.getWidth() * 2000) - 1000;
 int areaY = (int)(reac_y / surfaceview.getHeight() * 2000) - 1000;

 if (camera == null){
  return;
 }
 Camera.Parameters parameters = camera.getParameters();
 if (parameters == null){
  return;
 }
 //创建Rect区域
 Rect focusArea = new Rect();
 focusArea.left = Math.max(areaX -100,-1000);
 focusArea.top = Math.max(areaY - 100,-1000);
 focusArea.right = Math.min(areaX + 100,1000);
 focusArea.bottom = Math.min(areaY + 100,1000);

//  Log.e(TAG, "onTouch: left = " + focusArea.left + " top = " + focusArea.top + " right = " + focusArea.right + " bottom = " + focusArea.bottom);
 //创建Camera.Area
 Camera.Area cameraArea = new Camera.Area(focusArea,100);
 List<Camera.Area> mereringAreas = new ArrayList<>();
 List<Camera.Area> focusAreas = new ArrayList<>();

 if (parameters.getMaxNumMeteringAreas() > 0){
  mereringAreas.add(cameraArea);
  focusAreas.add(cameraArea);
 }
 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
 parameters.setFocusAreas(focusAreas);
 parameters.setMeteringAreas(mereringAreas);
 try {
  camera.cancelAutoFocus();
  camera.setParameters(parameters);
 }catch (Exception e){
  e.printStackTrace();
 }

 if (cameraFocusView != null) {
  cameraFocusView.currnetX = reac_x;
  cameraFocusView.currentY = reac_y;
  cameraFocusView.startAnimator();
 }
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
  Toast.makeText(this,"ok",Toast.LENGTH_SHORT).show();
  initCamera();
 }else {
  Toast.makeText(this,"no",Toast.LENGTH_SHORT).show();
 }
 }

 private void initCamera(){
 camera = Camera.open(0);
 surfaceViewWidth = surfaceview.getWidth();
 surfaceViewHeight = surfaceview.getHeight();
 Log.e(TAG, "surfaceCreated: " + surfaceview.getWidth() + " " + surfaceview.getHeight() );

 if (camera != null) {
  try {
  camera.setPreviewCallback(this);
  Camera.Parameters parameters = camera.getParameters();
  //需要设置大小,否则在聚焦后就才色调出现缩小
  parameters.setPreviewSize(height,width);
  camera.setParameters(parameters);
  camera.setDisplayOrientation(90);
  camera.setPreviewDisplay(surfaceHolder);
  camera.startPreview();
  } catch (IOException e) {
  e.printStackTrace();
  }
 }
 }

 @Override
 public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
  ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1);
 }else {
  initCamera();
 }
 }

 @Override
 public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {

 }

 @Override
 public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
 if (camera != null){
  camera.setPreviewCallback(null);
  camera.stopPreview();
  camera.release();
  camera = null;
 }
 }

 @Override
 public void onPreviewFrame(byte[] bytes, Camera camera) {

 }

 class AutoFocusCallBackClass implements Camera.AutoFocusCallback{

 @Override
 public void onAutoFocus(boolean b, Camera camera) {
  Log.e(TAG, "onAutoFocus: " + b);
 }
 }

 @Override
 protected void onDestroy() {
 super.onDestroy();
 if (camera != null){
  camera.setPreviewCallback(null);
  camera.stopPreview();
  camera.release();
  camera = null;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 调用系统相机拍摄获取照片的两种方法实现实例

    Android 调用系统相机拍摄获取照片的两种方法实现实例 在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的照片.下面是我总结的两种方法获取拍摄之后的照片,一种是通过Bundle来获取压缩过的照片,一种是通过SD卡获取的原图. 下面是演示代码: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:

  • android中打开相机、打开相册进行图片的获取示例

    这里介绍在Android中实现相机调取.拍照片.获取照片.存储新路径等已经打开相册.选择照片等功能 首先看一下界面,很简单 配置读取内存卡和调用照相头的功能 <!-- 使用网络权限 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 写sd卡的权限 --> <uses-permission android:name="android.permis

  • Android 7.0调用相机崩溃详解及解决办法

    Android 7.0调用相机崩溃解决办法 错误提示: android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/IMG_1041503431.jpg exposed beyond app through ClipData.Item.getUri() 处理方式 /** * Open camera */ private void showCameraAction() { if (ContextCompat.checkSe

  • Android 简单的照相机程序的实例代码

    复制代码 代码如下: class surface extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder sfholder; Camera camera; Bitmap bitmap; public surface(Context context) {             super(context);             // TODO Auto-generated constructor stub s

  • Android调用相机并将照片存储到sd卡上实现方法

    Android中实现拍照有两种方法,一种是调用系统自带的相机,然后使用其返回的照片数据. 还有一种是自己用Camera类和其他相关类实现相机功能,这种方法定制度比较高,洗染也比较复杂,一般平常的应用只需使用第一种即可. 用Intent启动相机的代码: 复制代码 代码如下: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1);拍完照后就可以在onActivity

  • Android自定义相机实现自动对焦和手动对焦

    Android自定义相机实现自动对焦和手动对焦: 不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求. 所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此demo. 程序实现代码如下: import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.la

  • Android自定义相机Camera实现手动对焦的方法示例

    前言 我采用的是Camera来实现自定义相机的,如果你使用的是Camera2,那本文将不适用你.为了减少篇幅,本文主要讲解手动对焦的实现方式,前提是你已经能实现自定义相机的预览等基础功能. 目录 手动对焦的方法解析 实现用户点击屏幕后,设置对焦区域和测光区域 一.手动对焦的方法 手动对焦的实现主要通过两个Camera方法来进行配置: setFocusAreas 设置对焦的区域 setMeteringAreas 设置测光的区域 他们需要传入一个Camera.Area集合,Camera.Area如图

  • Android实现读取相机(相册)图片并进行剪裁

    我们先说一下思路,在android系统中就自带了图片剪切的应用,所以,我们只需要将我们获取到的相片传给图片剪切应用,再将剪切好的相片返回到我们自己的界面显示就ok了 在开发一些APP的过程中,我们可能涉及到头像的处理,比如从手机或者相册获取头像,剪裁成自己需要的头像,设置或上传头像等.网上一些相关的资料也是多不胜数,但在实际应用中往往会存在各种问题,没有一个完美的解决方案.由于近期项目的需求,就研究了一下,目前看来还没有什么问题. 这里我们只讨论获取.剪裁与设置,上传流程根据自己的业务需求添加.

  • android 调用系统的照相机和图库实例详解

    android手机有自带的照相机和图库,我们做的项目中有时用到上传图片到服务器,今天做了一个项目用到这个功能,所以把我的代码记录下来和大家分享,第一次写博客希望各位大神多多批评. 首先上一段调用android相册和相机的代码: 复制代码 代码如下: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用android自带的照相机 photoUri = MediaStore.Images.Media.EXTERNAL_CON

  • Android启动相机拍照并返回图片

    具体实现过程请看下面代码: 简单的调用了一下系统的拍照功能 代码如下所示: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下sdcard是否可用 */ String state = Environment.getExternalStorageState(); //拿到sdcard是否可用的状态码 if (state.equals(Environment.MEDIA_MOUNTED)){ //如果可用 Intent intent

  • Android自定义照相机Camera出现黑屏的解决方法

    本文实例讲述了Android自定义照相机Camera出现黑屏的解决方法.分享给大家供大家参考,具体如下: 对于一些手机,像HTC,当自定义Camera时,调用Camera.Parameters的 parameters.setPreviewSize(width, height)方法时,如果width和height为奇数情况下,则会出现黑屏现象,解决办法可参考SDK提供的ApiDemos中关于Camera的 例子: List<Size> sizes = parameters.getSupporte

随机推荐