¹æÇâ°ªÀº ÀåºñÀÇ ÇöÀç ¹æÇâ°ú ÀÚ¼¼¸¦ ³ªÅ¸³½´Ù. ¾îµð¸¦ ÇâÇÏ°í ÀÖ°í ¾ó¸¶¸¸Å ±â¿ï¾î ÀÖ´ÂÁö¸¦ ¹æÇâ°ªÀ¸·Î ÆǺ°ÇÒ ¼ö ÀÖ´Ù. ¸®½º³Ê·Î ¼¼ °³ÀÇ °ªÀÌ Àü´ÞµÇ´Âµ¥ ÀÌ´Â Àåºñ°¡ ÀÖ´Â °ø°£ÀÌ 3Â÷¿ø ÁÂÇ¥°èÀÌ¸ç ¼öÇÐÀû 3Â÷¿ø °ø°£¿¡´Â ÃàÀÌ ¼¼ °³ Àֱ⠶§¹®ÀÌ´Ù. Àåºñ¸¦ ÆòÆòÇÑ ¹Ù´Ú¿¡ ³õ¾ÒÀ» ¶§ X, YÃàÀº °¢°¢ ¼öÆò, ¼öÁ÷ÃàÀ̸ç ZÃàÀº ÇÏ´Ã ¹æÇâÀÌ´Ù. ȸéÀÇ ÁÂÇÏ´ÜÁ¡ÀÌ ¿øÁ¡À̸ç X´Â ¿À¸¥ÂÊ, Y´Â À§ÂÊ, Z´Â ÇÏ´ÃÂÊÀ¸·Î Áõ°¡ÇÑ´Ù.
¼¾¼ ¸®½º³ÊÀÇ values ¹è¿·Î Àü´ÞµÇ´Â 3°³ÀÇ °ªÀ» °¢°¢ ¹æÀ§°¢(Azimuth), ÇÇÄ¡(Pitch), ·Ñ(Roll)À̶ó°í ÇÑ´Ù. ¹è¿¿¡ ´ã°Ü Àü´ÞµÇ¹Ç·Î values[0], values[1] , values[2] ½ÄÀ¸·Î ¹è¿ ¿ä¼Ò¸¦ ¹Ù·Î Àд´Ù. ÇÇÄ¡, ·ÑÀº ±»ÀÌ ¹ø¿ªÇÏÀÚ¸é ±â¿ï±â³ª ±¸¸£±â·Î ¹ø¿ªÇÒ ¼öµµ ÀÖ°ÚÀ¸³ª ÀϹÝÀûÀÌÁö ¾ÊÀ¸¹Ç·Î ¿øÁֹΠ¿ë¾î¸¦ ±×³É ¾²±â·Î ÇÑ´Ù.
¹æÀ§°¢Àº Àåºñ Y Ãà°ú Áö±¸ Àںϰ£ÀÇ °¢µµÀÌ´Ù. ½±°Ô ¸»Çؼ ³ªÄ§¹ÝÀ¸·Î ÃøÁ¤ÇÑ °ªÀ̸ç ÀåºñÀÇ À§ÂÊ À̸¶ ºÎºÐÀÌ ¾î´À ¹æÇâÀ» ÇâÇÏ°í ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù. »ó½ÄÀûÀÎ ³»¿ëÀÌÁö¸¸ ÀÚºÏÀº ÁøºÏ°ú´Â ´Þ¶ó¼ ºÏ±ØÀ¸·Î À̵¿ÇÒ¼ö·Ï ¿ÀÂ÷°¡ ¹ß»ýÇÏ¸ç ºÏ±ØÁ¡¿¡¼´Â Á¤È®ÇÏÁö ¾Ê´Ù. ¶ÇÇÑ Àåºñ¿¡ ³»ÀåµÈ ÀüÀÚ ³ªÄ§¹ÝÀº ÀÚ±âÀåÀ» ÀνÄÇÏ¿© ¹æÇâÀ» ÆǺ°ÇϹǷΠÁÖº¯¿¡ ÀÚ¼®ÀÌ ÀÖÀ¸¸é Á¤È®µµ°¡ ¶³¾îÁø´Ù. ÀÌ´Â ½ÇÁ¦ ³ªÄ§¹Ýµµ ¸¶Âù°¡ÁöÀÌ´Ù.
Àåºñ¸¦ ÆòÆòÇÑ ¹Ù´Ú¿¡ ³õ¾Æ µÎ°í õõÈ÷ ȸÀü½ÃÅ°¸é¼ SensorDump ¿¹Á¦ÀÇ ¹æÀ§°¢ÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö °üÂûÇØ º¸ÀÚ. 360µµ °¢µµ·Î º¯ÇÒ °ÍÀÌ´Ù. ÀÌ °ªÀÌ 0ÀÏ ¶§ ÀåºñÀÇ À§ÂÊÀÌ ºÏÂÊÀ» ÇâÇϸç 90ÀÏ ¶§°¡ µ¿ÂÊ, 270ÀÏ ¶§°¡ ¼ÂÊÀÌ´Ù. °á°ú°¡ Á÷°üÀûÀÌ¶ó ½±°Ô ÀÌÇØµÉ °ÍÀÌ´Ù. Ȥ½Ã °ªÀÌ ÀÌ»óÇÏ°Ô ³ª¿Â´Ù¸é ¿·¿¡ ÄÄÇ»Åͳª ½ºÇÇÄ¿°¡ ÀÖ¾î¼ÀÌ´Ù. ÀÚ¼®ÀÌ ±Ùó¿¡ ÀÖÀ¸¸é Á¦´ë·Î ¹æÇâÀ» ÆÇ´ÜÇÏÁö ¸øÇϹǷΠ°Å½ÇÀ̳ª ¸¶´çÀ¸·Î ³ª°¡¼ Å×½ºÆ®ÇØ º¸¾Æ¶ó.
ÇÇÄ¡´Â XÃàÀÇ È¸Àü °¢µµÀÌ´Ù. ÀåºñÀÇ ¼öÆòÀ¸·Î ²¿Ã¬À̸¦ ²È¾Æ ³õ°í ²¿Ã¬À̸¦ µ¹¸± ¶§ÀÇ °¢µµ¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ¼öÆòÀ¸·Î ¹ÝµíÇÏ°Ô ³õÀ¸¸é ÇÇÄ¡´Â 0ÀÌ´Ù. Àåºñ À§ÂÊÀ» »ç¿ëÀÚÂÊÀ¸·Î ÀÏÀ¸ÄÑ ¼¼¿ì¸é À½ÀÇ ¹æÇâÀ¸·Î °¨¼ÒÇÏ°í ¾Æ·¡ÂÊÀ» »ç¿ëÀÚ ¹Ý´ëÂÊÀ¸·Î ¼¼¿ì¸é ¾çÀÇ ¹æÇâÀ¸·Î Áõ°¡ÇÑ´Ù. Àåºñ¸¦ µÚÁýÀ¸¸é 180µµ°¡ µÇ´Âµ¥ ¾î´À ¹æÇâÀ¸·Î µÚÁý¾ú´Â°¡¿¡ µû¶ó °¢µµÀÇ ºÎÈ£°¡ ´Þ¶óÁø´Ù.
±Û·Î ¼³¸íÇϱâ´Â ¾î·Á¿ì¹Ç·Î Àåºñ¸¦ ±â¿ï¿©°¡¸ç °ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö °üÂûÇØ º¸¾Æ¶ó. SensorDump ¿¹Á¦¸¦ ½ÇÇàÇØ ³õ°í ¾Æ·¡, À ¸éÀ» µé¾ú´Ù ³ù´Ù ÇÏ¸é¼ Pitch °ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö »ìÆì º¸¸é Á÷°üÀûÀ¸·Î ÀÌÇØµÉ °ÍÀÌ´Ù. ·ÑÀº YÃàÀÇ È¸Àü °¢µµÀÌ´Ù. ÆòÆòÇÏ°Ô ³õ¾ÒÀ» ¶§°¡ 0À̸ç Àåºñ¸¦ ¿À¸¥ÂÊÀ¸·Î ±â¿ïÀÌ¸é ¾çÀÇ ¹æÇâÀ¸·Î Áõ°¡ÇÏ°í ¿ÞÂÊÀ¸·Î ±â¿ïÀ̸é À½ÀÇ ¹æÇâÀ¸·Î °¨¼ÒÇÑ´Ù. ÇÇÄ¡¿Í´Â ´Þ¸® Àåºñ¸¦ ¿ÏÀüÈ÷ µÚÁýÀ¸¸é ´Ù½Ã 0ÀÌ µÈ´Ù.
°ªÀÌ ¾î¶² ½ÄÀ¸·Î º¯ÇÏ´ÂÁö´Â ¿©·ÆÁö ¾Ê°Ô ÀÌÇصÇÁö¸¸ Àû¿ëÇÒ ¶§¸¶´Ù ¸Å¹ø ºÎÈ£°¡ Çò°¥¸± °ÍÀÌ´Ù. Àåºñ¸¦ ¼öÆòÀ¸·Î ³õ°í ¿À¸¥ÂÊ ¾Æ·¡¸¦ µé¸é ÇÇÄ¡¿Í ·ÑÀÌ ¸ðµÎ Áõ°¡ÇÑ´Ù°í ¿Ü¿ö µÎµµ·Ï ÇÏÀÚ. Á¤ Çò°¥¸®¸é ¾ðÁ¦µçÁö ÀÌ ¿¹Á¦¸¦ ½ÇÇàÇØ ³õ°í Àåºñ¸¦ ¿ä·¡ Á¶·¡ µ¹·Á º¸¸é ±Ý¹æ º¹½ÀÀÌ µÉ °ÍÀÌ´Ù.
¹æÇâ°ªÀº ¼öÄ¡·Î Ç¥±âÇؼ´Â Àǹ̸¦ ±Ý¹æ ¾Ë±â ¾î·Á¿ì¹Ç·Î ½Ã°¢ÀûÀ¸·Î È®ÀÎÇØ º¸´Â °ÍÀÌ ÈξÀ ´õ Á÷°üÀûÀÌ´Ù. ¹æÇâ°ªÀ¸·Î ¸¸µé ¼ö ÀÖ´Â ÀüÇüÀûÀÎ ¿¹Á¦´Â ³ªÄ§¹Ý ¹× ¼öÆò°èÀ̸ç À¯»çÇÑ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ¸¹ÀÌ ¹ßÇ¥µÇ¾î ÀÖ´Ù. °£´ÜÇÑ ¿¹Á¦ÀÌµÇ ÁÂÇ¥ °è»ê¿¡ »ê¼ö°¡ ¸¹ÀÌ µé¾î°¡ Äڵ尡 Á» º¹ÀâÇØ º¸ÀδÙ.
hard_Compass |
public class hard_Compass extends Activity {
SensorManager mSm;
CompassView mView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mView = new CompassView(this);
setContentView(mView);
mSm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
}
protected void onResume() {
super.onResume();
mSm.registerListener(mView, mSm.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_UI);
}
protected void onPause() {
super.onPause();
mSm.unregisterListener(mView);
}
class CompassView extends View implements SensorEventListener {
float azimuth;
float pitch;
float roll;
final static int MAX = 30;
Paint textPnt = new Paint();
Bitmap compass;
int width;
int height;
int w10;
int h10;
int thick;
int length;
public CompassView(Context context) {
super(context);
textPnt.setColor(Color.BLACK);
textPnt.setTextSize(20);
textPnt.setAntiAlias(true);
compass = BitmapFactory.decodeResource(getResources(), R.drawable.compass);
}
public void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
w10 = width/10;
h10 = height/10;
thick = h10;
length = w10 * 8;
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
float[] v = event.values;
switch (event.sensor.getType()) {
case Sensor.TYPE_ORIENTATION:
if (azimuth != v[0] || pitch != v[1] || roll != v[2]) {
azimuth = v[0];
pitch = v[1];
roll = v[2];
invalidate();
}
break;
}
}
public void onDraw(Canvas canvas) {
Paint Pnt = new Paint();
Pnt.setAntiAlias(true);
// ¼öÆò, ¼öÁ÷ ¸·´ë±â ±×¸²
canvas.drawColor(Color.WHITE);
Pnt.setColor(Color.BLACK);
Rect pitchrt = new Rect(w10, h10, w10 + thick, h10 + length);
canvas.drawRect(pitchrt, Pnt);
Rect rollrt = new Rect(w10, h10*2 + length, w10*9, h10*2 + length + thick);
canvas.drawRect(rollrt, Pnt);
// ·Ñ °ª Ç¥½Ã
float rollvalue = roll < -MAX ? -MAX:roll > MAX ? MAX:roll;
int rollcenter = rollrt.left + rollrt.width()/2;
int rolllength = rollrt.width() - thick;
int rollpos = rollcenter + (int)(rolllength/2 * rollvalue / MAX);
Pnt.setColor(rollvalue == 0 ? Color.RED:Color.YELLOW);
canvas.drawCircle(rollpos, rollrt.top + thick/2, (int)(thick/2*0.9), Pnt);
canvas.drawText("roll:" + (int)roll, rollrt.left, rollrt.top-5, textPnt);
// ÇÇÄ¡°ª Ç¥½Ã
float pitchvalue = pitch;
if ((Math.abs(pitch)) > 90) {
pitchvalue = 180 - Math.abs(pitch);
if (pitch < 0) pitchvalue *= -1;
}
pitchvalue = pitchvalue < -MAX ? -MAX:pitchvalue > MAX ? MAX:pitchvalue;
int pitchcenter = pitchrt.top + pitchrt.height()/2;
int pitchlength = pitchrt.height() - thick;
int pitchpos = pitchcenter + (int)(pitchlength/2 * pitchvalue / MAX);
Pnt.setColor(pitchvalue == 0 ? Color.RED:Color.YELLOW);
canvas.drawCircle(pitchrt.left + thick/2, pitchpos, (int)(thick/2*0.9), Pnt);
canvas.drawText("pitch:" + (int)pitch, pitchrt.left, pitchrt.top-5, textPnt);
// ³ªÄ§¹Ý Ç¥½Ã
Matrix m = new Matrix();
m.postRotate(-azimuth, compass.getWidth()/2, compass.getHeight()/2);
m.postTranslate(rollcenter - compass.getWidth()/2 + thick,
pitchcenter - compass.getHeight()/2);
canvas.drawBitmap(compass, m, Pnt);
canvas.drawText("azimuth:" + (int)azimuth, rollcenter,
pitchcenter - compass.getHeight()/2 - 5, textPnt);
}
}
}
Àåºñ ¹æÇâÀÌ ¹Ù²ð ¶§¸¶´Ù ¾×ƼºñƼ°¡ Àç»ý¼ºµÇÁö ¾Êµµ·Ï ¸Å´ÏÆ佺Ʈ¿¡´Â ¼¼·Î Àü¿ëÀÇ ¼Ó¼ºÀ» ¼³Á¤Çß´Ù. º¸ÅëÀº ½Ã½ºÅÛÀÌ ¹æÇâÀ» ÆǺ°ÇÏ¿© ¾×ƼºñƼ¸¦ Àç»ý¼ºÇϴµ¥ ¾ÛÀÌ Á÷Á¢ ¼¾¼°ªÀ» »ç¿ëÇϹǷΠ½Ã½ºÅÛÀÌ ¹æÇظ¦ ÇÏÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌÈÄÀÇ ¼¾¼ °ü·Ã ¿¹Á¦µéµµ ¸¶Âù°¡ÁöÀÌ´Ù.
<activity android:name="hard_Compass" android:label="Compass"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden"
/>
¼¾¼·ÎºÎÅÍ ¹ÞÀº °ªÀ» Ä¿½ºÅÒ ºä¿¡ ±×·¡ÇÈÀ¸·Î ±×¸®¹Ç·Î ·¹À̾ƿôÀº µû·Î ÇÊ¿ä¾ø´Ù. ¸ÞÀÎ ¾×ƼºñƼÀÇ onCreate¿¡¼ Ä¿½ºÅÒ ºäÀÎ CompassView¸¦ »ý¼ºÇÏ¿© ä¿ì°í ¼¾¼ °ü¸®ÀÚ¸¦ ã¾Æ ³õ´Â´Ù. onResume¿¡¼ ¹æÇâ ¼¾¼ ¸®½º³Ê¸¦ Ä¿½ºÅÒ ºä·Î ¼³Á¤ÇÏ°í onPause¿¡¼´Â ÇØÁ¦ÇÏ¿© ¾×ƼºñƼ°¡ ½ÇÇàÁßÀÎ µ¿¾È¿¡¸¸ ¼¾¼°ªÀ» ¹Þµµ·Ï Çß´Ù.
¼¾¼ ¸®½º³Ê´Â ÀÎÅÍÆäÀ̽ºÀÏ »ÓÀ̹ǷΠ±»ÀÌ °´Ã¼¸¦ µû·Î ¸¸µé ÇÊ¿ä¾øÀÌ Ä¿½ºÅÒ ºä°¡ Á÷Á¢ ±¸ÇöÇصµ ¹«¹æÇÏ´Ù. Ä¿½ºÅÒ ºä´Â ¼¾¼·ÎºÎÅÍ Àü´ÞµÇ´Â °ªÀ» Á÷Á¢ ¹Þ¾Æ¼ ȸ鿡 ¼¾¼°ªÀ» º¸±â ÁÁ°Ô Ãâ·ÂÇÒ °ÍÀÌ´Ù. ³ª¸ÓÁö ÄÚµåµéÀº ´ëºÎºÐ ±×¸®±â Áغñ¿Í °£´ÜÇÑ °è»ê ·çƾµéÀÌ´Ù. »ý¼ºÀÚ´Â ÅؽºÆ® Ãâ·Â¿¡ »ç¿ëÇÒ Paint °³Ã¼¿Í ³ªÄ§¹Ý ºñÆ®¸ÊÀ» ·ÎµåÇÏ´Â ÃʱâÈ ÀÛ¾÷À» ó¸®ÇÑ´Ù. ºñÆ®¸ÊÀº ¿ë·®ÀÌ Å©¹Ç·Î ¹Ýµå½Ã ¹Ì¸® ÀÐ¾î µÎ¾î¾ß ÇÑ´Ù.
ºäÀÇ Å©±â°¡ ÃÖÃÊ·Î °áÁ¤µÇ´Â onSizeChanged¿¡¼´Â Æø°ú ³ôÀÌ, ±×¸®°í Æø, ³ôÀÌÀÇ 10% Å©±â¿Í ¸·´ëÀÇ ±½±â, ±æÀÌ µîÀ» ±¸ÇØ ³õ´Â´Ù. ÀåºñÀÇ ÇØ»óµµ¿Í »ó°ü¾øÀÌ ÀÏÁ¤ÇÑ ±æÀÌ¿Í ÆøÀ» °¡Áö±â À§ÇØ È¸é Æø°ú ³ôÀ̸¦ ±âÁØÀ¸·Î Å©±â¸¦ °è»êÇß´Ù. ¸·´ëÀÇ µÎ²²´Â ³ôÀÌÀÇ 10%, ±æÀÌ´Â ³ÊºñÀÇ 80%·Î ¼³Á¤Çß´Ù. ·¹À̾ƿô¿¡ ¹èÄ¡ÇÏÁö ¾Ê°í È¸é ºñÀ²¿¡ ¸Â°Ô °è»êÀ» ÇØ¾ß ¸ðµç Àåºñ¿¡ ÀÌ»ó¾øÀÌ µ¿ÀÛÇÑ´Ù.
¼¾¼ ¸®½º³Ê´Â ¹æÇâ°ªÀÌ °»½ÅµÇ¸é ºä °´Ã¼ÀÇ Çʵ忡 °ªÀ» ÀúÀåÇÏ°í ȸéÀ» ´Ù½Ã ±×¸®±â¸¸ ÇÑ´Ù. °»½ÅµÈ °ªÀ» ½ÇÁ¦ »ç¿ëÇÏ´Â °÷Àº onDrawÀÌ´Ù. °¡¸¸È÷ ÀÖ´Â »óÅ¿¡¼´Â ºÒÇÊ¿äÇÑ ±×¸®±â¸¦ ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î ÀÌÀü°ª°ú ´Ù¸¥Áö¸¦ Á¡°ËÇÏ¿© °»½ÅÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§¸¸ ´Ù½Ã ±×¸°´Ù. ÆòÆòÇÑ ¹Ù´Ú¿¡ °¡¸¸È÷ ³õ¾Æ µÎ¾îµµ ¼¾½º°ªÀÌ Áö¼ÓÀûÀ¸·Î Àü´ÞµÇ´Âµ¥ À̶§¸¶´Ù ±×¸®±â¸¦ ´Ù½Ã ÇÒ ÇÊ¿ä´Â ¾ø´Ù. onDraw´Â ¼¾¼ ¸®½º³Ê°¡ Çʵ忡 ÀúÀåÇØ ³õÀº °ªÀ» ÂüÁ¶ÇÏ¿© ȸéÀ» ±×¸°´Ù.
¿¡¹Ä·¹ÀÌÅÍ´Â ¼¾¼°¡ ¾øÀ¸¹Ç·Î ±×¸²¸¸ º¸¿©ÁÙ »Ó µ¿ÀÛÇÏÁö´Â ¾Ê´Â´Ù. ½ÇÀåºñ¿¡¼´Â ¹°·Ð Àß µ¿ÀÛÇÑ´Ù. onDrawÀÇ ÄÚµå´Â ´Ü¼øÇÑ Ãâ·Â¹®ÀÌµÇ ÁÂÇ¥¸¦ °è»êÇÏ´Â »ê¼ö°¡ ´Ù¼Ò º¹ÀâÇÑ °Í »ÓÀÌ´Ù. ¼öÆò ¼öÁ÷ ¸·´ë±â´Â drawRect·Î °£´ÜÇÏ°Ô ±×¸± ¼ö ÀÖµÇ ÀåÄ¡ µ¶¸³¼ºÀ» À§ÇØ È¸é Å©±â¸¦ ±âÁØÀ¸·Î ¹Ì¸® °è»êµÈ Å©±â°ªÀ» »ç¿ëÇÑ´Ù. ÇÇÄ¡, ·Ñ ¸·´ë±â´Â ¿ÞÂÊ, ¾Æ·¡ÂÊ¿¡ ¹èÄ¡ÇÏ°í ³ªÄ§¹ÝÀº Áß¾Ó¿¡ ºñÆ®¸ÊÀ¸·Î µû·Î ±×¸± °ÍÀÌ´Ù.
·Ñ ¸·´ë À§¿¡ ÇöÀç ·Ñ °ª À§Ä¡¸¦ ÀǹÌÇÏ´Â µ¿±×¶õ ¹°¹æ¿ïÀ» ¿øÀ¸·Î ±×¸°´Ù. ´Ü»ö ¿øÀ¸·Î ±×·È´Âµ¥ ¹°¹æ¿ï ¸ð¾çÀÇ ÀÔüÀûÀÎ À̹ÌÁö¸¦ »ç¿ëÇÏ¸é »ç½Ç°¨ÀÌ Çâ»óµÉ °ÍÀÌ´Ù. ·Ñ °ªÀÇ ¹üÀ§´Â 90µµ±îÁöÀÌÁö¸¸ ¾×ü´Â Á¡µµ°¡ ³·¾Æ »ì¦¸¸ ±â¿ï¿©µµ ¿òÁ÷ÀÌ´Â °ÍÀÌ »ó½ÄÀûÀ̹ǷΠ¹üÀ§¸¦ Á» Á¦ÇÑÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. MAX »ó¼ö´Â ¹°¹æ¿ïÀÌ Á¦ÀÏ À§¿¡ ´êÀ» ¶§ÀÇ °ªÀ» ÀǹÌÇϴµ¥ 30À¸·Î ¼³Á¤Çß´Ù. Áï, 30µµ ±â¿ïÀ̸é Á¦ÀÏ °¡ÀåÀÚ¸®·Î ¹°¹æ¿ïÀÌ À̵¿ÇÑ´Ù. rollvalue´Â ¼¾¼·ÎºÎÅÍ Àü´ÞµÈ roll°ªÀ» -30~30 ¹üÀ§·Î Á¶Á¤ÇÑ °ªÀÌ´Ù.
rollcenter´Â ¸·´ëÀÇ Áß¾Ó ÁÂÇ¥À̸ç rollÀÌ 0ÀÏ ¶§ ¹°¹æ¿ïÀÇ À§Ä¡ÀÌ´Ù. ¸·´ë ¿ÞÂÊ ÁÂÇ¥¿¡ ±æÀÌÀÇ Àý¹ÝÀ» ´õÇÏ¸é ¿©±â°¡ Áß¾ÓÀÌ´Ù. rolllength´Â ¹°¹æ¿ïÀÌ ¿òÁ÷ÀÏ ¹üÀ§¸¦ ÁöÁ¤Ç쵂 ¸·´ëÀÇ ±æÀÌ¿¡ ±½±â¸¦ »©¼ °è»êÇÑ´Ù. ¹°¹æ¿ïÀÇ ´ëÇ¥ ÁÂÇ¥´Â ¿øÀÇ Áß½ÉÀÌ¸ç °¡ÀåÀÚ¸®¿¡¼´Â ¿øÀÇ ¹ÝÁö¸§¸¸ÅÀ» »©¾ß ¿øÀÌ ¸·´ëÀÇ ³¡¿¡ ±×·ÁÁú °ÍÀÌ´Ù. ¾çÂÊ ¿øÀÇ ¹ÝÁö¸§ ÇÕÀÌ ¸·´ëÀÇ ±½±â¿Í °°À¸¹Ç·Î ±½±â¸¸Å¸¸ »©¸é µÈ´Ù. ±½±â¸¦ »©Áö ¾ÊÀ¸¸é °¡ÀåÀÚ¸®¿¡¼ ¹°¹æ¿ïÀÌ ¸·´ë ¹ÛÀ¸·Î »ßÁ® ³ª°¡¸ç ÀÌ´Â ±â´ëµÇ´Â °á°ú°¡ ¾Æ´Ï´Ù.
rollpos´Â rollvalue°ª¿¡ µû¸¥ ¿øÀÇ À§Ä¡ÀÌ´Ù. 0À϶§ Áß¾ÓÀÌ°í MAXÀÏ ¶§ ¸·´ëÀÇ ³¡À¸·Î À̵¿ÇØ¾ß Çϸç MAXº¸´Ù ÀÛÀº °ªÀÏ ¶§´Â ºñÀ²¿¡ ¸Â°Ô À§Ä¡¸¦ °áÁ¤ÇÑ´Ù. ºñÀ² °è»êÀº ´Ü¼øÇÑ 1Â÷ ¹æÁ¤½ÄÀÏ »ÓÀ̹ǷΠ´ÙÀ½ °ø½Ä´ë·Î Ç®¸é ¾ÆÁÖ ½±´Ù. ºñÀ²À» Àû¾î ³õ°í ³»º¯³¢¸® °öÇÏ°í ¿Üº¯³¢¸® °öÇÑ ÈÄ ¿øÇÏ´Â °ª¿¡ ´ëÇÑ ¹æÁ¤½ÄÀ» Ç®¸é µÈ´Ù. ¼ö½ÄÀ¸·Î Àû¾î ³õÀ¸¸é ¹º°¡ ´ë´ÜÇÑ °ø½ÄÀÎ °Íó·³ º¸ÀÌÁö¸¸ ÁßÇб³ ¼öÁØÀÇ »ê¼öÀÏ »ÓÀÌ´Ù.
MAX:rolllength/2 = rollvalue:x
x * MAX = rolllength/2 * rollvalue
x = rolllength/2 * rollvalue / MAX
±¸ÇØÁø À§Ä¡°ª¿¡ ¸·´ëÀÇ Áß¾Ó ÁÂÇ¥¸¦ ´õÇØ ÆòÇà À̵¿½ÃÅ°¸é ¸·´ëÀÇ ¾ÈÂÊ¿¡ ¿øÀÌ ¹èÄ¡µÈ´Ù. rollvalue°¡ À½¼öÀÏ ¶§´Â ÀÚ¿¬½º·´°Ô ¸·´ë Áß¾Ó¿¡¼ ¿ÞÂÊÀ¸·Î À̵¿ÇÑ´Ù. °ªÀ» ´Ù ±¸ÇßÀ¸¸é ÀÌÁ¦ ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ¼öÆòÀÌ ¸ÂÀ» ¶§´Â »¡°£»öÀ¸·Î ±×¸®°í ±×·¸Áö ¾ÊÀ» ¶§´Â ³ë¶õ»öÀ¸·Î ±×·È´Ù. ¿øÀº drawCircle·Î ±×¸®µÇ ¹ÝÁö¸§À» µÎ²²ÀÇ 90%·Î ¼³Á¤ÇÏ¿© ¾à°£ ¿©¹éÀ» µÎ¾úÀ¸¸ç °ªÀº Àû´çÇÑ À§Ä¡¿¡ ¹®ÀÚ¿·Î Ãâ·ÂÇß´Ù.
ÇÇÄ¡°ªÀ» Ç¥½ÃÇÏ´Â Äڵ嵵 ·Ñ°ª Ç¥½Ã ·çƾ°ú °ÅÀÇ µ¿ÀÏÇ쵂 °ªÀ» Á¤±ÔÈÇÏ´Â ºÎºÐ¸¸ Á¶±Ý ´Ù¸£´Ù. ·Ñ°ªÀº Àåºñ¸¦ µÚÁýÀ» ¶§ 0À¸·Î ´Ù½Ã ±ÙÁ¢ÇϹǷΠ±×´ë·Î »ç¿ëÇÏ¸é µÇÁö¸¸ ÇÇÄ¡´Â 180±îÁö Áõ°¡Çß´Ù°¡ ºÎÈ£¸¸ ¹Ù²ï´Ù. ÇÇÄ¡°¡ 90ÀÌ»óÀÏ ¶§´Â 180¿¡¼ ÇÇÄ¡ÀÇ Àý´ë°ªÀ» »©°í ºÎÈ£¸¦ ±×´ë·Î À¯ÁöÇÏ¸é µÚÁý¾îÁø »óÅ¿¡¼µµ ¹°¹æ¿ïÀÌ ¾Æ·¡ À§·Î Á¦´ë·Î ¿òÁ÷ÀδÙ. ÀÌ ±ÔÄ¢ÀÌ pitchvalue °è»ê½Ä¿¡ Ãß°¡ Àû¿ëµÇ¾î ÀÖÀ¸¸ç ³ª¸ÓÁö ³í¸®´Â ·Ñ°ª°ú µ¿ÀÏÇÏ´Ù.
¹æÀ§°¢À» Ç¥½ÃÇÏ´Â ³ªÄ§¹ÝÀº ȸÀü °è»êÀÌ µé¾î°¡¾ß ÇϹǷΠ±²ÀåÈ÷ º¹ÀâÇÒ °Í °°Áö¸¸ Çà·ÄÀ» »ç¿ëÇÏ¸é ¾ÆÁÖ ½±´Ù. Á¤ºÏÂÊÀ» À§·Î Ç¥½ÃÇÑ À̹ÌÁö¸¦ ÀÛ¼ºÇØ µÎ°í ¹æÀ§°¢¸¸Å ȸÀü½ÃÅ°µÇ ¹æÀ§°¢Àº ¹Ý½Ã°è ¹æÇâÀÌ°í Çà·ÄÀÇ °¢µµ´Â ½Ã°è ¹æÇâÀ̹ǷΠºÎÈ£¸¦ ¹Ý´ë·Î µÚÁý¾îÁØ´Ù. ȸÀüÀÇ Áß½ÉÁ¡Àº À̹ÌÁöÀÇ Áß¾Ó ÁöÁ¡À¸·Î ÁöÁ¤ÇÏ¿© À̹ÌÁöÀÇ °¡¿îµ¥¸¦ ±âÁØÀ¸·Î ȸÀüÇϵµ·Ï Çß´Ù. ȸÀü ÈÄ È¸éÀÇ Áß¾Ó ÁöÁ¡À¸·Î ÆòÇà À̵¿½ÃÄÑ ³ªÄ§¹ÝÀÇ Áß¾ÓÀÌ ÇÇÄ¡, ·ÑÀÇ ±³Á¡ÀÌ µÇµµ·Ï Ç쵂 ÇÇÄ¡ ¸·´ë°¡ ¿ÞÂÊ¿¡ ÀÖÀ¸¹Ç·Î ¸·´ë µÎ²²¸¸Å ¿À¸¥ÂÊÀ¸·Î ´õ À̵¿½ÃÄ×´Ù.
ȸÀü ¹× ÆòÇà À̵¿ ¿¬»êÀ» ¿¬¼ÓÀ¸·Î ÇÏµÇ È¸ÀüÀ» ¸ÕÀúÇÑ ÈÄ À̵¿ÇØ¾ß ¿øÇÏ´Â °á°ú°¡ ³ª¿Â´Ù. ¼³¸í»óÀ¸·Î´Â º¹ÀâÇØ º¸ÀÌÁö¸¸ ÄÚµå·Î´Â ´Ü µÎ ÁÙ¿¡ ºÒ°úÇÏ´Ù. ȸÀü°ú À̵¿À» Àû¿ëÇÑ Çà·ÄÀ» ¸¸µç ÈÄ drawBitmapÀ¸·Î Çà·ÄÀ» Àü´ÞÇÏ¸é ºñÆ®¸ÊÀ» ȸÀü ¹× À̵¿½ÃÅ°´Â ÀÛ¾÷Àº ¸Þ¼µå³»¿¡¼ ÀÚµ¿À¸·Î ¼öÇàµÈ´Ù. Çà·ÄÀÌ ¾Æ´Ï¸é ÀÌ·± 󸮴 ±²ÀåÈ÷ ±î´Ù·Î¿îµ¥ ´ÙÇàÈ÷ ¾Èµå·ÎÀ̵å´Â Çà·Ä ¿¬»êÀ» ÈǸ¢È÷ Áö¿øÇÏ¸ç °ü·Ã ³»¿ëÀº ±×·¡ÇÈ ºÎºÐ¿¡¼ ÀÌ¹Ì ¼³¸íÇÑ ¹Ù ÀÖ´Ù.
°¡¼Ó°è´Â Àåºñ°¡ ¾î´À ¹æÇâÀ¸·Î ¿òÁ÷ÀÌ´Â ÁßÀÎÁö¸¦ ¾Ë¾Æ³»´Â ¼¾¼ÀÌ´Ù. ÁÖÀÇÇÒ °ÍÀº ¾ó¸¶³ª »¡¸® ¿òÁ÷ÀÌ°í ÀÖ´ÂÁö¸¦ ³ªÅ¸³»´Â ¼Óµµ°è¿Í´Â ´Ù¸£´Ù´Â Á¡ÀÌ´Ù. °¡¼ÓÀ̶õ ¼öÇÐÀûÀ¸·Î ¼ÓµµÀÇ ¹ÌºÐÀ¸·Î Á¤ÀÇµÇ¸ç ¼Óµµ°¡ ¾î¶»°Ô º¯ÇÏ°í Àִ°¡¸¦ ³ªÅ¸³»´Â °ÍÀÌÁö ÇöÀçÀÇ À̵¿ ¼Óµµ¸¦ ³ªÅ¸³»´Â °ÍÀÌ ¾Æ´Ï´Ù. ¿Â÷¿¡ Ÿ°í ÀÖ´Â »óÅ¿¡¼´Â ÆùÀÌ ¿Â÷¿Í °°Àº ¼Óµµ·Î ¿òÁ÷ÀÌÁö¸¸ ¿Â÷ÀÇ ¼Óµµ°¡ ÀÏÁ¤ÇÏ´Ù¸é °¡¼ÓÀº Ç×»ó 0ÀÌ´Ù.
°¡¼Ó°è´Â Àåºñ°¡ ¸· ¿òÁ÷À̱⠽ÃÀÛÇÒ ¶§ ¼Óµµ°¡ ¾ó¸¶³ª ±Þ°ÝÇÏ°Ô ´Ã¾î³ª´ÂÁö, À̵¿À» ÁßÁöÇÒ ¶§ ¾ó¸¶³ª »¡¸® ¸ØÃß´ÂÁö¸¦ °¨ÁöÇس»´Â ¼¾¼ÀÌ´Ù. µû¶ó¼ °¡¼Ó°è°¡ ¹ÝÀÀÇÏ´Â °ÍÀ» È®ÀÎÇØ º¸·Á¸é Àåºñ¸¦ Èçµé¾î ºÁ¾ß ÇÏ¸ç ¼¼°Ô Èçµé¼ö·Ï °¡¼Ó°ªÀº Áõ°¡ÇÑ´Ù. ±×·¯³ª ȸéÀÌ º¸ÀÏ Á¤µµ·Î Èçµé¾î¼´Â °ªÀÌ °üÃøµÇÁö ¾ÊÀ¸¸ç ³Ê¹« ¼¼°Ô Èçµé¸é ±× °ªÀ» È®ÀÎÇϱ⠾î·Æ´Ù´Â °ï¶õÇÔÀÌ ÀÖ´Ù. SensorDump ¿¹Á¦´Â °¡¼Ó°ªÀ» Á¦´ë·Î Ãâ·ÂÇϱâ´Â ÇÏÁö¸¸ ÀÌ ¿¹Á¦¸¦ ¾Æ¹«¸® °·Á ºÁµµ ±ÔÄ¢À» ÆľÇÇϱ⿡´Â ÇÑ°è°¡ ÀÖ´Ù.
°¡¼ÓÀ̶õ ¼Óµµ¿Í ½Ã°£ÀÇ °³³äÀÌ °áÇÕµÈ °ÍÀ̶ó ÇÑ ½ÃÁ¡ÀÇ °¡¼Ó°ª¸¸ ºÁ¼´Â º¯È¸¦ È®ÀÎÇϱ⠾î·Á¿ì¸ç ½Ã°£ÀÇ °æ°ú¿¡ µû¶ó °ªÀÇ º¯È ÃßÀ̸¦ ½Ã°¢ÀûÀ¸·Î ±×·Á ºÁ¾ß °¡¼ÓÀÇ º¯È¸¦ ¸íÈ®ÇÏ°Ô °æÇèÇØ º¼ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â X, Y, Z ¼¼ ¹æÇâ¿¡ ´ëÇØ ¼öÁ÷ÃàÀ¸·Î °ªÀÇ º¯È¸¦ ¿¬¼ÓÀûÀ¸·Î º¸¿©ÁØ´Ù. ÀüüÀûÀÎ ±¸Á¶´Â Compass ¿¹Á¦¿Í ºñ½ÁÇ쵂 ¹æÇâ ¼¾¼ ´ë½Å °¡¼Ó ¼¾¼¿¡ ´ëÇÑ ¸®½º³Ê¸¦ ó¸®ÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù.
hard_Accelerator |
public class hard_Accelerator 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);
}
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) {
}
public void onSensorChanged(SensorEvent event) {
if (mStop) {
return;
}
float[] v = event.values;
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
if (arValue.size() * MAGY > height) {
arValue.clear();
}
AccelValue av = new AccelValue();
av.x = v[0];
av.y = v[1];
av.z = v[2];
arValue.add(av);
invalidate();
break;
}
}
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 - SensorManager.STANDARD_GRAVITY) * 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;
}
}
}
AccelValue Ŭ·¡½º´Â °¡¼Ó ¼¾¼·ÎºÎÅÍ Çѹø Àü´ÞµÇ´Â °ªÀÇ ÁýÇÕÀ̸ç ÀÌ Å¬·¡½ºÀÇ ¹è¿ arValue´Â ¿¬¼ÓÀûÀÎ ¼¾¼°ªÀ» ÀúÀåÇÑ´Ù. ´çÀåÀÇ °ª¸¸ ºÁ¼´Â º¯ÈÀÇ ÃßÀ̸¦ È®ÀÎÇÒ ¼ö ¾øÀ¸¹Ç·Î Àü´ÞµÇ´Â °ªÀ» ¹è¿¿¡ ÀúÀåÇØ ³õ°í ÀÏ·ÃÀÇ °ªÀ» ÇѲ¨¹ø¿¡ ±×·Á ºÁ¾ß ÇÑ´Ù. onDraw´Â ÀÌ °ªÀÇ ¿¬¼ÓÀ» °î¼± ÇüÅ·Πȸ鿡 ±×·Á °¡¼Ó°ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö¸¦ º¸¿©ÁØ´Ù. X´Â ȸéÆøÀÇ 20%, Y´Â 50%, Z´Â 80% À§Ä¡¿¡ ±×¸®¸ç ÀÌ À§Ä¡´Â basex º¯¼ö°¡ °¡Áø´Ù.
XÃàÀÇ °¡¼Ó ±×¸®±â¸¦ ºÐ¼®ÇØ º¸ÀÚ. °¡¼Ó°ªÀº basex¿¡¼ºÎÅÍÀÇ °Å¸®·Î Ç¥ÇöÇÑ´Ù. arValue ¹è¿ Àüü¸¦ ¼øȸÇÏ¸é¼ °¢ ½ÃÁ¡¿¡¼ÀÇ °¡¼Ó°ªÀ» ²¨³» ¼øÂ÷ÀûÀÎ ¼±À¸·Î ¿¬°áÇÏ¿© °ªÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö¸¦ °î¼± ±×·¡ÇÁ ÇüÅ·Π±×¸°´Ù. °¡¼Ó ¼¾¼°ªÀº Çȼ¿º¸´Ù´Â Å©±â°¡ ÀÛÀ¸¹Ç·Î 2¸¦ °öÇØ ÁøÆøÀ» ´Ù¼Ò °úÀåÇß´Ù. Áß¿äÇÑ °ÍÀº °ªÀÌ º¯ÇÏ´Â °ÍÀ» º¸¿© ÁÖ´Â °ÍÀ̹ǷΠ½ÇÁ¦°ª°ú ¿ÏÀüÈ÷ ÀÏÄ¡ÇÒ ÇÊ¿ä´Â ¾ø´Ù.
YÃàÀÇ °¡¼Ó ±×¸®±â Äڵ嵵 ÂüÁ¶ÇÏ´Â ¼¾½º°ª¸¸ ´Ù¸¦ »Ó ±¸Á¶´Â ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. ZÃàÀº °¡¸¸È÷ ÀÖÀ» ¶§ Áß·Â °¡¼Óµµ 9.8(STANDARD_GRAVITY)ÀÇ °ªÀ» °¡Áö¹Ç·Î ÀÌ °ªÀ» »©¾ß ÇÑ´Ù. ¼¾¼ ¸®½º³Ê´Â °¡¼Ó°ªÀ» ¹ÞÀ» ¶§¸¶´Ù ¹è¿¿¡ °ªÀ» ÀúÀåÇÏ°í ȸéÀ» ¹«È¿ÈÇϹǷΠÁÖ±âÀûÀ¸·Î °î¼±ÀÌ °è¼Ó ±×·ÁÁø´Ù. ¿¡¹Ä·¹ÀÌÅÍ¿¡¼´Â ½ÇÇàÇØ ºÃÀÚ Á÷¼±¸¸ ±×·ÁÁú »Ó ¾Æ¹«·± º¯È°¡ ¾øÀ¸¸ç ½ÇÀåºñ·Î Å×½ºÆ®ÇØ ºÁ¾ß ÇÑ´Ù. ½ÇÇà ÈÄ Àåºñ¸¦ °¢ ¹æÇâÀ¸·Î ¸¶±¸ Èçµé¾î º¸ÀÚ.
ÆùÀ» Á¿ì·Î Èçµé¸é XÃàÀÇ °¡¼ÓÀÌ º¯ÇÑ´Ù. ½ÉÇÏ°Ô Èçµé¼ö·Ï ÁøÆøÀÌ Ä¿Áö¸ç Èçµå´Â ¼Óµµ°¡ »¡¶óÁö¸é ÁÖÆļö°¡ Á¶¹ÐÇØÁø´Ù. °¡¼ÓÇÏ¸é ¿À¸¥ÂÊÀ¸·Î Èçµé¸®°í °¨¼ÓÇÏ¸é ´Ù½Ã ¿ÞÂÊÀ¸·Î Èçµé·È´Ù°¡ °á±¹Àº 0ÀÇ ÀÚ¸®·Î µ¹¾Æ¿À´Âµ¥ Èçµé¾î ºÃÀÚ °á±¹Àº Á¦ÀÚ¸®·Î µ¹¾Æ¿À±â ¶§¹®ÀÌ´Ù. YÃàÀº ÆùÀ» ¾Æ·¡, À§·Î Èçµé ¶§ ¹ÝÀÀÇϸç ZÃàÀº ÆùÀ» ÇÏ´Ã, ¶¥ ¹æÇâÀ¸·Î Èçµé ¶§ ¹ÝÀÀÇÑ´Ù. »ç¿ëÀÚ°¡ ÆùÀ» ¾î´À ¹æÇâÀ¸·Î Èçµé°í ÀÖ´ÂÁö´Â ÀÌ ÆÄÇüÀ» ºÐ¼®Çؼ ¾Ë¾Æ ³»¾ß ÇÑ´Ù. °á°ú¸¦ Â÷ºÐÈ÷ »ìÆ캼 ¼ö ÀÖµµ·Ï ȸéÀ» ÅÍÄ¡Çϸé Àá½Ã ¸ØÃß´Â ±â´Éµµ ÀÛ¼ºÇØ µÎ¾ú´Ù.
TYPE_ORIENTATION ¼¾¼´Â Àß µ¿ÀÛÇÏ°í ÀÌÇØÇϱ⠽±Áö¸¸ ±¸Çü ¹æ½ÄÀÌ´Ù. SDK ¹öÀü 1.5ºÎÅÍ´Â Á» ´õ Á¤È®ÇÑ ¹æÇâ ¼¾¼°¡ Á¦°øµÈ´Ù. ÇÏÀ§ ȣȯ¼ºÀÌ À¯ÁöµÇ¹Ç·Î ÀÌÀü ¹æ½Äµµ ¿©ÀüÈ÷ »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸ ¾ÕÀ¸·Î´Â »õ·Î ¼Ò°³µÈ ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀÌ ´õ ÁÁÀ» °ÍÀÌ´Ù. »õ ¹æ½ÄÀÇ ¹æÇâ Á¤º¸´Â SensorManagerÀÇ ´ÙÀ½ Á¤Àû ¸Þ¼µå·Î ±¸ÇÑ´Ù.
static float[] getOrientation (float[] R, float[] values)
ÀÌ ¸Þ¼µå´Â ȸÀü Çà·Ä¿¡ ±Ù°ÅÇÏ¿© ¹æÇâ°ªÀ» °è»êÇØ ³½´Ù. ù¹ø° Àμö RÀÌ È¸Àü Çà·ÄÀÌ¸ç µÎ ¹ø° Àμö¿Í ¸®ÅÏ°ªÀº °è»êµÈ ¹æÇâ°ªÀÌ´Ù. µÎ¹ø° Àμö·Îµµ °á°ú°¡ ´ëÀԵǹǷΠ¸®ÅÏ°ªÀº ±»ÀÌ ¹ÞÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. Å©±â 3ÀÇ ¹è¿ÀÌ ¸®ÅÏµÇ¸ç °¢°¢ ¹æÀ§°¢, ÇÇÄ¡, ·ÑÀÌ´Ù. ±¸Çü ¹æÇâ ¼¾¼¿Í´Â ´Þ¸® ¸®ÅÏ°ªÀº ½Ã°è ¹Ý´ë ¹æÇâÀ¸·Î Áõ°¡ÇÏ´Â ¶óµð¾È°ªÀ̹ǷΠ°¢µµ·Î º¯°æÇÏ·Á¸é º°µµÀÇ ¼ö½ÄÀ» °ÅÃÄ¾ß ÇÑ´Ù. ȸÀü Çà·ÄÀº ´ÙÀ½ Á¤Àû ¸Þ¼µå·Î ±¸ÇÑ´Ù.
static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
°æ»ç Çà·Ä°ú ȸÀü Çà·ÄÀ» ±¸Çϴµ¥ ÀÌ µÎ Çà·ÄÀº º¤Å͸¦ ÀåÄ¡ ÁÂÇ¥°è¿¡¼ ¿ùµå ÁÂÇ¥°è·Î º¯È¯Çϴµ¥ »ç¿ëµÈ´Ù. °ü½É¾ø´Â °ªÀº null·Î Á־ »ó°ü¾ø´Ù. ÀÌ º¯È¯¿¡´Â º¹ÀâÇÑ Çà·Ä¼ö½ÄÀÌ Àû¿ëµÈ´Ù. gravity¿Í geomagnetic Àμö´Â °¢°¢ °¡¼Ó°è¿Í ÀÚ±â°è ¼¾¼·Î ±¸ÇÑ °ªÀÌ´Ù. ´ÙÀ½ ¸Þ¼µå´Â °æ»ç Çà·Ä·ÎºÎÅÍ °æ»ç°¢µµ¸¦ ±¸ÇÑ´Ù.
static float getInclination (float[] I)
Á¤È®ÇÑ ¹æÇâÀ» ±¸ÇÏ·Á¸é °¡¼Ó°è¿Í ÀÚ±â°è ¼¾¼·ÎºÎÅÍ °ªÀ» ¹ÞÀº ÈÄ ÀÌ °ªÀ¸·Î ȸÀü Çà·ÄÀ» ±¸ÇÏ°í ȸÀü Çà·Ä·ÎºÎÅÍ ¹æÇâÀ» ´Ù½Ã ±¸ÇØ¾ß ÇÑ´Ù. ¿¹Á¦ ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.
hard_getOrientation |
public class hard_getOrientation extends Activity {
SensorManager mSm;
int mOrientCount;
TextView mTxtOrient;
float[] mGravity = null;
float[] mGeoMagnetic = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hard_getorientation);
mSm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mTxtOrient =(TextView)findViewById(R.id.result);
}
protected void onResume() {
super.onResume();
mSm.registerListener(mSensorListener, mSm.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
mSm.registerListener(mSensorListener, mSm.getDefaultSensor(
Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
}
protected void onPause() {
super.onPause();
mSm.unregisterListener(mSensorListener);
}
SensorEventListener mSensorListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
mGravity = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mGeoMagnetic = event.values.clone();
break;
}
// µÑ ´Ù Á¶»çµÇ¾î ÀÖÀ» ¶§¸¸
if (mGravity != null && mGeoMagnetic != null) {
float[] R = new float[16];
SensorManager.getRotationMatrix(R, null, mGravity, mGeoMagnetic);
float[] values = new float[3];
SensorManager.getOrientation(R, values);
mTxtOrient.setText("¹æÇâ = " + mOrientCount++ + "ȸ" +
"\nazimuth:" + Radian2Degree(values[0]) +
"\npitch:" + Radian2Degree(values[1]) +
"\nroll:" + Radian2Degree(values[2]));
}
}
};
float Radian2Degree(float radian) {
return radian * 180 / (float)Math.PI;
}
}
°¡¼Ó°è¿Í ÀÚ±â°è ¼¾¼¿¡ ´ëÇÑ ¸®½º³Ê¸¦ ¼³Ä¡ÇÏ°í ¼¾¼·ÎºÎÅÍ Àü´ÞµÈ °ªÀ» ¸â¹ö¿¡ ÀúÀåÇØ ³õ¾Ò´Ù. µÎ °ªÀÌ ¸ðµÎ Á¶»çµÇ¾úÀ» ¶§ ÀÌ °ªÀ¸·ÎºÎÅÍ È¸Àü Çà·ÄÀ» ±¸ÇÏ°í ¹æÇâ°ªÀ» ±¸ÇØ È¸éÀ¸·Î Ãâ·ÂÇÑ´Ù. ¶óµð¾È°ªÀº Àб⠺ÒÆíÇϹǷΠ°¢µµ·Î º¯È¯ÇÏ¿© Ãâ·ÂÇß´Ù.
±¸ÇüÀÇ ¹æÇâ ¼¾¼·Î ±¸ÇÑ °ª°ú »ç½Ç»ó °°Àº °ªÀÌµÇ ºÎÈ£³ª °ªÀÇ ¹üÀ§°¡ Á¶±Ý ´Ù¸¦ »ÓÀÌ´Ù. ÀÌ ¹æ¹ýÀÌ Á» ´õ Á¤È®ÇÏ´Ù°í ÇÏ¸ç ¼Ò¼öÁ¡ ¾Æ·¡±îÁö Á¤È®ÇÏ°Ô Á¶»çµÇ´Â °Í °°±â´Â ÇÏ´Ù. ±×·¯³ª ·¹ÆÛ·±½º¿¡ ¼³¸íÀÌ ³Ê¹« ºÎ½ÇÇѵ¥´Ù ¹°¸®ÇÐ Áö½ÄÀÌ ºÎÁ·ÇØ ¿Ö ´õ Á¤È®ÇÑÁö´Â ¼ÖÁ÷È÷ Àß ¸ð¸£°Ú´Ù. Â÷ÈÄ ¹°¸®ÇÐÀ» Á» ´õ ¿¬±¸ÇØ ºÁ¾ß ÀÌ ¿¹Á¦ÀÇ ¼Ò½º¸¦ ¿Ïº®ÇÏ°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» µíÇÏ´Ù.
¼¾¼·ÎºÎÅÍ ±¸ÇÏ´Â ¹æÇâ Á¤º¸µéÀ» ºÐ¼®Çϸé Àåºñ°¡ ÇöÀç ¾î´À ¹æÇâÀ» ÇâÇÏ°í ÀÖ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù. ±×·¯³ª ¼¾¼ ¸®½º³Ê¸¦ µî·ÏÇÏ´Â °ÍÀÌ ¹ø°Å·Ó°í ¿©·¯ °¡Áö °ªµéÀ» Á¶ÇÕÇؼ ÆÇ´ÜÇØ¾ß ÇϹǷΠ»ê¼ö°¡ Á¶±Ý º¹ÀâÇÏ´Ù. ´Ü¼øÈ÷ ÀåºñÀÇ °¡·Î, ¼¼·Î ¹æÇâ¿¡¸¸ °ü½ÉÀÌ ÀÖ´Ù¸é Á» ´õ ½¬¿î ÆǺ°¹ýÀÌ ÀÖ´Ù. ¿î¿µÃ¼Á¦°¡ ¹æÇâÀ» ÆǺ°ÇÏ¿© ¾×ƼºñƼÀÇ ·¹À̾ƿôÀ» ÀÚµ¿À¸·Î Àâ¾Æ Áִµ¥ ÀÌ Ã³¸®¸¦ Á÷Á¢ ÇÏ°í ½ÍÀ» ¶§´Â ȸéÀÇ ¹æÇâÀ» Á¶»çÇØ¾ß ÇÑ´Ù.
OrientationEventListener ´Â ¼¾¼·ÎºÎÅͺÎÅÍ Àü´ÞµÈ ¹æÇâ°ªÀ» ºÐ¼®ÇÏ¿© ȸéÀÇ ÇöÀç °¢µµ¸¸À» ¾Ë·Á ÁÖ´Â °í¼öÁØÀÇ µµ¿ì¹Ì Ŭ·¡½ºÀÌ´Ù. »ý¼ºÀڷΠȣÃâ Áֱ⸦ ÁöÁ¤ÇÏ¸ç ¸®½º³Ê °´Ã¼¸¦ »ý¼ºÇØ ³õ°í enable ¸Þ¼µå¸¸ È£ÃâÇϸé Áï½Ã µ¿ÀÛÇϸç È¸é °¢µµ°¡ º¯°æµÉ ¶§¸¶´Ù ¸®½º³ÊÀÇ ´ÙÀ½ ¸Þ¼µå·Î ÇöÀç °¢µµ¸¦ ¾Ë·ÁÁØ´Ù.
void onOrientationChanged (int orientation)
Àü´ÞµÈ °ªÀº 360ºÐ¹ýÀÇ °¢µµÀ̸ç ÀåºñÀÇ À§ÂÊÀÌ ÇÏ´ÃÀ» ÇâÇÒ ¶§, Áï ¼¼·Î ¸ðµåÀÏ ¶§ 0µµÀÌ¸ç ½Ã°è¹æÇâÀ¸·Î Áõ°¡ÇÑ´Ù. 90µµÀ̸é ÀåºñÀÇ ¿ÞÂʸéÀÌ ÇÏ´ÃÂÊÀÌ°í 180µµÀÌ¸é ¹Ø¸éÀÌ À§·Î µÚÁýÈù »óÅÂÀ̸ç 270µµÀ̸é Àåºñ ¿À¸¥ÂÊÀÌ À§¸¦ ÇâÇÏ°í ÀÖ´Â »óÅÂÀÌ´Ù. 360µµ´Â ¹°·Ð 0µµ¿Í °°´Ù. Àåºñ¸¦ ¹Ù´Ú¿¡ ÆòÆòÇÏ°Ô ´¯È÷¸é À̶§´Â °¢µµ¸¦ ¾Ë ¼ö ¾ø´Â »óÅ°¡ µÇ¸ç ORIENTATION_UNKNOWNÀÎ -1·Î Á¶»çµÈ´Ù.
ÀÌ ¸®½º³Êµµ °á±¹Àº ¼¾¼·ÎºÎÅÍ °ªÀ» ¹Þ¾Æ °è»êÀ» ÇÏ°ÚÁö¸¸ µî·Ï, ÇØÁ¦°°Àº º¹ÀâÇÑ °úÁ¤À» °ÅÄ¡Áö ¾Ê¾Æµµ µÇ¹Ç·Î »ç¿ëÇϱâ´Â ÈξÀ ´õ °£ÆíÇÏ´Ù. ´ÙÀ½ ¿¹Á¦´Â ȸéÀÇ ÇöÀç °¢µµ¸¦ º¸¿©ÁÖ¸ç Á¢½ÃÀÇ ¾ó±¼ À̹ÌÁö°¡ Ç×»ó ÇÏ´ÃÀ» º¸µµ·Ï Á¶Á¤ÇÑ´Ù. ¸¶Ä¡ ¿À¶Ñ±âó·³ ÇÏ´ÃÀ» ÇâÇØ ¿ì¶Ò ¼ ÀÖ´Â ¸ð½ÀÀÌ´Ù. Àåºñ¸¦ µ¹¸± ¶§ ¾×ƼºñƼ°¡ Àç»ý¼ºµÇ¸é ¾ÈµÇ¹Ç·Î ¹æÇâÀº ¼¼·Î·Î °íÁ¤ÇØ µÎ¾ú´Ù.
hard_Ottogi |
public class hard_Ottogi extends Activity {
AndroBoyView mView;
OrientationEventListener mOrientationListener = null;
int mOrientation = -1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mView = new AndroBoyView(this);
setContentView(mView);
mOrientationListener = new OrientationEventListener(this,
SensorManager.SENSOR_DELAY_FASTEST) {
public void onOrientationChanged(int orientation) {
mOrientation = orientation;
mView.invalidate();
}
};
mOrientationListener.enable();
}
class AndroBoyView extends View {
int width;
int height;
Bitmap ottogi;
public AndroBoyView(Context context) {
super(context);
ottogi = BitmapFactory.decodeResource(getResources(), R.drawable.ottogi);
}
public void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
}
public void onDraw(Canvas canvas) {
Paint Pnt = new Paint();
Pnt.setAntiAlias(true);
Pnt.setTextSize(30);
Pnt.setTextAlign(Align.CENTER);
canvas.drawColor(Color.WHITE);
int cx = width/2;
int cy = height/2;
if (mOrientation != OrientationEventListener.ORIENTATION_UNKNOWN) {
canvas.rotate(-mOrientation, cx, cy);
}
canvas.drawBitmap(ottogi, cx - ottogi.getWidth()/2, cy - ottogi.getHeight()/2, Pnt);
canvas.drawText("" + mOrientation, cx, cy, Pnt);
}
}
}
onCreate¿¡¼ Ä¿½ºÅÒ ºä¸¦ »ý¼ºÇÏ¿© ä¿ì°í ¹æÇâ ¸®½º³Ê °´Ã¼¸¦ »ý¼ºÇÑ´Ù. È£Ãâ Áֱ⸦ ÃÖ´ëÇÑ ºü¸£°Ô ÇÏ¿© ºÎµå·´°Ô ȸÀüÇϵµ·Ï Çߴµ¥ ½ÇÁ¦ ¿¹¿¡¼´Â Àû´çÇÑ Áֱ⸦ ¼±ÅÃÇØ¾ß ÇÑ´Ù. ÁÖÀÇÇÒ °ÍÀÎ ÀÌ ¸®½º³Ê´Â ¾×ƼºñƼ°¡ ÃʱâȵǾî¾ß Á¦´ë·Î µ¿ÀÛÇÑ´Ù´Â Á¡ÀÌ´Ù. ¸®½º³Ê µî·Ï½ÃÁ¡¿¡ ¾×ƼºñƼ Á¤º¸¸¦ ÇÊ¿ä·Î ÇϹǷΠ¸â¹ö·Î »ý¼ºÇؼ´Â ¾ÈµÇ¸ç ÃÖ¼ÒÇÑ onCreate¿¡¼ »ý¼ºÇØ¾ß Á¦´ë·Î µ¿ÀÛÇÑ´Ù. ¸®½º³Ê °´Ã¼ »ý¼ºÇÑ ÈÄ enable ¸Þ¼µå¸¦ È£ÃâÇÏ¿© Áï½Ã µ¿ÀÛÇϵµ·Ï Çß´Ù.
¸®½º³Ê´Â Àü´ÞµÈ °¢µµ°ªÀ» mOrientation Çʵ忡 ÀúÀåÇØ ³õ°í ºä¸¦ ´Ù½Ã ±×¸®µµ·Ï ÇÑ´Ù. °¢µµ°¡ ¹Ù²ð ¶§¸¶´Ù °»½ÅµÈ °¢µµ°ªÀ¸·Î ȸé Àüü¸¦ ´Ù½Ã ±×¸®´Â ¼ÀÀÌ´Ù. Ä¿½ºÅÒ ºä´Â Ãâ·ÂÇÒ ºñÆ®¸ÊÀ» ¹Ì¸® ÀÐ¾î µÎ°í onDraw¿¡¼ ºñÆ®¸ÊÀ» Ãâ·ÂÇÑ´Ù. ĵ¹ö½º¸¦ mOrientationÀÇ ¿ª¹æÇâÀ¸·Î ȸÀüÇÑ ÈÄ È¸é Áß¾Ó¿¡ À̹ÌÁö¿Í °¢µµ°ªÀ» Ãâ·ÂÇß´Ù. °¢µµ°¡ º¯°æµÉ ¶§ ĵ¹ö½ºÀÇ È¸Àü°ªÀÌ °°ÀÌ ¹Ù²î¹Ç·Î À̹ÌÁö´Â ¾ðÁ¦³ª ÇÏ´ÃÂÊÀ» º¸°Ô µÉ °ÍÀÌ´Ù.
¾ÈŸ±õ°Ôµµ ÀÌ ¿¹Á¦´Â ¿¡¹Ä·¹ÀÌÅÍ¿¡¼´Â µ¿ÀÛÀ» È®ÀÎÇÒ ¼ö ¾ø´Ù. À̹ÌÁö°¡ Ãâ·ÂµÇ±â´Â ÇÏÁö¸¸ °¢µµ°¡ Ç×»ó ÀÏÁ¤ÇϹǷΠ¾Æ¹«¸® ¸ð´ÏÅ͸¦ Àâ°í Èçµé¾î ºÁ¾ß ²Þ½µµ ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ½ÇÀåºñµµ ĸó ȸéÀ¸·Î´Â ±â¿ï¾îÁø °Í¸¸ º¸ÀÏ »Ó ȸéÀÌ µ¹¾Æ°¡´Â°É È®ÀÎÇϱâ´Â ¾î·Æ´Ù. ±×·¡¼ ¾î¿ ¼ö ¾øÀÌ ½ÇÀåºñÀÇ ¸ð½ÀÀ» µðÁöÅÐ Ä«¸Þ¶ó·Î Âï¾î¼ º¸ÀδÙ.
¹Ù´Ú¿¡ ÆòÆòÇÏ°Ô ´©À̸é ȸéÀÇ ¹æÇâÀ» ÆǺ°ÇÒ ¼ö ¾øÀ¸¹Ç·Î À̶§´Â -1·Î Æò°¡µÈ´Ù. °¡·Î, ¼¼·Î Àü¿ëÀÇ ÇÁ·Î±×·¥ÀÌ´õ¶óµµ ÇöÀçÀÇ È¸é ¹æÇâÀÌ ÇÊ¿äÇÑ °æ¿ì°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î Ä«¸Þ¶óÀÇ °æ¿ì °¡·Î ¸ðµå·Î µ¿ÀÛÇÏ´õ¶óµµ ÂïÀº À̹ÌÁö°¡ ¼¼·ÎÀÎÁö, °¡·ÎÀÎÁö ÆǺ°ÇÏ¿© Exif Á¤º¸¿¡ ½á ³Ö¾î¾ß Çϴµ¥ À̶§ Á¶»çµÈ °¢µµ°ªÀ» ÂüÁ¶ÇÏ¸é µÈ´Ù. À̹ÌÁö ºä¾î´Â ÃÔ¿µ ½ÃÁ¡ÀÇ Àåºñ ¹æÇâÀ» Exif Á¤º¸¿¡¼ ¾ò¾î À̹ÌÁöÀÇ È¸Àü ¿©ºÎ¸¦ ÀÚµ¿À¸·Î ÆǺ°ÇÑ´Ù.