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 表示沒(méi)有被鎖定 0表示被鎖定
boolean isFocusing = false;
boolean canFocusIn = false; //內(nèi)部是否能夠?qū)箍刂茩C(jī)制
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===檢測(cè)手機(jī)在移動(dòng)..");
STATUE = STATUS_MOVE;
} else {
LogPrint.printError("sc===檢測(cè)手機(jī)靜止..");
//上一次狀態(tài)是move,記錄靜態(tài)時(shí)間點(diǎn)
if (STATUE == STATUS_MOVE) {
lastStaticStamp = stamp;
canFocusIn = true;
}
if (canFocusIn) {
if (stamp - lastStaticStamp > DELEY_DURATION) {
//移動(dòng)后靜止一段時(shí)間,可以發(fā)生對(duì)焦行為
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;
}
}
/**
* 重置參數(shù)
*/
private void restParams() {
STATUE = STATUS_NONE;
canFocusIn = false;
mX = 0;
mY = 0;
mZ = 0;
}
/**
* 對(duì)焦是否被鎖定
*
* @return
*/
public boolean isFocusLocked() {
if (canFocus) {
return foucsing <= 0;
}
return false;
}
/**
* 鎖定對(duì)焦
*/
public void lockFocus() {
isFocusing = true;
foucsing--;
Log.i(TAG, "lockFocus");
}
/**
* 解鎖對(duì)焦
*/
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;
}
}
通過(guò)加速傳感器自動(dòng)對(duì)焦拍照
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 最近項(xiàng)目需要實(shí)現(xiàn)相機(jī)的自動(dòng)對(duì)焦,一開(kāi)始沒(méi)有什么思路,后來(lái)通過(guò)查閱資料發(fā)現(xiàn)可以例用傳感器來(lái)通知相機(jī)進(jìn)行對(duì)焦,特此記錄...
- 目錄導(dǎo)航: (1)——環(huán)境搭建 (2)——單傳感器單角度報(bào)警 (3)——傳感器校準(zhǔn) (4)——多傳感器多角度報(bào)警 ...
- 目錄導(dǎo)航: (1)——環(huán)境搭建 (2)——單傳感器單角度報(bào)警 (3)——傳感器校準(zhǔn) (4)——多傳感器多角度報(bào)警 ...
- 目錄導(dǎo)航: (1)——環(huán)境搭建 (2)——單傳感器單角度報(bào)警 (3)——傳感器校準(zhǔn) (4)——多傳感器多角度報(bào)警 ...
- 概述 對(duì)焦,這里所說(shuō)的“焦”是指“焦距”。在拍照時(shí),一定是需要調(diào)焦的。一般會(huì)在目標(biāo)位置最清晰的時(shí)候會(huì)停止對(duì)焦。最近...