Bagaimana cara mendapatkan lebar dan tinggi android.widget.ImageView?

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

Saya memiliki tampilan gambar dengan beberapa tinggi dan lebar standar, gambar disimpan dalam db dan saya ingin mengatur skala Gambar berdasarkan lebar tinggi Imageview. Karena saya tidak ingin itu memberikan nilai default karena ketika saya mengubahnya tinggi dan lebar saya juga harus mengubahnya dalam kode.

Saya mencoba untuk mendapatkan tinggi dan lebar ImageView tetapi 0 dikembalikan kepada saya dalam kedua kasus.

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

ini mengembalikan saya 0 bahkan memiliki tinggi dan lebar standar

AZ_
sumber
«Karena saya tidak ingin memberikan nilai default karena kapan pun saya mengubah tinggi dan lebarnya, saya juga harus mengubahnya dalam kode» - mana yang bisa diubah? tampilan gambar atau gambar yang disimpan?
Pedro Loureiro
tidak bisakah kamu menggunakan saja android:scaleType="centerInside"?
bigstones
2
@ nightcracker: Itu bukan ASCII.
Joey
7
@ Јοеу Ketika saya mengatakan "ASCII", saya bermaksud "seni ASCII", yang mencakup lebih banyak seni daripada yang hanya terdiri dari rangkaian karakter ASCII.
orlp
1
Ini tidak langsung menjawab pertanyaan, tetapi jika Anda bertanya-tanya mengapa getHeight () / getWidth () mengembalikan 0, mereka akan selalu mengembalikan 0 jika Anda memanggil metode tersebut sebelum tampilan telah "ditarik" yaitu jika Anda ingin sebut metode ini di onCreate () itu akan mengembalikan 0
audiojared

Jawaban:

222

Jawaban saya atas pertanyaan ini dapat membantu Anda:

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

Anda kemudian dapat menambahkan pekerjaan penskalaan gambar Anda dari dalam metode onPreDraw ().

Kevin Coppock
sumber
8
saudara kode yang sangat bagus dan +1 logis untuk itu. Anda juga dapat mencapai ini dengan mengatur properti ImageView android: adjustViewBounds = "true" to true :)
AZ_
hei tetapi saat debugging pointer jangan pergi ke minPreDraw (). Kenapa begitu?
Geetanjali
3
Saya pikir Anda perlu menambahkan vto.removeOnPreDrawListener (ini); baris di dalam onPreDraw ()
sagus_helgy
1
@ KK_07 lihat hasil edit sesuai komentar Penderita. Hanya perlu menghapus pendengar setelah Anda selesai.
Kevin Coppock
6
bagaimana Anda menetapkan nilai ke finalHeight dan finalWidth di dalam kelas batin tanpa membuatnya final?
Chris
29

Saya baru saja mengatur properti ini dan sekarang OS Android mengurus semuanya.

android: adjustViewBounds = "true"

Gunakan ini di layout.xml tempat Anda menanam ImageView: D

AZ_
sumber
4
@jww Saya tidak benar-benar membalas pemilih negatif: p, Pertama baca tentang getWidth dan getMeasured dalam dokumentasi Android. lalu datang dan turun memilih orang.
AZ_
27

Saya bisa mendapatkan lebar dan tinggi gambar dengan gambarnya;

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

Alasan dimensi ImageView adalah 0 adalah karena ketika Anda menanyakannya, tampilan masih belum melakukan tata letak dan mengukur langkah-langkah. Anda hanya memberi tahu tampilan bagaimana itu akan "berperilaku" dalam tata letak, tetapi masih tidak dihitung di mana harus menempatkan setiap tampilan.

Bagaimana Anda memutuskan ukuran untuk diberikan ke tampilan gambar? Tidak bisakah Anda menggunakan salah satu opsi penskalaan yang diterapkan secara asli?

Pedro Loureiro
sumber
Saya telah memberikan tinggi dan lebar default untuk ImageView tetapi ketika saya mencoba untuk mendapatkan mereka dalam kode itu mengembalikan saya 0. Saya pikir saya harus mengembang ImageView terlebih dahulu. tapi bagaimana caranya?
AZ_
Saya mengatasinya dalam jawaban saya. Baca lagi :) Saya pikir pandangan Anda sudah meningkat. Bisakah kamu melihatnya? jika Anda bisa, maka itu meningkat.
Pedro Loureiro
13

Posting ke utas UI berfungsi untuk saya.

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

            }
});
elemen6
sumber
Sangat membantu!
Xavi Jimenez
Salah. Menanyakan lebar dan tinggi dari UI tidak menjamin bahwa nilai-nilai tersebut siap. Pandangan inflasi kebetulan selesai dalam sampel Anda, tetapi mungkin sangat baik
rommex
6

file xml Anda:

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

file java Anda:

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

Saya pikir Anda dapat membiarkan OS Android mengurus ini untuk Anda. Setel jenis skala pada ImageView ke fitXYdan gambar yang ditampilkan akan berukuran agar sesuai dengan ukuran tampilan saat ini.

<ImageView 
    android:layout_width="90px" 
    android:layout_height="60px"
    android:scaleType="fitXY" />
Ian Leslie
sumber
4

Cara paling sederhana adalah dengan mendapatkan lebar dan tinggi ImageView dalam metode aktivitas onWindowFocusChanged

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

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

}
Aqib
sumber
1
onWindowFocusChanged hanya bekerja pada API18 dan lebih, dan itu tidak bisa menjadi cara terbaik ... namun terima kasih
Milad gh
1

Jika Anda telah membuat banyak gambar secara dinamis daripada coba yang ini:

// inisialisasi array gambar Anda

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

// buat secara programatis dan tambahkan ke tampilan induk

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

// Itu dia. Selamat Coding.

Hiren Patel
sumber
-2

teman saya dengan ini kamu tidak mendapatkan tinggi gambar yang disimpan dalam db.tapi kamu mendapatkan tinggi tampilan. untuk mendapatkan tinggi gambar kamu harus membuat bitmap dari db, s image.and daripada kamu dapat mengambil tinggi dan lebar imageview

chikka.anddev
sumber
2
Saya tahu tinggi dan lebar gambar tetapi saya ingin tahu Tinggi dan lebar ImageView sehingga saya dapat mengatur skala sesuai. Saya harap Anda mengerti maksud saya.
AZ_