주요 내용으로 건너뛰기

[안드로이드] SDK 17 이하에서 ImageView의 adjustViewBounds 속성 문제

안드로이드 뷰 콤포넌트 중 ImageView라는 게 있다. 이름 그대로 해당 콤포넌트 안에 지정한 이미지를 띄워주는 역할을 하는데, 기본적으로는 지정한 영역 안에 이미지를 보여준다. 그러니 웹상의 이미지를 받아와서 쓰다보면 이미지 일부가 잘리거나 리사이즈되어 이미지가 깨지는 경우가 많다. 그래서 XML이나 자바 코드상으로 이미지 크기에 따라 ImageView 크기도 달라질 수 있는 adjustViewBounds라는 속성이 있다. 적용하는 것도 굉장히 간단하다. 

yourImageView.setAdjustViewBounds(true);

위에서 보는 것과 같이 딱 한줄이면 설정할 수 있다. 그러나 이 속성에는 한가지 문제가 있는데, 바로 SDK 버전 17(4.2) 밑 버전의 경우 이미지가 이미지뷰보다 클 때에만 작동하는 속성이라는 것. 그렇기 때문에 SDK 17 밑 버전에서 완전히 작동하는 앱을 만들기 위해서는 이미지 영역을 직접 계산해야 한다. 그리고 이 영역을 ImageView에 반영해야 하는데, 이 작업은 많이들 쓰는 이미지 로더 라이브러리를 찾아서 적용하면 간단하다. 여기서는 Universal Image Loader 기준으로 작성된 코드를 사용하겠다.

// SimpleLoadingListener는 Universal Image Loader에서 제공하는 이미지 로딩
// 리스너로, 기본 리스너와 달리 필요한 메서드만 구현해도 된다.
class ImageLoadingListener extends SimpleLoadingListener {
    // 이미지 로딩이 끝나면 호출되는 메서드
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        super.onLoadingComplete(imageUri, view, loadedImage);
        // SDK 버전 17밑이면 비트맵 크기 리사이징
        if (Build.VERSION.SDK_INT < 17) {
            // 이미지가 적용될 뷰에 따른 이미지의 높이 계산
            float i = (((float)view.getWidth())
                        / ((float) loadedImage.getWidth()));
            float imageHeight = i * (loadedImage.getHeight());
            
            // 이미지를 뷰에 맞춰서 리사이징
            loadedImage = Bitmap.createScaledBitmap(loadedImage,
                                                    view.getWidth(),
                                                    (int)imageHeight, 
                                                    true);
                                                    
            // 뷰에 적용
            ((ImageView)view).setImageBitmap(loadedImage);
        }
    }
}
ImageLoader.getInstance().displayImage(imageUrl, 
                                       imageView,
                                       new ImageLoadingListener());

위의 코드를 보면, 이미지 로더 라이브러리에서 제공하는 이미지 로딩 리스너 클래스를 상속해 불러온 웹 이미지의 로딩이 끝난 후에 불러오는 메서드 안에 해당 이미지를 리사이징해 뷰에 집어넣게 되어있는 것을 알 수 있다. 그리고 이 이미지 로딩 리스너를 다시 해당 뷰에 적용해주면 SDK 넘버에 상관없이 adjustViewBounds와 같은 결과를 얻을 수 있다. Universal Image Loader가 아닌 다른 라이브러리를 사용 중이라 하더라도, 저정도의 기능은 모두 제공하고 있을 것이니 해당 라이브러리 문서를 잘 찾아보고 적용하면 된다.

안드로이드 애플리케이션 개발자

구본욱 님의 창작활동을 응원하고 싶으세요?

댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
#15
[iOS] 개발 참고 포스팅
#17
애플 스크립트로 터미널 명령어 실행 파일 만들기