android.widget.ImageView의 너비와 높이를 얻는 방법?


272
╔══════════════════════════════════════════════╗   ^
 ImageView    ╔══════════════╗                   |
                                               |
               Actual image                    |
                                               |60px height of ImageView
                                               |
                                               |
              ╚══════════════╝                   |
╚══════════════════════════════════════════════╝   
<------------------------------------------------>
                   90px width of ImageView

기본 높이와 너비가있는 이미지보기가 있고 이미지가 db에 저장되어 있으며 Imageview 높이 너비에 따라 이미지의 크기를 조정하고 싶습니다. 높이와 너비를 변경할 때마다 코드에서 변경해야하기 때문에 기본값을 원하지 않기를 바랍니다.

ImageView의 높이와 너비를 얻으려고하지만 두 경우 모두 0이 반환됩니다.

int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();

기본 높이와 너비가 있어도 0을 반환합니다.


«높이와 너비를 변경할 때마다 코드에서 변경해야하기 때문에 기본값을 지정하고 싶지 않기 때문에 어떤 값을 변경할 수 있습니까? 이미지보기 또는 저장된 이미지?
Pedro Loureiro

당신은 단지 사용할 수 없습니다 android:scaleType="centerInside"?
bigstones

2
@ nightcracker : ASCII가 아닙니다.
Joey

7
@ Ј“ASCII”라고 말했을 때 나는 ASCII 문자 집합으로 구성된 것보다 더 많은 예술을 포함하는“ASCII art”을 의미했습니다.
orlp

1
이것은 질문에 직접 대답하지는 않지만 getHeight () / getWidth ()가 0을 리턴하는 이유가 궁금하다면보기가 "그리기"전에 해당 메소드를 호출하면 항상 0을 리턴합니다. onCreate ()에서이 메소드를 호출하면 0을 반환합니다.
audiojared

답변:


222

이 질문에 대한 나의 대답 은 당신에게 도움이 될 것입니다.

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

그런 다음 onPreDraw () 메소드 내에서 이미지 스케일링 작업을 추가 할 수 있습니다.


8
아주 좋은 코드 형제이자 논리적 인 +1입니다. ImageView 속성 android : adjustViewBounds = "true"를 true :)로 설정하여이 작업을 수행 할 수도 있습니다.
AZ_

야하지만 포인터를 디버깅하는 동안 onPreDraw ()를 방해하지 않는 이유는 무엇입니까?
Geetanjali

3
vto.removeOnPreDrawListener (this)를 추가해야한다고 생각합니다. onPreDraw () 내부 줄
sagus_helgy 8

1
@ KK_07은 Sufferer의 의견에 따라 편집 내용을 봅니다. 리스너를 완료 한 후에는 제거해야합니다.
Kevin Coppock

6
내부 클래스 내부의 finalHeight 및 finalWidth에 최종 값을 지정하지 않고 어떻게 값을 할당합니까?
Chris

29

방금이 속성을 설정하면 Android OS가 모든 것을 처리합니다.

android : adjustViewBounds = "true"

ImageView를 심은 layout.xml에서 이것을 사용하십시오 :


4
@jww 나는 부정적인 유권자에게 정말로 답장을하지 않습니다 : p, 먼저 Android 문서에서 getWidth 및 getMeasured에 대해 읽었습니다. 그런 다음 사람들에게 투표를합니다.
AZ_

27

드로어 블로 이미지 너비와 높이를 얻을 수 있습니다.

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();

14

ImageView의 차원이 0 인 이유는 쿼리 할 때 뷰가 여전히 레이아웃 및 측정 단계를 수행하지 않았기 때문입니다. 뷰에서 레이아웃에서 "동작"방식을 알려주었지만 여전히 각 뷰를 배치 할 위치를 계산하지 않았습니다.

이미지보기에 제공 할 크기를 어떻게 결정합니까? 기본적으로 구현 된 스케일링 옵션 중 하나만 사용할 수 있습니까?


