En boy oranını korumak için ImageView'da bir Görüntüyü ölçeklendirme


526

Android, ben bir tanımlanmış ImageView's layout_widtholması fill_parent(telefonun tam genişliği kadar sürer).

Eğer koyduğum görüntü ImageViewdaha büyükse layout_width, Android onu ölçeklendirir, değil mi? Ama yükseklik ne olacak? Android görüntüyü ölçeklendirdiğinde, en boy oranını koruyacak mı?

Bulduğum şey ImageView, Android'in daha büyük bir görüntüyü ölçeklendirmesinin üst ve alt kısmında beyaz boşluk olması ImageView. Bu doğru mu? Evetse, bu boşluğu nasıl ortadan kaldırabilirim?

Yanıtlar:


799
  1. Evet, varsayılan olarak Android, en boy oranını koruyarak görüntünüzü ImageView'e sığacak şekilde ölçeklendirir. Ancak, görüntüyü android:src="..."yerine ImageView olarak ayarladığınızdan emin olun android:background="...". src=en boy oranını koruyarak görüntüyü ölçeklendirir, ancak görüntüyü tam olarak ImageView boyutuna sığdırmak background=için ölçeklendirir ve deforme eder. (Bir arka planı ve kaynağı aynı anda kullanabilirsiniz; bu, yalnızca bir ImageView kullanarak ana görüntünün etrafında bir çerçeve görüntülemek gibi şeyler için yararlı olabilir.)

  2. Ayrıca android:adjustViewBounds, ImageView'in ölçeklendirilmiş görüntüye sığacak şekilde kendisini yeniden boyutlandırmasını sağlamanız gerekir . Örneğin, normalde kare bir ImageView olan dikdörtgen bir görüntünüz varsa, adjustViewBounds = true, ImageView öğesini de dikdörtgen olarak yeniden boyutlandırır. Bu, daha sonra diğer Görünümlerin ImageView çevresinde nasıl düzenlendiğini etkiler.

    Samuh'un yazdığı gibi, android:scaleTypeparametresini kullanarak varsayılan olarak görüntüleri ölçeklendirme şeklini değiştirebilirsiniz . Bu arada, bunun nasıl çalıştığını keşfetmenin en kolay yolu basitçe biraz kendiniz denemek oldu! Eclipse'deki önizleme genellikle yanlış olduğundan emülatördeki yerleşimlere (veya gerçek bir telefona) bakmayı unutmayın.


18
Aynı şey, XML'den ziyade kodla yapıldı. setImageBitmapaynıdır android:src="..."ve setBackground...birandroid:background="..."
Steve Haley

4
@SuperUser image.setImageDrawable(...)olan android:src="..."xml aswell.
PureSpider

11
"android: adjustViewBounds" burada kullanışlı bir not! bunu eklemezseniz, büyük olasılıkla ImageView kenarlığı / sınırları / kapsayıcısının doğru ölçeklenmemesiyle ilgili sorunlarınız olacaktır.
Kızgın 84

2
src = vs background = benim için farktı!
Christopher Rathgeb

21
android:adjustViewBoundsYapbozumun son parçasıydı, teşekkürler!
themarketka

281

Bkz android:adjustViewBounds.

ImageView'ın çizilebilir en boy oranını korumak için sınırlarını ayarlamasını istiyorsanız bunu true olarak ayarlayın.


6
Bu sorun için doğru çözümdür. Bunu, boyumuzun tüm ekstra boşlukları içerdiği görüntü görünümünde yapıyorduk. Genişlik için fill_parent ve yükseklik için wrap_content kullandığımız için "saydam pikseller" değil. AdjustViewBounds = true değerine sahip değilseniz, ekstra boşluk elde edersiniz. Bunu doğru olarak ayarladıktan sonra sorunumuz ortadan kalktı. Teşekkürler!
christophercotton

3
teşekkürler, bu ve arka plan yerine src olarak ayarlamak mükemmel çalıştı!
Cameron


1
Bu sorun için mükemmel bir çözümdür. Ayrıca boyutlar için, boyutu ayarlamak üzere üst kabı kullanın ve ImageView'da match_parent değerini ayarlayın. Bu birçok sorunu çözer.
Nimila Hiranya

Noktaya ulaşmak için +1. Başlangıçta bunu daha "konuşma diline özgü" bir ifadeyle yazdım ve sof bunu göndermemi engelledi. Fırfır tüyleri yerine PC gitti.
Jacksonkr

168

