
✔ 수평측정기 기능
- 수평 유지를 위해 기기를 평평하게 놓아 원이 중앙에 오게 한다.
- x축 값에 따라 원이 좌우로 움직인다.
- y축 값에 따라 원이 상하로 움직인다.
✔ Sensor 사용
- 안드로이드에서 제공하는 Sensor 클래스 중 가속도 센서를 이용한다.
- SensorManager 인스턴스를 얻고 getDefaultSensor()메서드에 지정하여 Sensor 객체를 얻는다.
- OnResume() 메소드에서 refisterListener() 메소드로 센서 감지를 등록한다.
- OnPause() 메소드에서 unregisterListener() 메소드로 센서 감지를 해제한다.
=> 액티비티의 생명주기에 대해 공부해야한다.
✔ 소스코드
◾ MainActivity.kt
- 가속도 센서값을 읽어와야하는데, 센서는 SensorEvent 객체로 값을 넘겨준다.
- onSensorChanged() 메소드에 센서값이 변경되면 호출되도록 설정하고, 로그를 표시하게 한다.
- Log.d([태그], [메시지]) : 를 사용하여 로그를 표시한다. (Logcat에서 확인 가능)
//values[0] : x축 값, values[1] : y축 값, values[2] : z축 값
package com.example.tiltsensor
import android.content.Context
import android.content.pm.ActivityInfo
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.WindowManager
import android.widget.TextView
class MainActivity : AppCompatActivity(), SensorEventListener {
private val sensorManager by lazy {
getSystemService(Context.SENSOR_SERVICE) as SensorManager }
private lateinit var tiltView: TiltView
override fun onCreate(savedInstanceState: Bundle?) {
requestedOrientation= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE //가로모드
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) //꺼지지 않도록 구성
super.onCreate(savedInstanceState)
tiltView=TiltView(this)//초기화 해주기
setContentView(tiltView)
}
override fun onResume(){ //센서등록
super.onResume()
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL)
}
override fun onPause() { //센서해지
super.onPause()
sensorManager.unregisterListener(this)
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
TODO("Not yet implemented")
}
override fun onSensorChanged(event: SensorEvent?) {
event?.let {
Log.d("MainActivity", "onSensorChanged : x: " + "${event.values[0]}, y : ${event.values[1]}, z : ${event.values[2]}")
tiltView.onSensorEvent(event)
} //로그캣 가져와서 기록하기.
}
}
◾ TiltView.kt
- 커스텀뷰를 작성해준다.
- MainActivity.kt파일에서 TiltView를 생성자를 사용해 인스턴스화하여 화면 배치한다.
- 그래픽 API를 사용한다. (Canvas, Paint)
- cX, cY는 화면의 중앙값을 나타낸다.
- xCoord, yCoord는 변화하는 값을 표현해준다.
package com.example.tiltsensor
import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.ActivityInfo
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.hardware.SensorEvent
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import android.widget.EditText
class TiltView(context: Context?) : View(context) {
private val greenPaint: Paint=Paint()
private val blackPaint: Paint=Paint()
init{
greenPaint.color= Color.GREEN
blackPaint.style=Paint.Style.STROKE
}
private var cX:Float = 0f
private var cY:Float = 0f
private var xCoord: Float = 0f
private var yCoord: Float = 0f
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
cX=w/2f
cY=h/2f
}
fun onSensorEvent(event: SensorEvent){
yCoord = event.values[0]*20 //움직임 너무 작음
xCoord = event.values[1]*20
invalidate()
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
val paint=Paint()
paint.isAntiAlias=true
canvas?.drawCircle(cX, 0F,30F,blackPaint)
canvas?.drawCircle(xCoord+cX, 0F,30F,greenPaint)
canvas?.drawCircle(0F, cY,30F,blackPaint)
canvas?.drawCircle(0F, yCoord+cY,30F,greenPaint)
canvas?.drawCircle(cX,cY,100f,blackPaint)
canvas?.drawCircle(xCoord+cX,yCoord+cY,100f,greenPaint)
canvas?.drawLine(cX-20,cY,cX+20,cY,blackPaint)
canvas?.drawLine(cX,cY-20,cX,cY+20,blackPaint)
}
}
'Android > Kotlin' 카테고리의 다른 글
SQLite에서의 데이터 베이스 구축 (0) | 2021.01.28 |
---|---|
Kotlin 실로폰 만들기 (0) | 2021.01.25 |
Kotlin 나만의 웹브라우저 만들기 (0) | 2021.01.22 |
Kotlin 타이머 만들기 (0) | 2021.01.18 |
Kotlin BMI(비만도) 계산기 앱 만들기 (0) | 2021.01.18 |