2013-10-14 5 views
0

설명하기가 약간 힘들지만 어쨌든 시도해보십시오.이미지 크기가 이미지에 맞게 조정됩니다.

이미지를 ImageView에 표시하면 이미지 뷰가 weight 속성을 사용하여 ScreenHeight의 50 %를 사용하도록 설정됩니다.

ImageAspectRatio가 ImageView의 비율에 맞지 않으면 ImageView의 아래쪽과 위쪽에 빈 공간이 생깁니다.

기본적으로 내 ImageView가 ScreenHeight의 50 % 인 maxSize를 갖지만 이미지의 전체 높이를 사용하지 않거나 적어도 ImageView의 맨 위로 이동하는 경우 높이를 축소해야합니다.

그래서 내가 한 것은 최대 크기로보기를 설정하고 이미지를 일반적으로 ImageView와 같은 방식으로 설정합니다. 그런 다음 ImageView를 배치 한 다음 View의 높이를 얻으십시오.

그런 다음 적용 할 스케일링을 계산합니다. 나는 이미지의 크기를 조절하고 뷰를 이전의 높이를 테두리로 가져야하므로 뷰를 내용 감싸기로 설정합니다.

이제는 CyclicoMod (Android 4.2.2)를 실행하는 Samsung GT-I9000에서도 잘 작동하며 Kindle HD에서도이 기능을 사용했습니다. 그러나 Nexus 4 (Android 4.3을 실행 중)에서 동일한 작업을 수행하면 모든 것을 무시하는 것처럼 보입니다.

내 말은, 이미지가 올바르게 확대 (53x와 같은 크기 조정 후 imageHeight)되는 것처럼 보이지만 이미지는 거의 전체 화면을 차지합니다. 왜 다른 2 대의 기기에서 작동하지만 Nexus에서는 작동하지 않습니다.

안드로이드 4.3에 대한 ImageView에 관한 새로운 API가 있습니까?

@Override 
public void setImageResource(final int resId) { 
    //  this.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0.5f)); 
    super.setImageResource(resId); 

    getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { 

     @Override 
     public boolean onPreDraw() { 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId); 

      int width = bitmap.getWidth(); 
      int height = bitmap.getHeight(); 
      int boundingY = getHeight(); 
      int boundingX = getWidth(); 

      float xScale = ((float) boundingX)/width; 
      float yScale = ((float) boundingY)/height; 

      float scale = (xScale <= yScale) ? xScale : yScale; 

      Matrix matrix = new Matrix(); 
      matrix.postScale(scale, scale); 

      Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); 

      MyImageView.this.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT)); 

      MyImageView.super.setImageBitmap(scaledBitmap); 

      getViewTreeObserver().removeOnPreDrawListener(this); 
      return true; 
     } 
    }); 
} 

여기에 무엇을 하려는지 /하고있는 사진이 있습니다.

resizingImageView

은 푸른 빛을 띤 것은 이미지 뷰의 크기, 검은 사각형, 이미지의 실제 크기 고려하십시오. 파란색 크기는 ImageView의 Size를 width = matchParent로 설정하고 height = 0으로 무게를 0.5로 설정하면 얻을 수 있습니다. 이것은 ImageView가 갖길 원하는 MAX의 높이입니다.

이제 Image의 너비가 ImageView의 너비보다 클 수 있습니다. 그 경우, 높이를 이미지의 높이에 맞추기 위해 이미지의 크기를 조정하고 그 경계 내에서 찾기 위해 이미지를 WrapContent로 설정하려면 이미지를 원하는 크기로 정확하게 표시하고 싶습니다.

그러나 이미지의 경우에도 가능합니다. 2 * 너비 = 높이 그 경우에는 ImageView 아무것도 할 싶지 않아요. 그냥 최대 높이를 유지하고 제공 이미지를 표시합니다.

이것은 일부 장치, GT-I9000 및 Amazon Kindle HD에서 이미 언급했듯이 작동하지만 Nexus 4에서는 폭보다 훨씬 큰 높이의 이미지가 전체 화면을 차지하는 경향이 있습니다.

디버깅하여 ImageViewHeight 및 BitmapHeight를 가져 왔습니다. 둘 다 이미지 및 ImageView 534 PX 높은 것으로 명시했다.

나는 왜 내가 다른 2 개의 장치에서 작동하지만, 넥서스에서는 작동하지 않는 이유는 모르겠다.

<include layout="@layout/own_action_bar" /> 

<*.view.MyImageView 
    android:id="@+id/drawFragment_iv" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.5" 
    android:adjustViewBounds="true" 
    android:contentDescription="@string/hello" /> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.5" > 
something in here 
<RelativeLayout/> 
<LinearLayout/> 
+2

원하는 이미지를 붙여 넣을 수 있으며 무엇을 얻으려는 것인지 알 수 있습니다. –

+1

중복 된 http://stackoverflow.com/questions/8232608/fit-image-into-imageview-keep-aspect -ratio-and-then-resize-imageview-to-image-d? rq = 1 – NitroG42

+0

덕분에 많은 것을 보았습니다. –

답변

0

전화 setBackgroundResource 대신 당신의 이미지 뷰 객체에 setImageResource과는 이미지 뷰에 맞게 이미지 크기를 조정합니다.

비록 이것을 달성하는 것이 효율적인 방법은 아니지만, 그러한 ImageViews를 많이 사용하지 않는다면 트릭을해야합니다.

관련 문제