2010년 5월 4일 화요일

[android]odroid에 Gallay 3D 올리기...

odroid 2.1 버전에 Gallary 3D이 포함되어 있지 않습니다.

odroid에 Gallary 3D를 올려 보겠습니다.

git로부터 다운 받은 소스 트리에서 package\apps\Gallary3D란 폴더가 있습니다.

Eclipse에서 Gallary3D를 Create project from existing source로 불러 오면 overlaps the location of another project 에러 메세지가 나오면서 안됩니다.

import로 불러 오려니 .project나 .classpath가 없어서 그것 역시 안됩니다.

그래서 일단 Gallary로 new project 하고 거기에 git에 받은 폴더를 덮어 쓰시면 됩니다.



packages\apps\에 Launcher 소스도 있습니다. 오늘부터 이 소소를 분석 해봐야 겠네요.

2010년 5월 3일 월요일

[android] Home example 배경 화면 유지 하기

example 중에 Home example을 보면 Launcher의 대략적인 구조를 알 수 있습니다.
그래서 Home을 보고 이것 저것 바꿔 가면서 공부 중인데 화면이 회전 되면 배경이 지원지는 문제가 발생 합니다. 그래서 portrait에서 landscape 전화 시 배경화면이 유지도록 수정 해 보겠습니다.


portrait에서 landscape 전화 시 배경이 지워짐.


기본 개념은 wallpaper을 얻어와 서 자신의 window의 background로 설정 하는 것입니다.

private void setDefaultWallpaper() {
if (!mWallpaperChecked) {
Drawable wallpaper = peekWallpaper();
if (wallpaper == null) {
try {
clearWallpaper();
} catch (IOException e) {
Log.e(LOG_TAG, "Failed to clear wallpaper " + e);
}
} else {
getWindow().setBackgroundDrawable(new ClippedDrawable(wallpaper));
}
mWallpaperChecked = true;
}
}

이유는 모르겠지만 화면이 회전이 되면 다시 setBackgroundDrawable()을 해줘야 합니다.

화면 회전 시 Activity의 lifecycle의 onPause() -> onResume이 발생합니다.

그래서 onResume() 함수를 override 후 아래와 같이 setBackgroundDrawable()을 해 주면 됩니다.

@Override
protected void onResume() {
super.onResume();
getWindow().setBackgroundDrawable(new ClippedDrawable(getWallpaper()));
bindRecents();
}



아주 간단하게 수정이 되었지만 이 부분을 찾는 데 많이 삽질 했습니다.
덕분에 Activity, Window, View의 큰 그림을 이해하게 되었네요.

2010년 5월 1일 토요일

[android] Eclipse에서 android 및 java source code browsing하기기

위와 관련해서 인터넷을 검색해 보면 git로 소스를 받고 frameworks/base/java를 sdk를 받은 폴더에 sources를 만들고 java밑에 있는 파일을 sources에 복사 하면 된다고 나와 있습니다.
이전에 1.6버전일 때는 저 역시 이렇게 하면 됐던걸로 기억하고 있습니다.
하지만 2.1 sdk를 받고 eclipse에서 모든 update를 한 후에는 위에 방법으로 보여 지지 않습니다.
최신 버전으로 업데이트를 받고 나면 platform 폴더에 버전 별로 폴더가 생깁니다.



android-7 폴더에 sources를 만들고 거기에 git에서 받은 frameworks/base/core/java/android와 frameworks/base/java/com을 복사 하시면 됩니다.

그리고 반드시 환경 변수PATH에 android sdk 경로를 추가 해 주셔야 합니다.

그리고 이제 java 소스를 볼 수 있는 방법 입니다.
java를 설치 하고 나면 일반적으로 C:\Program Files\Java\jdk1.6.0_20\src.zip 파일 있습니다.
압축을 풀고 src/java폴더를 [android sdk]\platforms\android-7\sources에 복사 하여 주시면 됩니다.

위에 그림 처럼 android/com/java가 존재 하면 됩니다.

그외에 graphics와 같은 폴더도 동일하게 복사 해서 넣어 주시면 됩니다.


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가 없기 때문에 죽습니다.