package com.example.heart;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
// SensorEventListener를 구현하며 Activity를 상속받고 있는 클래스 Scr5
public class MainActivity extends Activity implements SensorEventListener
{
// 맴버변수 (마지막과 현재값을 비교하여 변위를 계산하는 방식)
private long m_lLastTime;
private float m_fSpeed;
private float m_fCurX, m_fCurY, m_fCurZ;
private float m_fLastX, m_fLastY, m_fLastZ;
// 임계값 설정
private static final int SHAKE_THRESHOLD = 5000;
// 매니저 객체
private SensorManager m_senMng;
private Sensor m_senAccelerometer;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 시스템 서비스에서 센서메니져 획득
m_senMng = (SensorManager)getSystemService(SENSOR_SERVICE);
// TYPE_ACCELEROMETER의 기본 센서객체를 획득
m_senAccelerometer = m_senMng.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
// 흔들기가 시작되면 호출되는 함수
public void onStart()
{
Log.i("kmsTest", "onStart()");
super.onStart();
if(m_senAccelerometer != null)
m_senMng.registerListener(this, m_senAccelerometer, SensorManager.SENSOR_DELAY_GAME);
}
// 흔들기가 끝나면 호출되는 함수
public void onStop()
{
Log.i("kmsTest", "onStop()");
super.onStop();
if(m_senMng != null)
m_senMng.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// 반드시 제 정의가 필요한 메서드지만 이 예제에서는 사용되지 않음
}
// 센서에 변화를 감지하기 위해 계속 호출되고 있는 함수
public void onSensorChanged(SensorEvent event)
{
final String [] answers = {"니가 말하는거 그런거 잘 모르겠어.. 아마 사랑이 아닌가봐",
"너 나 좋아하지? 나 굉장히 종아 하나보다.. 안그러면 내 가슴이 이렇게 뛰겠니?",
"분명히 알아둬. 너보다 내가 더 사랑해"};
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
long lCurTime = System.currentTimeMillis();
long lGabOfTime = lCurTime - m_lLastTime;
// 0.1초보다 오래되면 다음을 수행 (100ms)
if(lGabOfTime > 110)
{
m_lLastTime = lCurTime;
m_fCurX = event.values[SensorManager.DATA_X];
m_fCurY = event.values[SensorManager.DATA_Y];
m_fCurZ = event.values[SensorManager.DATA_Z];
// 변위의 절대값에 / lGabOfTime * 10000 하여 스피드 계산
m_fSpeed = Math.abs(m_fCurX + m_fCurY + m_fCurZ - m_fLastX - m_fLastY - m_fLastZ) / lGabOfTime * 10000;
// 임계값보다 크게 움직였을 경우 다음을 수행
if(m_fSpeed > SHAKE_THRESHOLD)
{
Log.i("androida", "Shake");
Toast.makeText(this,answers[(int)(Math.random() * answers.length)] , Toast.LENGTH_LONG).show();
}
// 마지막 위치 저장
// m_fLastX = event.values[0]; 그냥 배열의 0번 인덱스가 X값
m_fLastX = event.values[SensorManager.DATA_X];
m_fLastY = event.values[SensorManager.DATA_Y];
m_fLastZ = event.values[SensorManager.DATA_Z];
}
}
}
}
------------------
텍스트가 계속 나옵니다.
텍스 하나가 나오고 그게 멈처 있었으면 하는데 방법좀 가르쳐주시면 안될까요?