ImageView에 기본 높이와 너비를 지정했지만 코드로 가져 오려고하면 0이 반환됩니다. ImageView를 먼저 팽창시켜야한다고 생각합니다. 그러나 어떻게?
AZ_

나는 내 대답으로 그 문제를 해결합니다. 다시 읽으십시오 :) 나는 당신의 견해가 이미 팽창했다고 생각합니다. 당신은 그것을 볼 수 있습니까? 가능하다면 팽창 된 것입니다.
Pedro Loureiro

13

UI 스레드에 게시하면 효과적입니다.

final ImageView iv = (ImageView)findViewById(R.id.scaled_image);

iv.post(new Runnable() {
            @Override
            public void run() {
                int width = iv.getMeasuredWidth();
                int height = iv.getMeasuredHeight();

            }
});

정말 도움이됩니다!
Xavi Jimenez

잘못된. UI에서 너비와 높이를 쿼리한다고해서 해당 값이 준비된 것은 아닙니다. 뷰 팽창은 방금 샘플에서 완료되었지만, 그렇지 않을 수도 있습니다.
rommex

6

xml 파일 :

 <ImageView android:id="@+id/imageView"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/image"
               android:scaleType="fitXY"
               android:adjustViewBounds="true"/>

자바 파일 :

ImageView imageView = (ImageView)findViewById(R.id.imageView);
     int width = imageView.getDrawable().getIntrinsicWidth();
     int   height = imageView.getDrawable().getIntrinsicHeight();

5

Android OS 가이를 처리하도록 할 수 있다고 생각합니다. ImageView의 배율 유형을로 설정하면 fitXY표시되는 이미지의 크기가 현재보기 크기에 맞게 조정됩니다.

<ImageView 
    android:layout_width="90px" 
    android:layout_height="60px"
    android:scaleType="fitXY" />

4

가장 간단한 방법은 활동의 onWindowFocusChanged 메소드에서 ImageView의 너비와 높이를 얻는 것입니다

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    height = mImageView.getHeight();
    width = mImageView.getWidth();

}

1
onWindowFocusChanged는 API18 이상에서 작동하며 최선의 방법은 아닙니다 ...하지만 감사합니다
Milad gh

1

이미지 보다 여러 이미지를 동적으로 만든 경우 :

// 이미지 배열을 초기화

private ImageView myImages[] = new ImageView[your_array_length];

// 프로그래밍 방식으로 생성 하고 상위 뷰에 추가

 for (int i = 0; i < your_array_length; i++) {
                myImages[i] = new ImageView(this);
                myImages[i].setId(i + 1);
                myImages[i].setBackgroundResource(your_array[i]);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                        frontWidth[i], frontHeight[i]);
                ((MarginLayoutParams) params).setMargins(frontX_axis[i],
                        frontY_axis[i], 0, 0);
                myImages[i].setAdjustViewBounds(true);
                myImages[i].setLayoutParams(params);

                if (getIntent() != null && i != your_array,length) {
                    final int j = i;
                    myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        public boolean onPreDraw() {
                            myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
                    finalHeight = myImages[j].getMeasuredHeight();
                        finalWidth = myImages[j].getMeasuredWidth();
                    your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
                            return true;
                        }
                    });
                }
                your_parent_layout.addView(myImages[i], params);
            }

// 그게 다야. 행복한 코딩.


-2

이 u에 의한 내 친구는 db.에 저장된 이미지의 높이를 얻지 못하지만 뷰 높이를 얻습니다. 이미지의 높이를 얻으려면 db, s 이미지에서 비트 맵을 만들어야합니다 .u는 imageview의 높이와 너비를 가져올 수 있습니다


2
이미지의 높이와 너비를 알고 있지만 ImageView의 높이와 너비를 알고 싶습니다. 나는 당신이 내 요점을 얻을 바랍니다.
AZ_
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.