TiltSensor에 들어간 클래스/위젯
class, component on the TIltSensor
- Custom View
- Paint,Canvas
- ACCELEROMETER Censor (가속도 센서)





TiltView.kt
package com.example.tiltsensor
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.hardware.SensorEvent
import android.view.View
// TiltView 커스텀뷰
// xml을 사용하지 않고 직접 제작해서 만드는 뷰(화면)
// View를 상속받는데 생성자를 오버라이드함 <context를 받을 수 있게>
// context는 어플리케이션 시스템 관리 객체이다
// 코틀린,자바로 뷰를 제작하려면 context를 받는게 약속이다
class TiltView(context: Context?) : View(context) {
// 그릴 때 붓의 역할하는 객체 만들기
private val greenPaint: Paint =Paint()
private val blackPaint:Paint=Paint()
// 중점 변수 선언
private var cX:Float=0f
private var cY:Float=0f
// 센서 x,y값 변수
private var xCoord:Float=0f
private var yCoord:Float=0f
init{
// 색깔을 초록색으로 설정
greenPaint.color= Color.GREEN
// 외곽선만 그리게 설정
blackPaint.style=Paint.Style.STROKE
}
// 뷰의 크기가 변경될 때 호출되는 메소드
// 그런데 처음에 뷰의 크기가 정해지면 어차피 호출됨
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
// w: 변경된 뷰 가로 길이, h: 세로 길이
// oldw: 변경 전 뷰 가로 길이, oldh: 세로 길이
// 중점 변수 초기화
cX=w/2f
cY=h/2f
}
// 그림 그리기 메소드
override fun onDraw(canvas: Canvas?){
//바깥 검정색 외곽만 그려진 원
canvas?.drawCircle(cX,cY,100f,blackPaint)
// 안쪽 녹색으로 채워진 원
// [센서의 x값과 y값이 변함에 따라 그려지는 원의 위치도 다름]
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)
}
// 센서가 변하고 onSensorChanged에서 호출시킴
fun onSensorEvent(event:SensorEvent){
// 화면을 가로로 돌렸으므로 x축과 y축을 서로 바꿈
// 값이 너무 작으므로 20을 곱함
yCoord=event.values[0]*20
xCoord=event.values[1]*20
// 다시 그리기 메소드
invalidate()
}
}
MainActivity.kt
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.view.WindowManager
class MainActivity : AppCompatActivity(), SensorEventListener {
// sensorManager를 처음 사용할 때 초기화 <객체를 가리키게 됨>
private val sensorManager by lazy{
// 센서를 사용하기 위해 센서 매니저 객체를 만들기
// SystemService에서 센서 매니저 객체를 가져오고, 참조변수의 자료형을 SensorManager로 변환
getSystemService(Context.SENSOR_SERVICE) as SensorManager
}
// 화면을 담당할 TiltView 객체를 가리킬 수 있는 참조변수 선언 (늦은 초기화)
private lateinit var tiltView:TiltView
// 센서 정밀도가 변경되면 호출되는 메소드
override fun onAccuracyChanged(p0: Sensor?, p1: Int) {
}
// 센서 값이 변경되면 호출되는 메소드 <센서는 sensorEvent객체에 정보를 넘기고, 해당 객체의 멤버가 바뀌면 이 메소드가 호출됨>
override fun onSensorChanged(event: SensorEvent?) {
// value[0]: x축 값: 위로 기울이면 -10~0, 아래로 기울이면 0~10
// value[1]: y축 값: 왼쪽으로 기울이면 -10~0, 오른쪽으로 기울이면 0~10
// value[2]: z축 값: 미사용
// 기능은 let메소드 안에 정의한다
event?.let{
// 이벤트 객체를 넘겨서 센서 값을 알 수 있게 함
tiltView.onSensorEvent(event)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
// 화면이 꺼지지 않게 하기
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
// 화면이 가로 모드로 고정되게 하기
requestedOrientation= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
super.onCreate(savedInstanceState)
// TiltView객체 선언 및 화면을 TiltView로 지정
tiltView=TiltView(this)
setContentView(tiltView)
}
// onCreate->onStart다음에 호출되는 메소드
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)
}
}