Bu sorunu yaşayan herkese. Bir var ImageViewsen bir genişliğe sahip istediğinizifill_parent ve bir yükseklik orantılı ölçekli:

Bu iki özelliği kendinize ekleyin ImageView:

android:adjustViewBounds="true"
android:scaleType="centerCrop"

Ve ImageViewgenişliğini fill_parentve yüksekliğiniwrap_content .

Ayrıca, resminizin kırpılmasını istemiyorsanız şunu deneyin:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"

16
Evet ama görüntünüz kırpılıyor. Mükemmel çözüm genişliğe uzanır, en boy oranını korur ve kırpmaz. Bunun neden bu kadar sinir bozucu olması gerektiği hakkında hiçbir fikrim yok ...
Warpzit

1
Bana da :( Çözümüm size yardımcı olmadıysa özür dilerim, ama bana yardımcı oldu
Kevin Parker

2
Kevin, tam olarak aradığım şeydi, eğer görüntünün boyutu ekranın boyutundan küçükse, yakınlaştırılmış ve ortalanmış, mükemmel. Teşekkürler.
Soham

1
+1 ("(veya diğer View)" hariç . AFAICT başka hiçbir görünüme adjustViewBoundsveya scaleTypeniteliğe sahip değildir.
LarsH

android yerine android: scaleType = "centerInside" kullanmaya ne dersiniz: scaleType = "centerCrop"? Ayrıca görüntüyü kırpmaz, ancak hem genişliğin hem de yüksekliğin, görüntülemenin genişliğinden ve yüksekliğinden daha az veya ona eşit olmasını sağlar :) İşte ölçek türleri
vida

57

ImageViewUygun en boy oranını korurken her ikisinin de yukarı ve aşağı ölçeklenmesini istiyorsanız, bunu XML'inize ekleyin:

android:adjustViewBounds="true"
android:scaleType="fitCenter"

Bunu kodunuza ekleyin:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

Bunu çalıştırmam biraz zaman aldı, ancak bu hem görüntünün ekran genişliğinden daha küçük hem de ekran genişliğinden daha büyük olduğu durumlarda işe yarıyor gibi görünüyor ve görüntüyü kutulamıyor.


1
Neden sadece android kullanmıyorsunuz: scaleType = "centerCrop"?
Lukas Batteau

bir cazibe gibi çalışır, teşekkürler. scaleType duruma bağlıdır, örneğin tam olarak buna ihtiyacım vardı.
David

Bu, görünümü yeniden boyutlandırmanın biraz barbar bir yolu. Bitmap'i ImageView olarak ayarladıktan sonra görünüm sınırları değişirse ne olur? Bu nedenle, özel bir ImageView alt sınıfı oluşturursanız uygulanabilecek onMeasure () içinde yapılması gerekir.
Aron Lorincz

1
Tek ihtiyacım fitCenter ve adjustViewBounds, en azından benim için kodun geri kalanı gereksizdi
kingargyle

Bu benim için çalışıyor ve herhangi bir kod eklemenize gerek yok. Görüntü genişliği imageView genişliğinden daha küçükse adjustViewBounds olmadan, ölçeklenmiyordu, bu nedenle yükseklik yerel yüksekliğe duruyordu ve genişlikte bazı bantlar göründü.
Cristi Băluță

15

Bu benim için çalıştı:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"

10

bu sorunumu çözdü

android:adjustViewBounds="true"
android:scaleType="fitXY"

Görüntünün en boy oranını benim için korumuyor.
Dmitry

9

Aşağıdaki kod En boy oranı olarak ölçek görüntüsü için çalışma:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);

8

Yeniden boyutlandırma işleminin nasıl gerçekleştiğini kontrol etmek ve anlamak için ImageView.ScaleType'a bir göz atın ImageView. Görüntü yeniden boyutlandırıldığında (en boy oranını korurken), görüntünün yüksekliğinin veya genişliğinin ImageViewboyutlarından daha küçük olması ihtimali vardır .


6

En boy oranını korumak için ImageView'da şu özellikleri kullanın:

android:adjustViewBounds="true"
android:scaleType="fitXY"

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />

Sadece bu cevap bana yardımcı oldu. Teşekkürler!
Dmitry

6

Bir ConstraintLayout içinde benim için böyle çalıştı:

<ImageView
    android:id="@+id/myImg"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true"/>

Sonra kod, ben çizilebilir olarak ayarlayın:

ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));

Bu görüntü en-boy oranına göre güzelce uyuyor ve ortada kalıyor.


5

