Bir android.widget.ImageView genişliği ve yüksekliği nasıl elde edilir?


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

Bazı varsayılan yükseklik ve genişlik ile bir görüntü görünümü var, görüntüler db saklanır ve görüntü Imageview yükseklik genişliğine göre ölçeklemek istiyorum. Ben varsayılan değer vermek istemiyorum çünkü ben onun yükseklik ve genişliğini değiştirmek zaman kodda da değiştirmek zorunda.

ImageView yüksekliğini ve genişliğini almaya çalışıyorum ama 0 her iki durumda da bana geri döndü.

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

varsayılan yükseklik ve genişliğe sahip olsa bile bu bana 0 döndürür


«Varsayılan değerleri vermek istemediğim için, yükseklik ve genişliğini değiştirdiğimde kodda da değiştirmek zorundayım» - hangisini değiştirebilirim? görüntü veya saklanan görüntüler?
Pedro Loureiro

sadece kullanamaz android:scaleType="centerInside"mısın
bigstones

2
@nightcracker: Bu ASCII değil.
Joey

7
@ ASοеу "ASCII" dediğimde, sadece ASCII karakter setinden daha fazla sanatı kapsayan "ASCII sanatı" demek istedim.
orlp

1
Bu doğrudan soruyu cevaplamaz, ancak getHeight () / getWidth () neden 0 döndürdüğünü merak ediyorsanız, görünüm "çizilmeden" önce bu yöntemleri çağırırsanız, yani onCreate () bu yöntemleri çağırmak 0 dönecekti
audiojared

Yanıtlar:


222

Bu soruya cevabım size yardımcı olabilir:

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;
    }
});

Daha sonra görüntü ölçeklendirme işinizi onPreDraw () yönteminden ekleyebilirsiniz.


8
çok güzel bir kod kardeşi ve bunun için mantıksal +1. bunu ImageView özelliğini android ayarlayarak da yapabilirsiniz: adjustViewBounds = "true" true :)
AZ_

hey ama işaretçi hata ayıklama sırasında minside onPreDraw () gitmeyin. Neden böyle?
Geetanjali

3
Ben vto.removeOnPreDrawListener (bu) eklemeniz gerektiğini düşünüyorum; line inside onPreDraw ()
sagus_helgy

1
@ KK_07, Sufferer'ın yorumuna göre düzenlemeye bakın. İşiniz bittiğinde dinleyiciyi kaldırmanız yeterlidir.
Kevin Coppock

6
Bir iç sınıf içindeki finalHeight ve finalWidth öğelerine final yapmadan değerleri nasıl atarsınız?
Chris

29

Bu özelliği ayarladım ve şimdi Android işletim sistemi her şeyi hallediyor.

android: adjustViewBounds = "true"

ImageView: D'nizi yerleştirdiğiniz layout.xml dosyasında bunu kullanın


4
@jww Olumsuz seçmenlere gerçekten cevap vermiyorum: p, Önce Android belgelerinde getWidth ve getMeasured hakkında bilgi edinin. sonra gelip aşağı oy verin.
AZ_

27

Çekilebilirliğiyle görüntü genişliği ve yüksekliğini elde edebilirim;

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

14

ImageView'ın boyutlarının 0 olmasının nedeni, bunları sorgularken görünümün düzen ve hesaplama adımlarını hala gerçekleştirmemiş olmasıdır. Görünüme yalnızca düzende nasıl davranacağını söylediniz, ancak yine de her görünümü nereye koyacağınızı hesaplamamıştınız.

Görüntü görünümüne verilecek boyuta nasıl karar verirsiniz? Yerel olarak uygulanan ölçeklendirme seçeneklerinden birini kullanamaz mısınız?


ImageView varsayılan yükseklik ve genişlik verdik ama kod onları almaya çalıştığınızda bana 0 döndürür. Ben ilk ImageView şişirmek zorunda düşünüyorum. ama nasıl?
AZ_

Cevabımda bunu ele alıyorum. Tekrar okuyun :) Bence görüşünüz zaten şişmiş durumda. Bunu görebiliyor musun? eğer yapabilirseniz, o zaman şişirilir.
Pedro Loureiro

13

UI iş parçacığı sonrası benim için çalışıyor.

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();

            }
});

Gerçekten yardımcı!
Xavi Jimenez

Yanlış. Kullanıcı arayüzünden genişlik ve yüksekliği sorgulamak, bu değerlerin hazır olduğunu garanti etmez. Görüntüleme enflasyonu örneğinizde henüz sona ermişti, ancak çok iyi olabilir
rommex

6

xml dosyanız:

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

java dosyanız:

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

5

Android işletim sisteminin sizin için bununla ilgilenmesine izin verebileceğinizi düşünüyorum. ImageView'daki ölçek türünü ayarlayın; fitXYgörüntülediği görüntü, mevcut görünüm boyutuna sığacak şekilde boyutlandırılır.

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

4

En basit yol, etkinliğin onWindowFocusChanged yönteminde bir ImageView genişliğini ve yüksekliğini elde etmektir

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

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

}

1
onWindowFocusChanged sadece API18 ve üzerinde çalışır ve en iyi yol olamaz ... ancak teşekkürler
Milad gh

1

Dinamik olarak birden çok görüntü oluşturduysanız, bunu deneyin:

// initialize görüntüleri dizisi

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

// programlı olarak oluşturma ve üst görünüme ekleme

 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);
            }

// Bu kadar. Mutlu Kodlama.


-2

arkadaşım bu u db saklanan görüntü yüksekliği almıyoruz. ama görüntü yüksekliği alıyorsanız. görüntü yüksekliği elde etmek için u db, s görüntü bitmap oluşturmak zorunda.


2
Resmin yüksekliğini ve genişliğini biliyorum, ancak ImageView'in Yüksekliğini ve genişliğini bilmek istiyorum, böylece buna göre ölçeklendirebiliyorum. Umarım anladım.
AZ_
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.