dalgorithm
달공의 개발기
dalgorithm
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • Back-end (0)
    • Java (11)
    • 자료구조 (7)
    • Network (31)
    • Database (9)
    • Baekjoon Online (24)
    • 클라우드 (6)
    • Android (15)
      • Kotlin (14)
    • AI (27)
      • Machine Learning&Deep Learn.. (27)
    • Web (23)
      • Webhacking (17)
      • WebProgramming (6)
    • 기술면접 (1)
      • JAVA&자료구조 (0)
      • Spring (0)
      • 컴퓨터구조&운영체제 (0)
      • 네트워크 (0)
      • 데이터베이스 (0)
    • CTF 스터디 (15)
    • 대외활동 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • kotlin
  • 데이터베이스
  • 코드리뷰
  • java
  • 포너블
  • CTF
  • 딥러닝
  • db
  • 자바
  • cs
  • 네트워크
  • 클라우드
  • 웹해킹
  • 침입탐지
  • gcp
  • Guacamole
  • 인공지능
  • 자료구조
  • 머신러닝
  • python #백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dalgorithm

달공의 개발기

Kotlin 수평측정기 만들기
Android/Kotlin

Kotlin 수평측정기 만들기

2021. 1. 22. 12:23
728x90

 

✔ 수평측정기 기능

- 수평 유지를 위해 기기를 평평하게 놓아 원이 중앙에 오게 한다.

- 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)
    }
}
728x90

'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
    'Android/Kotlin' 카테고리의 다른 글
    • SQLite에서의 데이터 베이스 구축
    • Kotlin 실로폰 만들기
    • Kotlin 나만의 웹브라우저 만들기
    • Kotlin 타이머 만들기
    dalgorithm
    dalgorithm

    티스토리툴바