센서 사용을 위한 클래스 및 인터페이스 4가지
- Sensor : SensorManager를 통해 활용하고자 하는 유형의 센서 클래스 생성 가능
- SensorEvent : 센서를 통해 발생하는 이벤트의 정보를 담고있는 객체
- SensorManager : 센서를 관리하고 이용할 수 있도록 하는 클래스, 센서 이벤트 리스너 등록, 센서의 값을 얻어올 수 있음
- SensorEventListener : 센서 값이 변경되었을 때 SensorManager에서 이벤트 형태로 값을 전달받을 수 있도록 한다. SensorManager의 registerListener 메소드로 리스너를 등록, 센서 데이터 업데이트가 필요하지 않으면 unregisterListener로 리스너를 해제한다
가속도 센서
- 가속도계 센서는 3차원 공간에서의 방향, 움직임에 대한 값을 알려준다.
- x,y,z 축으로 방향(+,-), 각도(angle)을 구할 수 있다.
- 움직임에 의해 바닥과 0보다 큰 각이 만들어지는 각 축에 중력 가속도의 값이 적용된다.
센서 | 센서 이벤트 데이터 | 설명 | 측정 단위 |
TYPE_ACCELEROMETER | SensorEvent.values[0] | x축의 가속도(중력 포함) | m/s^2 |
SensorEvent.values[1] | y축의 가속도(중력 포함) | ||
SensorEvent.values[2] | z축의 가속도(중력 포함) |
- 기기의 움직임이 발생하면 센서가 움직임을 감지하고 중력 가속도의 x,y,z 값이 반환된다.
1. 가속도 센서를 이용하여 기기를 흔드는 동작을 인식한다. -> TYPE_ACCELEROMETER
2. 기기를 흔들면 화면을 갱신한다.
override fun onCreate(savedInstanceState: Bundle?) {
Log.d(TAG, "onCreate: ")
super.onCreate(savedInstanceState)
binding = ActivityStuffBinding.inflate(layoutInflater)
setContentView(binding.root)
//가속도 센서 등록
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorEventListener = AccelerometerListener()
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_UI)
setList(0)
val intent = Intent(this, StuffEditActivity::class.java)
binding.fab.setOnClickListener {
intent.putExtra("inputStuff",Stuff("",0,""))
stuffEditActivityLauncher.launch(intent)
}
binding.listView.setOnItemClickListener { parent, view, position, id ->
intent.putExtra("inputStuff",Stuff(items[position].itemName,items[position].itemCnt,items[position].regDate))
intent.putExtra("inputId", items[position].id)
Log.d(TAG, "onCreate: ${items[position].id}")
stuffEditActivityLauncher.launch(intent)
}
}
override fun onPause() {
super.onPause()
//sensor Listener 삭제
sensorManager.unregisterListener(sensorEventListener)
}
override fun onResume() {
super.onResume()
//sensor Listener 등록
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_UI)
}
override fun onDestroy() {
super.onDestroy()
//sensor Listener 삭제
sensorManager.unregisterListener(sensorEventListener)
}
//가속도 센서 이용
private inner class AccelerometerListener : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
//흔들림 감지 시 기준이 되는 힘
val SHAKE_GRAVITY = 3.0F
var x = event.values[0]
var y = event.values[1]
var z = event.values[2]
var gX = x / SensorManager.GRAVITY_EARTH
var gY = y / SensorManager.GRAVITY_EARTH
var gZ = z / SensorManager.GRAVITY_EARTH
var gForce = sqrt((gX * gX + gY * gY + gZ * gZ).toDouble()).toFloat()
if(gForce>SHAKE_GRAVITY){
Log.d(TAG, "onSensorChanged: $gForce")
setList(1) //기준 힘보다 흔들림이 크면 리스트를 갱신해준다
}
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}
'Android Studio (Kotlin)' 카테고리의 다른 글
Android Component (5) (1) | 2022.04.18 |
---|---|
Android Component (4) (0) | 2022.04.18 |
Android Component (3) (0) | 2022.04.18 |
Android Component (2) (0) | 2022.04.18 |
Android Component (1) (0) | 2022.04.18 |