2011-09-20 7 views
18

내부에 들어가기를 원하는 컨테이너보다 작은 이미지가 있습니다. 가로 세로 비율을 유지하면서 이미지를 늘릴 수 있습니다. 가능한 가장 큰 크기입니다. 가로 세로 비율을 유지하면서 가능한 한 이미지를 크게 만드는 방법

이 문제를 설명하기 위해 :

<ImageView android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:src="@drawable/thumbnail" 
      android:scaleType="fitXY" 
      android:adjustViewBounds="true"/> 

위의 컨테이너의 폭을 채우기 위해 뻗어 될 것 ImageView. 포함 된 @drawable은 x 축을 따라 ImageView 너비에 맞게 확장됩니다. 그러나이 경우 높이 인 wrap_content으로 표시된 치수는 @drawable 초기 높이와 동일한 크기로 유지됩니다.

ScaleType here과 관련된 설명서를 읽었으므로 여기에서 답변을 찾을 수 없습니다.

다음 그림은 위의 코드에 대해 설명합니다

enter image description hereenter image description here

Current behaviour    Desired Behaviour 

편집

ImageViewscaleType="fitCenter" 정확하게 확대/성장 그것의 내부 @drawable 줄어들 제공 유지하면서 가능한 한 큰 그것은 종횡비입니다.

이 어떤 식 으로든 조정되기 전에 ImageView 크기가 정의됩니다. ImageView 치수는 @drawable에 포함 된 크기 조정에 영향을받지 않습니다.

+2

을,이다 일반적인 문제, 내가 결코 깨끗한 해결책을 찾지 못했음. 프레임에 배경 9 패치를 추가하면 시도하고 수정하는 것이 더욱 어려워집니다. 나는 이것이 프로그램 적으로해야 할 일이라고 확신하지만 누군가가 이것을위한 해결책을 가지고 있다면 좋을 것이다. – kcoppock

+2

완전히 설명 된 질문에 대해서는 +1 – Merlin

답변

7

XML은

XML이 유일한 솔루션은 가능한 "match_parent" 또는 이산 최대 값 대신 "wrap_content"을 사용하는 것이다. 이렇게하면 ImageView이 올바른 크기가됩니다. 그러면 scaleType="fitCenter"을 추가하면 @drawable이 올바르게 확장됩니다.

는, 프로그램

그것은 추한하지만,이 크기는 이산 값이 부여 된 것 후에는 이미지 뷰의 크기를 조정할 수 있습니다 :

final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); 

    ViewTreeObserver thumbnailViewVto = thumbnailView.getViewTreeObserver(); 
    thumbnailViewVto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     private boolean changed = false; 
     @Override 
     public void onGlobalLayout() { 
      if(!changed) { 
       Drawable image = getResources().getDrawable(R.drawable.thumbnail); 
       float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); 
       int height = thumbnailView.getHeight(); 

       thumbnailView.setLayoutParams(
         new LayoutParams(
           (int) (height * heighToWidthRatio), height)); 
       changed = true; 
      } 
     } 
    }); 

EDIT 나에게

final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); 

    thumbnailView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      // Remove the GlobalOnLayout Listener so it only fires once. 
      thumbnailView.getViewTreeObserver().removeGlobalOnLayoutListener(this) 

      // Find the images Height to Width ratio 
      Drawable image = getResources().getDrawable(R.drawable.thumbnail); 
      float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); 

      // Use this ratio to discover the ratio of the ImageView to allow it to perfectly contain the image. 
      int height = thumbnailView.getHeight(); 
      thumbnailView.setLayoutParams(new LayoutParams(
           (int) (height * heighToWidthRatio), height)); 
     } 
    }); 
+1

일반적인 문제 해결을위한 +1 – Merlin

+0

무엇이 '변경된'부울입니까? – BornToCode

+0

onGlobalLayout 리스너가 반복적으로 실행되지 않도록합니다. 나이가 들고 현명하게, 이제'onGlobalLayoutListener'를'ViewTreeObserver'에서'onGlobalLayout()'메소드의 첫 번째 액션으로 제거 할 것입니다. (자세한 내용은 내 편집 참조) – Graeme

1

Matrix.ScaleToFit CENTER을 사용하는 fitCenter를 원하는 것처럼 보입니다.

+0

이것은 종횡비를 유지하지만 이미지가 더 이상 채워지지 않습니다.이것은 ImageView의 높이가 프로그래밍 방식으로 완료 될 수 있지만 XML을 통해 발생 시키길 원할 경우 작동합니다. – Graeme

+0

@Graeme - 링크에서 : "원래의 src 종횡비를 유지할 스케일을 계산하지만 src가 dst 내에 완전히 들어갈 수 있도록합니다. * 적어도 하나의 축 (X 또는 Y)이 정확히 맞을 것입니다. * 결과는 다음과 같습니다. dst 내부에 중심을 두었다. " - 그 설명은 폭이나 높이를 채우기 위해 이미지가 늘어나게된다는 것을 의미하는 것 같습니다. 어쩌면 딱 맞아 떨어지지 만 딱 맞지는 않을까요? – mbeckish

+0

설명은 정확합니다. 크기 중 하나가 "wrap_content"로 설정 되었기 때문에 ImageView의 크기 초기화가 배율 조정 이전에 수행 된 것으로 보이므로 View의 높이가 이미 설정되어 있고 가장 작은 축을 사용하고 있습니다. , 그것을 확대하지 않고. – Graeme

관련 문제