수평 측정기 App 만드는데 자꾸 앱 중지라는 오류가 떠요 ㅜㅜ
앱 실행은 정상적으로 되야하는거 같은데, build.gradle(Module:app)에서 버전같은 걸 다르게 설정해놔야하는건가요?... 도와주세요 ㅜㅜ
//MainActivity.kt
package com.example.kimyo.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 android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.WindowManager
class MainActivity : AppCompatActivity(), SensorEventListener {
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int): Unit =
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
override fun onSensorChanged(event: SensorEvent?) {
// 센서값이 변경되면 호출됨
// value[0] : x축 값: 위로 기울이면 -10~0, 아래로 기울이면 0~10
// value[1] : y축 값: 왼쪽으로 기울이면 -10~0, 오른쪽으로 기울이면 0~10
// value[2] : z축 값: 미사용
event?.let {
Log.d(
"MainActivity", "onSensorChanged: x :" +
" ${event.values[0]}, y: ${event.values[1]}, z: ${event.values[2]}"
)
tiltView.onSensorEvent(event)
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
private val sensorManager by lazy {
getSystemService(Context.SENSOR_SERVICE) as SensorManager
}
private lateinit var tiltView: TiltView
override fun onCreate(savedInstanceState: Bundle?) {
// 화면이 꺼지지 않게 하기
window.addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)
// 화면이 가로 모드로 고정되게 하기
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
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)
}
}
// TiltView.kt
package com.example.kimyo.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
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
//
init {
// 녹색 페인트
greenPaint.color = Color.GREEN
// 검은색 페인트
blackPaint.color = Color.BLACK
}
//
override fun onSizeChanged(w: Int, h:Int, oldw: Int, oldh: Int) {
cX = w / 2f
cY = h / 2f
}
//
override fun onDraw(canvas: Canvas?) {
// 바깥 원
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)
}
private var xCoord: Float = 0f
private var yCoord: Float = 0f
//
fun onSensorEvent(event: SensorEvent) {
// 화면을 가로로 돌렸으므로 X축과 Y축을 서로 바꿈
yCoord = event.values[0] * 20
xCoord = event.values[0] * 20
invalidate()
}
}