Ekrandan daha küçük bir resmim var. Maks. Orantılı olarak uzatılmış ve görünümde ortalanmış olması için aşağıdaki kodu kullanmak zorunda kaldım:

<ImageView
    android:id="@+id/my_image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:adjustViewBounds="true"
    android:layout_weight="1"
    android:scaleType="fitCenter" />

Bununla birlikte, göreceli bir düzeniniz varsa ve bazı öğelerin ImageView'in üstünde veya altında olması durumunda, bunların büyük olasılıkla görüntüyle çakışacağını unutmayın.


4

Görüntü kalitesi düşerse:

android:adjustViewBounds="true"

onun yerine

android:adjustViewBounds="true"
android:scaleType="fitXY"

3

Görüntünün uygun ölçeklendirme ve kırpma kullanımı olmadan görüntü görüntüsüne tam olarak uymasını isteyen herkes için

imageView.setScaleType(ScaleType.FIT_XY);

imageView, ImageView'inizi temsil eden görünümdür


4
Hayır, bu en boy oranını değiştirir. Dokümanlar şunları söylüyor: "src'nin dst ile tam olarak eşleşmesi için X ve Y'de bağımsız olarak ölçeklendir. Bu, src'nin en boy oranını değiştirebilir."
Rose Perrone

Bu arada, bu FIT_XY görüntünün görüntülenmesi için görüntünün genişliğini / yüksekliğini değiştirmek için kullanılamaz.
Bay

3

Ekran genişliğini hesaplayabilirsiniz. Ve bitmap'i ölçeklendirebilirsiniz.

 public static float getScreenWidth(Activity activity) {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        float pxWidth = outMetrics.widthPixels;
        return pxWidth;
    }

ekran genişliğini ve ölçekli görüntü yüksekliğini ekran genişliğine göre hesaplar.

float screenWidth=getScreenWidth(act)
  float newHeight = screenWidth;
  if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
     newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
  }

Bitmap'i ölçeklendirdikten sonra.

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);

3

Bunu programlı olarak yaparken ayarlayıcıları doğru sırada çağırdığınızdan emin olun:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)

2

Resminizin mümkün olan maksimum alanı kaplamasını istiyorsanız, en iyi seçenek

android:layout_weight="1"
android:scaleType="fitCenter"

2

Herhangi bir java koduna ihtiyacınız yok. Tek yapmanız gereken:

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />

Anahtar, genişlik ve yükseklik için eşleştirme üstündedir


1

android:layout_gravityImageView için kullanmayı deneyin :

android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"

Yukarıdaki örnek benim için çalıştı.


1
android: layout_weight = "1" anahtardır.
nima

1

En boy oranını koruyarak, bir bit eşlem bestFit konteyner boyutları için ölçeklemek için bir algoritma var. Lütfen çözümümü burada bul

Umarım bu yoldan birine yardım eder!


0

Bunu kullanıyorum:

<ImageView
android:id="@+id/logo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:scaleType="centerInside"
android:src="@drawable/logo" />

0

cardviewyuvarlama için kullanılması imageviewve android:layout_heightbaşlık için sabitlenmesi durumunda,Glide

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="220dp"
             xmlns:card_view="http://schemas.android.com/apk/res-auto"
             >

    <android.support.v7.widget.CardView
            android:id="@+id/card_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center|top"
            card_view:cardBackgroundColor="@color/colorPrimary"
            card_view:cardCornerRadius="10dp"
            card_view:cardElevation="10dp"
            card_view:cardPreventCornerOverlap="false"
            card_view:cardUseCompatPadding="true">

        <ImageView
                android:adjustViewBounds="true"
                android:maxHeight="220dp"
                android:id="@+id/iv_full"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scaleType="fitCenter"/>

    </android.support.v7.widget.CardView>
</FrameLayout>

0

Görüntünüzün boyutunu da küçülten görüntüyü ölçeklendirebilirsiniz. İndirebileceğiniz ve kullanabileceğiniz bir kütüphane var. https://github.com/niraj124124/Images-Files-scale-and-compress.git

Nasıl kullanılır 1) Kompresörü içe aktarın-v1.0. proje için kavanoz. 2) Test etmek için aşağıdaki örnek kodu ekleyin. ResizeLimiter resize = ImageResizer.build (); resize.scale ("inputImagePath", "outputImagePath", imageWidth, imageHeight); İhtiyacınıza göre çok daha fazla yöntem var


0

ImageView'inizi geçirin ve ekran yüksekliği ve genişliğine göre yapabilirsiniz

    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / 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);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }


0

Hızlı cevap:

<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" />

-5
imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.