[Java] ByteBuffer로부터 unsigned int 읽기

자바는 그 창시자로부터 데이터 타입으로 unsigned가 의미가 없다는 판단에 의해 부호가 없는 정수형 데이터 타입을 지원하지 않는 우(?)를 범하였으니… 간혹 자바를 사용하는 개발자가 개고생인지라.. 개고생을 줄이고자 기록을 남깁니다.

long v = ((long)outBb.getInt() & 0xffffffffL);

이 얼마나 비효율의 극악을 달리는 코드인가? unsigned 값의 의도는 음수값을 가지지 않을 경우 적은 바이트수만을 활용하여 그 2배에 해당하는 양(+)의 범위 값을 가지도록 하고자 하는 선의인데, 4바이트의 unsigned int를 저장하기 위해 8바이트를 사용하고 있는 형국입니다.

자바 언어의 창시자인 제임스 고슬링님은 뭐하고 사시는지 살짝 궁금해지네요.. 소녀시대 팬이라는 소문도 있던데.. @_@

[Android] View의 Background에 라운딩 상자(Rounding Box) 넣기

View의 배경에 라운딩 박스를 넣어 UI를 깔끔하게 정리해야 할때가 있습니다. 대표적인 경우로, TextView에 단순히 문자열만을 표시하지 않고 라운딩 박스를 둘러 넣어 주면 뭔가 부족한 UI가 개선됨을 느낄 수 있습니다. 아래가 이러한 예에 대해 실제 적용한 화면입니다.

사용자 삽입 이미지

아래는 이처럼 View의 배경에 라운딩 박스를 넣기 위해 View의 background 속성을 지정한 xml 단 코드입니다.

<TextView 
    android:background="@drawable/bg_gis_result_items_count"
    android:id="@+id/tbResultItemCount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:textColor="#ffffff"
    android:textSize="32px"
    android:layout_marginBottom="35px"
    android:layout_marginLeft="60px"
    android:layout_marginRight="120px"
    android:text="검색 결과 0 건" />

위의 코드를 보면, 라운딩 박스를 적용한 뷰는 TextView이고 배경을 지정하기 위해 android:background 속성에 @drawable/bg_gis_result_items_count를 지정하였습니다. 이제 이 @drawable/bg_gis_result_items_count의 코드를 보면 아래와 같습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid 
        android:color="#ffbacedd" />

    <padding 
        android:left="45px"
        android:top="15px"
        android:right="45px"
        android:bottom="15px" /> 

    <corners 
        android:radius="30px" /> 
</shape>

배경은 drawable 타입으로 지정할 수 있으며 라운딩 박스는 도형(shape)으로 지정합니다. 도형은 자신의 색상값을 지정할 수 있고 라운딩 처리는 이 도형의 corners를 통해 지정할 수 있습니다.

[Android] 맨날 까먹지? 키보드 감추기

안드로이드에서 키보드로 입력하고 검색 버튼을 누르면, 당근 빳따~ 키보드를 감춰주시는 센스를 발휘해야 하는데… 바로 그 코드는 아래와 같3.

InputMethodManager Imm = 
    (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
Imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

단, 현재 Focus된 뷰가 없을 경우 넉다운될 수 있으니, getCurrentFocus()의 결과값이 null인지를 체크할 것.

안드로이드 하위 버전에서 ColorDrawable의 getColor 미지원에 대한 해결책

안드로이드 하위 버전 즉, API Level 11 이전에서는 ColorDrawable의 getColor 함수가 지원되지 않습니다. Color에 대한 Drawable인 ColorDrawable에서 getColor가 지원되지 않는다는 것이 참으로 이상하지만 여하튼 API Level 11에서는 지원하지 않습니다. API Level 11 이전이라면 안드로이드 2.0 버전대입니다. 진저브레드였던가..

이리하여 ColorDrawable 클래스의 getColor를 사용할 경우 진저브레드와 같은 단말기는 지원할 수 없습니다. 그렇다면 진저브레드와 같이 API Level 11 이전의 단말기도 지원하면서 ColorDrawable의 getColor를 대체할 수 있는 함수는 어떻게 될까요?

쉬울것 같지만, 그 방법을 좀처럼 찾을 수 없었는데.. 편법이지만 명확한 방법을 공유합니다. 바로 그려보고 직접 확인해 보는 방식인데요. ColorDrawable은 Canvas에 무엇가를 그릴 수 있으므로 직접 그려보고 그린 내용을 확인한다는 것입니다. 즉, Bitmap에 그려보고 Bitmap의 Pixel 값을 가져오면, 바로 그 값이 우리가 원하는 값입니다. 코드는 다음과 같습니다.

int getColor(ColorDrawable cb)
{
    Bitmap bitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap); 
    cb.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    cb.draw(canvas);

    int clr = bitmap.getPixel(0, 0);
    bitmap.recycle();

    return clr;
}

어차피 그리기만 하면 되므로 비트맵의 크기는 1×1로 하였습니다. 그리고 투명도에 대한 알파값까지 고려하기 위해서 비트맵의 색상 포맷은 ARGB_8888, 즉 32Bits로 하였습니다. 색상값 하나를 얻기 위해 비트맵까지 생성해야 하는 방법까지 동원해야 한다는 점이 걸리기는 하지만 성공적으로 잘 됩니다.