English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서는 안드로이드 프로그래밍에서 중력感应의 사용 방법에 대한 예제를 다룹니다. 여러분에게 공유하고 참고하시기 바랍니다. 구체적인 내용은 다음과 같습니다:
중력感应은 주로 휴대폰의 가속도 센서(accelerometer)를 통해 이루어집니다
안드로이드 개발에서 총 8가지 센서가 있지만 모든 실제 기기가 이 센서를 모두 지원하지 않을 수 있습니다. 많은 기능은 사용자가 관심이 없기 때문에 개발자가 일부 기능을 차단할 수 있습니다. 실제 기기의 상황에 따라 개발을 해야 하며, 아래에서는 가속도 센서의 구체적인 구현 방식을 주로 논의하겠습니다. 센서 이름은 다음과 같습니다:
가속도 센서(accelerometer)
기울기 센서(gyroscope)
환경照度 센서(light)
마그네티즌 센서(magnetic field)
방향 센서(orientation)
압력 센서(pressure)
거리 센서(proximity)
온도 센서(temperature)
1.
폰의 모든 센서는 SensorManager를 통해 접근해야 합니다. getSystemService(SENSOR_SERVICE) 메서드를 호출하여 현재 폰의 센서 관리 객체를 가져옵니다.
2.
를 통해 SensorEventListener 인터페이스의 onSensorChanged(SensorEvent event) 메서드를 구현하여 폰 센서의 상태를 캡처하고, 폰의 X축, Y축, Z축의 중력 구성분을 가져옵니다. 이 세 방향의 데이터가 있으면 중력 인식 원리를 배웠습니다.
public void onSensorChanged(SensorEvent e) { float x = e.values[SensorManager.DATA_X]; float y = e.values[SensorManager.DATA_Y]; float z = e.values[SensorManager.DATA_Z]; };
와 같은 코드를 보면 float x y z 3의 범위는-10到10之间。아래에서 X축, Y축, Z축 중력 구성분의 의미를 설명하겠습니다. (이곳에서는 원점: 하늘을 향하면 음수, 지면을 향하면 양수로, 프로그래밍 시의 좌표와는 반대로 설정됩니다):
(1)폰 화면이 좌측으로 향하면, X축이 하늘을 향하게 되며 직립으로 배치되면, 이때 Y축과 Z축에는 중력 구성분이 없습니다. X축이 하늘을 향하기 때문에 그 중력 구성분이 가장 큽니다. 이때 X축, Y축, Z축의 중력 구성분의 값은 각각 (10,0,0);
(2)폰 화면이 우측으로 향하면, X축이 지면을 향하게 되며 직립으로 배치되면, 이때 Y축과 Z축에는 중력 구성분이 없습니다. X축이 지면을 향하기 때문에 그 중력 구성분이 가장 작습니다. 이때 X축, Y축, Z축의 중력 구성분의 값은 각각 (-10,0,0);
(3)폰 화면이 직립으로 배치되면, Y축이 하늘을 향하게 되며 직립으로 배치되면, 이때 X축과 Z축에는 중력 구성분이 없습니다. Y축이 하늘을 향하기 때문에 그 중력 구성분이 가장 큽니다. 이때 X축, Y축, Z축의 중력 구성분의 값은 각각 (0,10,0);
(4)폰 화면이 직립으로 배치되면, Y축이 지면을 향하게 되며 직립으로 배치되면, 이때 X축과 Z축에는 중력 구성분이 없습니다. Y축이 지면을 향하기 때문에 그 중력 구성분이 가장 작습니다. 이때 X축, Y축, Z축의 중력 구성분의 값은 각각 (0,-10,0);
(5)폰 화면이 위쪽으로 향하면 Z축이 하늘을 향하게 되며 수평으로 배치되면, 이때 X축과 Y축에는 중력 구성분이 없습니다. Z축이 하늘을 향하기 때문에 그 중력 구성분이 가장 큽니다. 이때 X축, Y축, Z축의 중력 구성분의 값은 각각 (0, 0,10);
(6)휴대폰 화면이 위쪽을 향하면, Z축이地面을 향하게 되며, 수평으로 배치되면, X축과 Y축에는 중력 성분이 없습니다. Z축이地面을 향하기 때문에 그 중력 성분은 가장 작습니다. 이 때 X축, Y축, Z축의 중력 성분의 값은(0, 0,-10)。
3. SensorEventListener 등록
SensorMannager를 호출하여 getDefaultSensor(Sensor.TYPE_ACCELEROMETER) 메서드를 사용하여 가속 중력 센서 객체를 가져옵니다. 저는 중력 가속도 센서에 대해 논의하고 있으므로 매개변수는 Sensor.TYPE_ACCELEROMETER입니다. 다른 센서를 가져오려면 해당 이름을 전달해야 합니다. SensorMannager를 호출하여 registerListener() 메서드를 사용하여 등록하고, 세 번째 매개변수는 감지의 정밀도입니다. 필요한 정밀도에 따라 선택할 수 있으며, 게임 개발에서는 SensorManagerSENSOR_DELAY_ GAME를 사용하는 것이 좋습니다.
4 . 중력 감지 간단한 속도 계산 방법
휴대폰을 흔들면 X축, Y축, Z축의 중력 성분을 계산하여 기록할 수 있습니다. 그런 다음, 각 번의 흔들기 중력 성분과 이전의 중력 성분을 비교하여, 차이와 시간을 사용하여 이동 속도를 계산할 수 있습니다.
gravitation sensor는 센서, 프로세서, 컨트롤러 세 부분으로 구성되어 있습니다. 센서는 메모리 상태를 감지하고 메모리의 중력 가속도 값을 계산합니다; 프로세서는 가속도 값이 안전 범위를 초과하는지�断정합니다; 컨트롤러는 마그넷 헤드를 안전한 정지 구역에 고정하거나 해제하는 역할을 합니다. 센서가 감지하고 프로세서가 현재의 중력 가속도가 안전 값을 초과하면, 컨트롤러는 하드웨어를 통해 마그넷 헤드의 읽기/쓰기 작업을 중지하고 빠르게 정리하여 특정한 마그넷 헤드 정지 구역에 고정합니다. 이러한 시리즈의 작업은200밀리초 내에 완료됩니다. 감지 장치가 가속도가 정상 범위로 복구되면 제품이 다시 작동합니다.
Android 멀티미디어 프레임워크 코드는 다음 디렉토리에 있습니다: external/opencore/. 이 디렉토리는 Android 멀티미디어 프레임워크의 루트 디렉토리로, 다음과 같은 서브 디렉토리를 포함하고 있습니다:
* android: 여기에는 상위 라이브러리가 있으며, PVPlayer와 PVAuthor SDK를 기반으로 Android에서 사용할 수 있는 Player와 Author를 구현했습니다
* baselibs: 데이터 구조와 스레드 보안 등을 포함한 하부 라이브러리
* codecs_v2: 이는 내용이 많은 라이브러리로, 주로 인코딩/디코딩 구현 및 OpenMAX 구현을 포함하고 있습니다
* engines: 포함된 PVPlayer와 PVAuthor 엔진 구현
*extern_libs_v2: khronos의 OpenMAX 헤더 파일 포함
*fileformats: 파일 형식의 구체적인 해석 (parser) 클래스
* nodes: 디코딩 및 파일 해석의 각 node 클래스
* oscl: 운영 체제 호환 라이브러리
* pvmi: 입력/출력 제어의 추상 인터페이스
* protocols: 네트워크와 관련된 RTSP, RTP, HTTP 등 프로토콜 관련 내용
* pvcommon: pvcommon 라이브러리 파일의 Android.mk 파일, 소스 파일이 없습니다
*pvplayer: pvplayer 라이브러리 파일의 Android.mk 파일, 소스 파일이 없습니다
* pvauthor: pvauthor 라이브러리 파일의 Android.mk 파일, 소스 파일이 없습니다
* tools_v2: 컴파일 도구 및 등록 가능한 모듈
아래는 일부 테스트 코드입니다:
private SensorManager sensorMgr; Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //이전 x y z의 좌표를 저장합니다 float bx = 0; float by = 0; float bz = 0; long btime = 0;//이번 시간 sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); SensorEventListener lsn = new SensorEventListener() { public void onSensorChanged(SensorEvent e) { float x = e.values[SensorManager.DATA_X]; float y = e.values[SensorManager.DATA_Y]; float z = e.values[SensorManager.DATA_Z]; //X Y Z의 값을 계산한 후 이 값을 기준으로 흔들림 속도를 계산할 수 있습니다 //속도 = 거리/시간 //X축의 속도 float speadX = (x - bx) / (System.currentTimeMillis() - btime); //y축의 속도 float speadY = (y - by) / (System.currentTimeMillis() - btime); //z축의 속도 float speadZ = (z - bz) / (System.currentTimeMillis() - btime); //이렇게 간단한 속도를 계산할 수 있습니다. 가속도를 계산하고 싶다면, 운동학에서, 가속도 a는 속도와 관련이 있습니다. //이동은 모두 관련이 있습니다:Vt=V0+at,S=V0*t+1/2at^2, S=(Vt^2-V0^2)/(2a), 이 정보를 바탕으로 a를 계산할 수 있습니다 bx = x; by = y; bz = z; btime = System.currentTimeMillis(); }; public void onAccuracyChanged(Sensor s, int accuracy) { }; }; // listener를 등록합니다. 세 번째 매개변수는 검출 정확도입니다 sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);
Android와 관련된 더 많은 내용에 대해 관심이 있는 독자는 사이트의 특집을 확인할 수 있습니다:《Android 개발 입문 및 고급 교본》、《Android 뷰 View 기술 요약》、《Android 프로그래밍에서 activity 작업 기술 요약》、《Android SQLite 데이터베이스 작업 기술 요약》、《Android json 형식 데이터 작업 기술 요약》、《Android 데이터베이스 작업 기술 요약》、《Android 파일 작업 기술 요약》、《Android 프로그래밍 개발에서 SD 카드 작업 방법 요약》、《Android 자원 작업 기술 요약》 및 《Android 컨트롤러 사용 요약》
본 문서에서 설명된 내용이 모두 여러분의 Android 프로그램 설계에 도움이 되길 바랍니다.
성명서: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 사이트는 저작권을 소유하지 않으며, 인공적인 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 문제가 있는 내용을 발견하시면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(보고서를 작성할 때, #을 @으로 변경하십시오. 신고하고 관련 증거를 제공하시면, 사이트는 즉시 의심스러운 저작권 내용을 삭제합니다.