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;

}

}

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

以上是 Android自定义相机聚焦和显示框 的全部内容, 来源链接: utcz.com/p/243257.html

回到顶部