2010년 4월 30일 금요일

[android] 방향 알아 내기...

Android 단말기에서 Landscape, Portrait 상태 인지 확인 하는 방법 입니다.

public TestView extends View {

public TestView(Context)
{
super(context);
OrientationEventListener oel = new OrientationEventListener(getContext()) {
@Override
public void onOrientationChanged(int orientation) {
if (orientation >= 90) {
Toast.makeText(getContext(), "LandScape", Toast.LENGTH_SHORT).show();
} else if (orientation == 0) {
Toast.makeText(getContext(), "Portrait", Toast.LENGTH_SHORT).show();
}
}
}
oel.enable();

...
}

orientation이 단말기의 angle입니다.

0이면 portrait이고 90이면 landscape입니다.

여기서 특히한 점은 Accelerometter와 구현 방법이 차이가 납니다.
SensorManager에 listener를 register하는 방식이 아닙니다.

아래 소스틑 snake에서 Aceelerometer로 구현 한 것 입니다.

SensorManager sensorManager = (SensorManager)getContext().getSystemService(Context.SENSOR_SERVICE);
Sensor mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
SensorEventListener sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;

if (java.lang.Math.abs(values[0]) - java.lang.Math.abs(values[1]) > 0) {
if (values[0] <>
if (mDirection != WEST) {
mNextDirection = EAST;
}
} else if (values[0] >= 0) {
if (mDirection != EAST) {
mNextDirection = WEST;
}
}
} else {
if (values[1] <>
if (mDirection != SOUTH) {
mNextDirection = NORTH;
}
} else if (values[1] >= 0) {
if (mDirection != NORTH) {
mNextDirection = SOUTH;
}
}
}
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
sensorManager.registerListener(sel, mSensor,SensorManager.SENSOR_DELAY_GAME);
}

SensorManager 부분이 필요 없습니다.

Eclipse에 java Syntax Color 변경하기

Eclipse는 Syntax Color 밋밋합니다.
Syntax Color를 변경하는 방법을 찾아서 posting합니다.





vibrantink theme를 적용한 모습니다.

여기에 vrapper plugin 도 설치하여 사용 중인데 조금 vi 스러워 졌네요.

2010년 4월 27일 화요일

[android]Snake 게임을 Accelerometer로 하기

android 예제 중에 Snake 게임이 있습니다.




















방향 키로 snake를 욺직일 수 있는데 이번에는 Accelerometer 센서로 snake를 조종할 수 있도록 수정 해 보겠습니다.

protected void initAccelator() {
SensorManager sensorManager = (SensorManager)getContext().getSystemService(Context.SENSOR_SERVICE);
Sensor mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
SensorEventListener sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;

if (java.lang.Math.abs(values[0]) - java.lang.Math.abs(values[1]) > 0) {
if (values[0] <>
if (mDirection != WEST) {
mNextDirection = EAST;
}
} else if (values[0] >= 0) {
if (mDirection != EAST) {
mNextDirection = WEST;
}
}
} else {
if (values[1] <>
if (mDirection != SOUTH) {
mNextDirection = NORTH;
}
} else if (values[1] >= 0) {
if (mDirection != NORTH) {
mNextDirection = SOUTH;
}
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
sensorManager.registerListener(sel, mSensor, SensorManager.SENSOR_DELAY_GAME);
}

위에 함수를 SnakeView에 추가 후 생성자에서 호출합니다.

event.values에서 values[0]이 x축 이고 [1]이 y축 [2]가 z축입니다.
x축과 y 축이 동시에 계속 발생 하기 때문에 좌,우,위,아래 중 하나를 선택하기 위해 x축과 y축 중에 값이 더 큰 쭉으로 선택하도록 하고 축의 방향은 음수인지 양수인지 판단 하시면 됩니다.

2010년 4월 23일 금요일

Notepadv2

http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html

Notepadv2 예제에서 NoteEdit 화면에서 back 버튼을 누르면 죽습니다.

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode != RESULT_OK) {
return;
}

Bundle extras = intent.getExtras();
...
}

위에 한줄 추가 해주면 죽지 않습니다.
Notepadv2에서 Intent로 NoteEdit를 호출 후 back 시 onActivityResult()가 호출 되고 NoteEdit가 back button으로 finish 되면 보낸 Intent가 없기 때문에 죽습니다.