package com.test.acc;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
public class HardAcceleratorActivity extends Activity {
SensorManager mSm;
AcceleratorView mView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mView = new AcceleratorView(this);
setContentView(mView);
mSm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
protected void onResume() {
super.onResume();
mSm.registerListener(mView, mSm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
mSm.registerListener(mView, mSm.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), SensorManager.SENSOR_DELAY_FASTEST);
}
protected void onPause() {
super.onPause();
mSm.unregisterListener(mView);
}
class AccelValue {
float x;
float y;
float z;
}
class AcceleratorView extends View implements SensorEventListener {
int width;
int height;
int w10;
ArrayList <AccelValue> arValue = new ArrayList<AccelValue>();
final static int MAGX = 2;
final static int MAGY = 1;
boolean mStop = false;
public AcceleratorView(Context context) {
super(context);
}
public void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
w10 = width / 10;
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
float G=0;
float[] R=new float[9];
public void onSensorChanged(SensorEvent event) {
if (mStop) {
return;
}
float[] v = event.values;
switch (event.sensor.getType()) {
case Sensor.TYPE_ROTATION_VECTOR:
SensorManager.getRotationMatrixFromVector(R, event.values);
break;
case Sensor.TYPE_LINEAR_ACCELERATION:
case Sensor.TYPE_GRAVITY:
case Sensor.TYPE_ACCELEROMETER:
if (arValue.size() * MAGY > height) {
arValue.clear();
}
if(G==0){
G=v[2];
}
AccelValue av = new AccelValue();
av.x = v[0] * R[ 3] + v[1] * R[1] + v[2] * R[2];
av.y = v[0] * R[3] + v[1] * R[4] + v[2] * R[5];
av.z = v[0] * R[6] + v[1] * R[7] + v[2] * R[8];
// 이 위의 세줄이 가장 중요
arValue.add(av);
invalidate();
break;
}
}
float sumX = 0;
float sumY = 0;
float sumZ = 0;
public void onDraw(Canvas canvas) {
Paint Pnt = new Paint();
Pnt.setColor(Color.WHITE);
Pnt.setTextSize(20);
Paint linePaint = new Paint();
linePaint.setColor(0xff404040);
int i;
int x, y;
int oldx, oldy;
int basex;
// X 가속 그림
basex = oldx = w10 * 2;
oldy = 0;
canvas.drawText("X", basex - 25, 25, Pnt);
canvas.drawLine(basex, 0, basex, height, linePaint);
for (i = 0; i < arValue.size(); i++) {
x = (int) (basex + arValue.get(i).x * MAGX);
y = i * MAGY;
canvas.drawLine(oldx, oldy, x, y, Pnt);
oldx = x;
oldy = y;
}
// Y 가속 그림
basex = oldx = w10 * 5;
oldy = 0;
canvas.drawText("Y", basex - 25, 25, Pnt);
canvas.drawLine(basex, 0, basex, height, linePaint);
for (i = 0; i < arValue.size(); i++) {
x = (int) (basex + arValue.get(i).y * MAGX);
y = i * MAGY;
canvas.drawLine(oldx, oldy, x, y, Pnt);
oldx = x;
oldy = y;
}
// Z 가속 그림
basex = oldx = w10 * 8;
oldy = 0;
canvas.drawText("Z", basex - 25, 25, Pnt);
canvas.drawLine(basex, 0, basex, height, linePaint);
for (i = 0; i < arValue.size(); i++) {
x = (int) (basex + (arValue.get(i).z -G) * MAGX);
y = i * MAGY;
canvas.drawLine(oldx, oldy, x, y, Pnt);
oldx = x;
oldy = y;
}
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mStop = !mStop;
return true;
}
return false;
}
}
}
참조 : http://www.winapi.co.kr/android/annex/19-2.htm
알고보니 winapi 주인이 안드로이드 완전정복 저자였네
사이트는 http://www.winapi.co.kr/android/ 여기
참고로 레이아웃 이딴거 필요없고 소스코드 복붙애서 실행하면 끝
'Programming > Android' 카테고리의 다른 글
| Cocos2D Android 줄바꾸기 (4) | 2012.02.04 |
|---|---|
| 장치의 방향에 관계없이 가속도 값을 알아내는법. (4) | 2011.10.30 |