android에서 흔드는지를 확인하기 위해서는 accelerometer(가속도) 센서를 사용해야 합니다.
저 같은 경우에는 이전 x,y,z 값를 저장해두고 이전 값과 일정 이상 차이가 날 경우를 구합니다.
해당 경우가 또 일정 이상 될 경우 흔들었다는 것으로 확인하고 event를 줍니다.
//sensor
private lateinit var accelerometerSensor: Sensor
private lateinit var sensorManager: SensorManager
private lateinit var sensorEventListener: SensorEventListener
var beforeX = 0f
var beforeY = 0f
var beforeZ = 0f
private fun initSensor(){
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorEventListener = AccelerometerListener()
}
override fun onStart() {
super.onStart()
sensorManager.registerListener(sensorEventListener,accelerometerSensor,SensorManager.SENSOR_DELAY_UI)
}
override fun onStop() {
super.onStop()
sensorManager.unregisterListener(sensorEventListener)
}
var count = 0
// 가속도 센서 이용
private inner class AccelerometerListener : SensorEventListener {
// 구현
override fun onSensorChanged(event: SensorEvent?) {
if(event?.sensor == accelerometerSensor){
var change = Math.abs(event.values[0] - beforeX) + Math.abs(event.values[1] - beforeY) + Math.abs(
event.values[2] - beforeZ
)
if(change > 40){
count++
beforeX = event.values[0]
beforeY = event.values[1]
beforeZ = event.values[2]
Log.d(TAG, "onSensorChanged: change : ${change}")
}
if(count > 3){
count = 0
setData()
Toast.makeText(this@MaskActivity, "물품 정보가 갱신되었습니다.", Toast.LENGTH_SHORT).show()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.vibrate(VibrationEffect.createOneShot(1000,VibrationEffect.DEFAULT_AMPLITUDE))
}
}
}
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
}