Android2009/04/22 17:00

T-Mobile G1 폰은 HTC에서 제조한 최초의 Android 폰이다. 이 친구는 마치 Android 플랫폼에 대한 레퍼런스 모델같다고나 할까, 개인적으로는 별로 땡기지 않는 디자인이다.

각설하고, 현재 G1 폰의 display 관련 API(DisplayMetrics) 중 DPI 정보를 반환하는 메서드가 잘못된 값을 반환한다는 버그가 있다. 아래는 해당 정보를 G1 폰에서 조사한 내용이다.

FieldG1
WIDTH_PIXEL320
HEIGHT_PIXEL480
XDPI159.3723
YDPI320.8401

보시다시피 XDPI와 YDPI value가 160, 320 정도인데, 이는 잘못된 값이다. G1 폰의 물리적인 스펙은 대략 다음과 같다.

FieldG1
WIDTH1.775" (4.5 cm)
HEIGHT2.66" (6.8 cm)

위의 데이터를 근거로 계산해보면, 320 dot per 1.775 inch(480 dot per 2.66 inch)는 대략 180 DPI임을 알 수 있다. 그러니까 결론은... "아직 이 API는 사용하지 말자". :-)

아직 공식적인 이슈로 등록된 곳은 못 찾았는데, 여기 저기 회자되고 있다. 아래 링크 참조.
DisplayMetrics screen DPI seems to be wrong on G1?

Posted by roguebean
TAG Android, DPI, g1
Android2009/04/01 00:56

안드로이드(Android™)의 세계로 빠져봅시다!

Android Developers

Portions of this page are reproduced from work created and shared by Google and used according to terms described in the Creative Commons 2.5 Attribution License.

Posted by roguebean
자바2009/01/09 22:19

Sun이 작년(?)부터 Java SE for Embedded를 배포하고 있다. 점점 커지는 모바일 시장에서 한 몫 해보려는 모양이다. 지난달에는 심지어 ARM Linux 플랫폼을 위한 Java SE for Embedded 6u10 (early access)도 나왔다. 우연찮은 기회(업무 ^^)로 Java SE for Embedded 6u10 기반 ThinkFree Mobile 개발에 참여하게 되었는데, 몇 가지 주목할 만한 내용들이 있어 기록해둔다. 오늘은 일단 Click on Touch Screen에 대해서만.

일전에 기록해둔 것처럼 AWT의 mouse click event는 AWT native 구현체에서 발생이 되는데, 일반 desktop edition의 구현체는 pressed point와 released point가 동일한 경우에만 click event가 발생된다. 우리가 흔히 사용하는 마우스는, 클릭을 할 때 일부러 흔들지 않는 이상 pressed, released point가 다를 가능성이 희박하다. 따라서 의도대로 적절히 click을 행할 수 있다.

하지만 터치 스크린의 경우, 손가락 끝으로 스크린을 두드려야 되는데, 손가락 끝은 다른 도구(스타일러스 등)에 비해 면적이 넓은데다가 굴곡도 있고, 말랑말랑해서 자칫 pressed point와 released point에 차이가 생기게 마련이다(손톱은 그나마 좀 낫다). 그 차이는, 개인적인 측정에 의하면, 작게는 2~3 pixel부터 많게는 20~30 pixel까지 차이가 난다. 간혹 device driver나 OS가 똑똑하게 보정해 주는 경우도 있는 것 같지만, 그렇지 않은 경우라면 문제가 생길 수 있다.

테스트 결과 EJRE(JRE from Java SE for Embedded 6u10)에서는 x, y 좌표 중 하나라도 4 pixel 이상 차이나면 click event가 발생하지 않는 것으로 확인이 되었다. 4 pixel이라는 threshold는 외부 설정으로 변경이 가능한 것인지 아니면 단순 하드코딩된 값인지는 모르겠으나, 일단 불편한 default 값이긴 하다. 이 때문에 EJRE에서 사용자가 원하는 대로 click을 할 수 있도록 구현하려면 약간의 work-around가 필요하다. 내가 사용했던 방법은 대략 아래와 같이 AWT event를 꼬아버리는 방법이다.

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQuene() {
    @Override
    protected void dispatchEvent(AWTEvent event) {
        boolean dispatch = true;
        if(event instanceof MouseEvent) {
            // create and submit a mouse click event by
            // adjusted threshold about 16 ~ 32 pixels
            // between pressed and released point, and
            // execute some customizations by event id,
            // blah blah blah...
            ...
        }
        
        if(dispatch) {
            super.dispatchEvent(event);
        }
    }
});

물론 이런 식의 work-around는 몸에 해롭다. EJRE가 좀 더 유연해지면 얼렁 지워버리어야지. 그리고 위 코드가 동작했을 때의 결과는 아래 동영상으로 확인.


Easy Clicker from Yonghwan Cho on Vimeo.
Posted by roguebean