본문 바로가기

Android Studio (Kotlin)

가속도 센서 이용하여 화면 갱신하기

센서 사용을 위한 클래스 및 인터페이스 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