이미지를 이미지 보기에 맞추고 가로 세로 비율을 유지한 다음 이미지 보기 크기를 이미지 크기에 맞게 조정하시겠습니까?
를 의임크이적미합방에 ImageView
?
다음과 같은 경우:
- 처음에는
ImageView
*입니다. 250dp * 250dp 입니다. - 이미지의 더 큰 차원을 250dp로 스케일업/스케일다운해야 합니다.
- 이미지가 가로 세로 비율을 유지해야 합니다.
- 그
ImageView
조정 후 조정된가 일치해야 합니다.
100및 예: 100*150 이의경우및미지이미지및▁e.ImageView
166*250이어야 합니다.
150와 예: 150*100의 이미지입니다.ImageView
250*$이어야 합니다.
경계를 다음과 같이 설정하면
<ImageView
android:id="@+id/picture"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:adjustViewBounds="true" />
가 이지가다니에 .ImageView
러나그나ImageView
항상 250dp * 250dp입니다.
질문에 답은 제한된 답을 이 질 특 문 대 에 답 예 에 있 사 만 이 제 람 한 된 ImageView 크 서 이 는 답 찾 대 한 있 경 우 는 고 을 에 방 법 추 기 맞 로 저 와 를 은 지 미 정 같 지 한 도 : )).maxWidth
) 과 같은 이 가장
android:scaleType="centerInside"
android:adjustViewBounds="true"
(원래 질문에 대한 설명 후 답변이 크게 수정되었습니다.)
후: 명후설:
이 작업은 xml로만 수행할 수 없습니다.영상과 영상의 스케일을 모두 조정할 수는 없습니다.ImageView
이고 그서차그이 1원항상은고 250dp이,ImageView
이미지와 동일한 치수를 가집니다.
이 코드는 축척됩니다. Drawable
상당한ImageView
250dp x 250dp와 같은 정사각형에 정확히 250dp의 1차원을 유지하고 가로 세로 비율을 유지합니다.에 그면러그.ImageView
크기가 조정된 이미지의 치수에 맞게 조정됩니다.코드는 활동에 사용됩니다.버튼 클릭 핸들러를 통해 테스트했습니다.
맛있게 드세요 :)
private void scaleImage(ImageView view) throws NoSuchElementException {
// Get bitmap from the the ImageView.
Bitmap bitmap = null;
try {
Drawable drawing = view.getDrawable();
bitmap = ((BitmapDrawable) drawing).getBitmap();
} catch (NullPointerException e) {
throw new NoSuchElementException("No drawable on given view");
} catch (ClassCastException e) {
// Check bitmap is Ion drawable
bitmap = Ion.with(view).getBitmap();
}
// Get current dimensions AND the desired bounding box
int width = 0;
try {
width = bitmap.getWidth();
} catch (NullPointerException e) {
throw new NoSuchElementException("Can't find bitmap on given view/drawable");
}
int height = bitmap.getHeight();
int bounding = dpToPx(250);
Log.i("Test", "original width = " + Integer.toString(width));
Log.i("Test", "original height = " + Integer.toString(height));
Log.i("Test", "bounding = " + Integer.toString(bounding));
// Determine how much to scale: the dimension requiring less scaling is
// closer to the its side. This way the image always stays inside your
// bounding box AND either x/y axis touches it.
float xScale = ((float) bounding) / width;
float yScale = ((float) bounding) / height;
float scale = (xScale <= yScale) ? xScale : yScale;
Log.i("Test", "xScale = " + Float.toString(xScale));
Log.i("Test", "yScale = " + Float.toString(yScale));
Log.i("Test", "scale = " + Float.toString(scale));
// Create a matrix for the scaling and add the scaling data
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
// Create a new bitmap and convert it to a format understood by the ImageView
Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
width = scaledBitmap.getWidth(); // re-use
height = scaledBitmap.getHeight(); // re-use
BitmapDrawable result = new BitmapDrawable(scaledBitmap);
Log.i("Test", "scaled width = " + Integer.toString(width));
Log.i("Test", "scaled height = " + Integer.toString(height));
// Apply the scaled bitmap
view.setImageDrawable(result);
// Now change ImageView's dimensions to match the scaled image
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
Log.i("Test", "done");
}
private int dpToPx(int dp) {
float density = getApplicationContext().getResources().getDisplayMetrics().density;
return Math.round((float)dp * density);
}
의 ImageView
:
<ImageView a:id="@+id/image_box"
a:background="#ff0000"
a:src="@drawable/star"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_marginTop="20dp"
a:layout_gravity="center_horizontal"/>
스케일링 코드에 대한 논의 덕분에:
http://www.anddev.org/.htmlhttp ://www.anddev.org/resize_and_rotate_image_-_example-t621.html
2012년 11월 7일:
되었습니다.
<ImageView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:adjustViewBounds="true"/>
아래 코드는 동일한 크기의 이미지 보기로 완벽하게 비트맵을 만듭니다.비트맵 이미지의 높이와 너비를 가져온 다음 이미지 뷰의 매개 변수를 사용하여 새 높이와 너비를 계산합니다.따라서 필요한 이미지를 최상의 가로 세로 비율로 제공합니다.
int currentBitmapWidth = bitMap.getWidth();
int currentBitmapHeight = bitMap.getHeight();
int ivWidth = imageView.getWidth();
int ivHeight = imageView.getHeight();
int newWidth = ivWidth;
newHeight = (int) Math.floor((double) currentBitmapHeight *( (double) new_width / (double) currentBitmapWidth));
Bitmap newbitMap = Bitmap.createScaledBitmap(bitMap, newWidth, newHeight, true);
imageView.setImageBitmap(newbitMap)
즐거운 시간 되세요.
가해봅다니를 추가해 .android:scaleType="fitXY"
의 신에게에.ImageView
.
이 모든 작업은 XML을 사용하여 수행할 수 있습니다.다른 방법들은 꽤 복잡해 보입니다.어쨌든, 당신은 당신이 원하는 높이를 dp 단위로 설정한 다음, 내용물을 감싸거나 그 반대로 너비를 설정합니다.척도 사용fitCenter를 입력하여 이미지 크기를 조정합니다.
<ImageView
android:layout_height="200dp"
android:layout_width="wrap_content"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:src="@mipmap/ic_launcher"
android:layout_below="@+id/title"
android:layout_margin="5dip"
android:id="@+id/imageView1">
대부분의 경우에 효과적인 최상의 솔루션입니다.
다음은 예입니다.
<ImageView android:id="@+id/avatar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"/>
하루 동안 검색해 본 결과, 이것이 가장 쉬운 해결책이라고 생각합니다.
imageView.getLayoutParams().width = 250;
imageView.getLayoutParams().height = 250;
imageView.setAdjustViewBounds(true);
편집된 Jarno Argillanders는 다음과 같이 대답합니다.
너비와 높이로 이미지를 맞추는 방법:
ImageView 초기화 및 이미지 설정:
iv = (ImageView) findViewById(R.id.iv_image);
iv.setImageBitmap(image);
이제 크기 조정:
scaleImage(iv);
scaleImage
방법: (예상 경계 값을 바꿀 수 있습니다.)
private void scaleImage(ImageView view) {
Drawable drawing = view.getDrawable();
if (drawing == null) {
return;
}
Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int xBounding = ((View) view.getParent()).getWidth();//EXPECTED WIDTH
int yBounding = ((View) view.getParent()).getHeight();//EXPECTED HEIGHT
float xScale = ((float) xBounding) / width;
float yScale = ((float) yBounding) / height;
Matrix matrix = new Matrix();
matrix.postScale(xScale, yScale);
Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
width = scaledBitmap.getWidth();
height = scaledBitmap.getHeight();
BitmapDrawable result = new BitmapDrawable(context.getResources(), scaledBitmap);
view.setImageDrawable(result);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
}
.xmlsyslog.xml:
<ImageView
android:id="@+id/iv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
만약 그것이 당신에게 효과가 없다면 안드로이드:배경을 안드로이드:src로 교체하세요.
안드로이드: src가 주요 트릭을 할 것입니다.
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/bg_hc" />
그것은 매력적으로 잘 작동합니다.
다음 코드 사용:
<ImageView android:id="@+id/avatar"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:scaleType="fitXY" />
이것이 제 경우에 도움이 되었습니다.
<ImageView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:scaleType="centerCrop"
android:adjustViewBounds="true" />
ImageView(이미지 보기)와 비트맵이 필요했기 때문에 비트맵은 ImageView(이미지 보기) 크기로 조정되고 ImageView(이미지 보기) 크기는 조정된 비트맵:)와 동일합니다.
저는 어떻게 해야 할지 이 게시물을 훑어보다가 마침내 여기에 설명된 방식이 아닌 제가 원하는 것을 했습니다.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/acpt_frag_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/imageBackground"
android:orientation="vertical">
<ImageView
android:id="@+id/acpt_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:layout_margin="@dimen/document_editor_image_margin"
android:background="@color/imageBackground"
android:elevation="@dimen/document_image_elevation" />
그런 다음 CreateView 메서드에서
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_scanner_acpt, null);
progress = view.findViewById(R.id.progress);
imageView = view.findViewById(R.id.acpt_image);
imageView.setImageBitmap( bitmap );
imageView.getViewTreeObserver().addOnGlobalLayoutListener(()->
layoutImageView()
);
return view;
}
그런 다음 layoutImageView() 코드를 누릅니다.
private void layoutImageView(){
float[] matrixv = new float[ 9 ];
imageView.getImageMatrix().getValues(matrixv);
int w = (int) ( matrixv[Matrix.MSCALE_X] * bitmap.getWidth() );
int h = (int) ( matrixv[Matrix.MSCALE_Y] * bitmap.getHeight() );
imageView.setMaxHeight(h);
imageView.setMaxWidth(w);
}
그 결과 이미지가 완벽하게 안에 들어맞고 가로 세로 비율이 유지되며 비트맵이 안에 있을 때 ImageView에서 여분의 픽셀이 남지 않습니다.
wrap_content를 true로 설정하고 ViewBounds를 true로 조정한 다음 setMaxWidth 및 setMaxHight가 작동하는 것이 중요합니다. 이는 ImageView의 소스 코드에 기록되어 있습니다.
/*An optional argument to supply a maximum height for this view. Only valid if
* {@link #setAdjustViewBounds(boolean)} has been set to true. To set an image to be a
* maximum of 100 x 100 while preserving the original aspect ratio, do the following: 1) set
* adjustViewBounds to true 2) set maxWidth and maxHeight to 100 3) set the height and width
* layout params to WRAP_CONTENT. */
피카소와 함께 제약 레이아웃에서 이 작업을 수행해야 했기 때문에 위의 답변 중 일부를 조합하여 이 해결책을 생각해냈습니다(내가 로드하는 이미지의 가로 세로 비율을 이미 알고 있으므로 도움이 됩니다)
setContentView(...) 후 어딘가에서 활동 코드를 호출했습니다.
protected void setBoxshotBackgroundImage() {
ImageView backgroundImageView = (ImageView) findViewById(R.id.background_image_view);
if(backgroundImageView != null) {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels;
int height = (int) Math.round(width * ImageLoader.BOXART_HEIGHT_ASPECT_RATIO);
// we adjust the height of this element, as the width is already pinned to the parent in xml
backgroundImageView.getLayoutParams().height = height;
// implement your Picasso loading code here
} else {
// fallback if no element in layout...
}
}
내 XML에서
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="0dp">
<ImageView
android:id="@+id/background_image_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="fitStart"
app:srcCompat="@color/background"
android:adjustViewBounds="true"
tools:layout_editor_absoluteY="0dp"
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:layout_marginRight="0dp"
android:layout_marginLeft="0dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<!-- other elements of this layout here... -->
</android.support.constraint.ConstraintLayout>
Bottom_toBottomOf 특성에 제약 조건이 없습니다.ImageLoader는 이미지 로드 사용 방법 및 상수에 대한 자체 정적 클래스입니다.
저는 매우 간단한 해결책을 사용하고 있습니다.여기 내 코드:
imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.getLayoutParams().height = imageView.getLayoutParams().width;
imageView.setMinimumHeight(imageView.getLayoutParams().width);
내 사진은 그리드 보기에서 동적으로 추가됩니다.이러한 설정을 이미지 보기로 설정하면 사진이 1:1 비율로 자동으로 표시될 수 있습니다.
할 수 . 크기를 조정할 수 있습니다.ImageView
또는 설정된 것보다 그리기 가능한 이미지의 크기를 조정할 수 있습니다.ImageView
를 검색합니다. 와 높이를 합니다.ImageView
원하방 호법출다니. 이 통화 비 500보다 크다고 .
//250 is the width you want after resize bitmap
Bitmat bmp = BitmapScaler.scaleToFitWidth(bitmap, 250) ;
ImageView image = (ImageView) findViewById(R.id.picture);
image.setImageBitmap(bmp);
이 클래스는 비트맵의 크기를 조정하는 데 사용됩니다.
public class BitmapScaler{
// Scale and maintain aspect ratio given a desired width
// BitmapScaler.scaleToFitWidth(bitmap, 100);
public static Bitmap scaleToFitWidth(Bitmap b, int width)
{
float factor = width / (float) b.getWidth();
return Bitmap.createScaledBitmap(b, width, (int) (b.getHeight() * factor), true);
}
// Scale and maintain aspect ratio given a desired height
// BitmapScaler.scaleToFitHeight(bitmap, 100);
public static Bitmap scaleToFitHeight(Bitmap b, int height)
{
float factor = height / (float) b.getHeight();
return Bitmap.createScaledBitmap(b, (int) (b.getWidth() * factor), height, true);
}
}
xml 코드는
<ImageView
android:id="@+id/picture"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:adjustViewBounds="true"
android:scaleType="fitcenter" />
빠른 답변:
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center"
android:src="@drawable/yourImage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
그냥 xml로 쓰세요.
android:scaleType="centerCrop"
나를 위해 일했습니다.
저의 경우, 저는 이 질문에 대한 댓글(@vida에 대한 크레딧)에 답이 묻혀 있는 것을 발견했습니다.
android:scaleType="centerInside"
를 사용하는 것은 어떻습니까?
android:scaleType="centerInside"
대신에android:scaleType="centerCrop"
또한 이미지를 자르지는 않지만 너비와 높이가 모두 이미지 보기의 너비와 높이보다 작거나 같도록 보장합니다. :) 스케일 유형에 대한 좋은 시각적 가이드는 다음과 같습니다.Android ImageView ScaleType: 비주얼 가이드
저는 ConstraintLayout 내부의 ImageView를 사용하고 ImageView에서 adjustviewbound를 true로 설정합니다.
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/myimg"
android:adjustViewBounds="true"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
언급URL : https://stackoverflow.com/questions/8232608/fit-image-into-imageview-keep-aspect-ratio-and-then-resize-imageview-to-image-d
'programing' 카테고리의 다른 글
해시방 URL로 페이스북 공유/좋아요를 처리하는 방법은 무엇입니까? (0) | 2023.09.01 |
---|---|
기본 키의 MySQL/MariaDB 느린 업데이트 (0) | 2023.09.01 |
UI 스택 보기 보기 숨기기 애니메이션 (0) | 2023.09.01 |
VBA Excel 매크로에서 유닛 테스트를 설정하는 방법은 무엇입니까? (0) | 2023.09.01 |
SQL 데이터베이스에서 사용자의 모든 관계를 찾는 방법은 무엇입니까? (0) | 2023.09.01 |