美文网首页
通过加速传感器自动对焦拍照

通过加速传感器自动对焦拍照

作者: 一城山水一成伤 | 来源:发表于2023-04-10 13:24 被阅读0次
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;

import java.util.Calendar;

public class SensorControler implements SensorEventListener {
    public static final String TAG = "SensorControler";
    private SensorManager mSensorManager;
    private Sensor        mSensor;
    private int           mX, mY, mZ;
    private long lastStaticStamp = 0;
    Calendar mCalendar;
    public static final int DELEY_DURATION = 500;
    private static SensorControler mInstance;
    private int foucsing = 1;  //1 表示没有被锁定 0表示被锁定

    boolean isFocusing = false;
    boolean canFocusIn = false;  //内部是否能够对焦控制机制
    boolean canFocus   = false;

    public static final int STATUS_NONE   = 0;
    public static final int STATUS_STATIC = 1;
    public static final int STATUS_MOVE   = 2;
    private             int STATUE        = STATUS_NONE;

    private SensorControler(Context context) {
        mSensorManager = (SensorManager) context.getSystemService(Activity.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }

    public static SensorControler getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new SensorControler(context);
        }
        return mInstance;
    }

    public void onStart() {
        restParams();
        canFocus = true;
        mSensorManager.registerListener(this, mSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void onStop() {
        mSensorManager.unregisterListener(this, mSensor);
        canFocus = false;
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor == null) {
            return;
        }

        if (isFocusing) {
            restParams();
            return;
        }

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            int x = (int) event.values[0];
            int y = (int) event.values[1];
            int z = (int) event.values[2];
            mCalendar = Calendar.getInstance();
            long stamp = mCalendar.getTimeInMillis();// 1393844912

            int second = mCalendar.get(Calendar.SECOND);// 53

            if (STATUE != STATUS_NONE) {
                int px = Math.abs(mX - x);
                int py = Math.abs(mY - y);
                int pz = Math.abs(mZ - z);
                double value = Math.sqrt(px * px + py * py + pz * pz);
                if (value > 1.4) {
                    LogPrint.printError("sc===检测手机在移动..");
                    STATUE = STATUS_MOVE;
                } else {
                    LogPrint.printError("sc===检测手机静止..");
                    //上一次状态是move,记录静态时间点
                    if (STATUE == STATUS_MOVE) {
                        lastStaticStamp = stamp;
                        canFocusIn = true;
                    }

                    if (canFocusIn) {
                        if (stamp - lastStaticStamp > DELEY_DURATION) {
                            //移动后静止一段时间,可以发生对焦行为
                            if (!isFocusing) {
                                canFocusIn = false;
                                LogPrint.printError("sc===可以拍照");
                                if (mCameraFocusListener != null) {
                                    mCameraFocusListener.onFocus();
                                }
                            }
                        }
                    }

                    STATUE = STATUS_STATIC;
                }
            } else {
                lastStaticStamp = stamp;
                STATUE = STATUS_STATIC;
            }

            mX = x;
            mY = y;
            mZ = z;
        }
    }

    /**
     * 重置参数
     */
    private void restParams() {
        STATUE = STATUS_NONE;
        canFocusIn = false;
        mX = 0;
        mY = 0;
        mZ = 0;
    }

    /**
     * 对焦是否被锁定
     *
     * @return
     */
    public boolean isFocusLocked() {
        if (canFocus) {
            return foucsing <= 0;
        }
        return false;
    }

    /**
     * 锁定对焦
     */
    public void lockFocus() {
        isFocusing = true;
        foucsing--;
        Log.i(TAG, "lockFocus");
    }

    /**
     * 解锁对焦
     */
    public void unlockFocus() {
        isFocusing = false;
        foucsing++;
        Log.i(TAG, "unlockFocus");
    }

    public void restFoucs() {
        foucsing = 1;
    }


    private CameraFocusListener mCameraFocusListener;

    public interface CameraFocusListener {
        void onFocus();
    }

    public void setCameraFocusListener(CameraFocusListener mCameraFocusListener) {
        this.mCameraFocusListener = mCameraFocusListener;
    }
}

相关文章

  • 入门单反

    1. 对焦 AF:自动对焦,半按快门,对焦完成会有提示音,按下快门完成拍照;MF:手动对焦 对焦模式(3种):按住...

  • iOS自动对焦拍照

    最新有拍照的需求是这样的 ~ 手动点击屏幕聚焦,聚焦完成之后就自动拍照 于是开始各种脑补,在别人的基本拍照框架上进...

  • 华为p40使用体验

    1、拍照 后部摄像区域包含3颗主摄像头,闪光灯和色温传感器,以及激光对焦传感器。 1-1拼图:图库自带功能。打开图...

  • 对焦模式

    AF自动对焦,MF手动对焦。 MF手动对焦转动对焦环,变清晰,任何情况下都可以对焦。 Af自动对焦可以快速对焦,分...

  • Ios面试复习--传感器

    搭载在Ios设备上的传感器 运动传感器(Motion)/加速传感器、加速计(Accelermeter Sensor...

  • 合焦,一个手机拍摄常被忽视的问题

    相机拍照是通过移动镜片与物体的距离,来完成对焦成像的,对焦过程完成并使图像清晰,被称为合焦。专业相机默认对焦测光成...

  • 数码单反摄影轻松入门(2.7)

    巧设AF自动对焦和对焦模式 数码单方相机通常具备多个自动对焦点,可以对位于画面中心和四周的景物进行自动对焦,但正是...

  • Xamarin Essentials教程使用加速度传感器Acce

    Xamarin Essentials教程使用加速度传感器Accelerometer 加速度传感器是一种能够测量加速...

  • 38 有效汇报=对焦点+报方案+提诉求01

    第一步:对焦点 见过摄影师拍照吗?拍照的过程当中,是不是要调镜头对焦啊?对,通过多次地调整焦距,让一个画面从模糊到...

  • 加速度传感器

    一、加速度传感器的用法 1. 获取 SensorManager 实例。 2. 通过 getDefaultSenso...

网友评论

      本文标题:通过加速传感器自动对焦拍照

      本文链接:https://www.haomeiwen.com/subject/gjtwddtx.html