본문 바로가기

BLE/안드로이드 앱

[Noise Detector] 그래픽 모듈 (4) : CriticalLine

안드로이드는 화면이 터치되면 MotionEvent 객체를 onTouchEvent() 메소드에 넣어 호출합니다. MotionEvent 객체를 통해 사용자가 터치가 이동한 거리를 추출할 수 있습니다. 하지만 이렇게 추출된 거리는 픽셀 단위이기 때문에, 이후 수신될 데이터와 비교하기 위해서는 값 단위로 변환될 필요가 있고, 또한 수신될 데이터는 화면에 그리려지기 위해 픽셀 단위로 변환될 필요가 있습니다. 이것을 mPixelToValue와 mValueToPixel이 담당합니다. 그릴때마다 계산하면 리소스에 부담이될 수도 있기때문에 최초 onDraw() 호출에서 구한 값을 상수처럼 이용합니다.

 

onTouch() 메소드 안에 있는 setCLValue() 메소드는 추출한 이동 거리를 픽셀 단위에서 값 단위로 변경하여 현재 경고 라인이 위치한 값(mCLValue)에 더하고 SharedPreference에 저장하여 앱이 종료되고 다시 시작된 이후에도 최근 값을 유지합니다. mCLValue는 WaveDataView의 getView()에 입력한 최대값과 최소값 사이에만 위치할 수 있습니다. 또한 setCLValue() 메소드는 CriticalLine.InternalCLValueLinstener와  CriticalLine.ExternalCLValueLinstener 인터페이스의 getCLValue() 메소드를 호출하여 두 인터페이스를 구현하는 객체가 변환된 mCLValue 값을 즉시 갱신할 수 있도록 합니다. 

 

CriticalLine.InternalCLValueLinstener는 항상 WaveBars가 구현하고, CriticalLine.ExternalCLValueLinstener은 구현할 수도 안할 수도 있지만, 이번 프로젝트에서는 NDSActivity가 구현했습니다.