Làm cách nào để có được chiều rộng và chiều cao của android.widget.ImageView?


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

Tôi có chế độ xem hình ảnh với một số chiều cao và chiều rộng mặc định, hình ảnh được lưu trữ trong db và tôi muốn chia tỷ lệ Hình ảnh theo chiều rộng chiều cao của Imageview. Vì tôi không muốn nó đưa ra các giá trị mặc định bởi vì khi tôi thay đổi chiều cao và chiều rộng, tôi cũng phải thay đổi nó theo mã.

Tôi đang cố gắng để có được chiều cao và chiều rộng của ImageView nhưng 0 được trả về cho tôi trong cả hai trường hợp.

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

cái này trả về cho tôi 0 thậm chí nó có chiều cao và chiều rộng mặc định


«Vì tôi không muốn đưa ra các giá trị mặc định bởi vì bao giờ tôi thay đổi chiều cao và chiều rộng của nó, tôi cũng phải thay đổi nó trong mã» - cái nào có thể thay đổi? Chế độ xem hình ảnh hoặc hình ảnh được lưu trữ?
Pedro Loureiro

bạn không thể sử dụng android:scaleType="centerInside"?
bigstones

2
@nightcracker: Đó không phải là ASCII.
Joey

7
Khi tôi nói "ASCII", ý tôi là "nghệ thuật ASCII", nó bao hàm nhiều nghệ thuật hơn là chỉ bao gồm bộ ký tự ASCII.
orlp

1
Điều này không trả lời trực tiếp câu hỏi, nhưng nếu bạn thắc mắc tại sao getHeight () / getWidth () lại trả về 0, họ sẽ luôn trả về 0 nếu bạn gọi các phương thức đó trước khi chế độ xem được "vẽ" tức là nếu bạn đã gọi các phương thức này trong onCreate () nó sẽ trả về 0
audiojared

Câu trả lời:


222

Câu trả lời của tôi cho câu hỏi này có thể giúp bạn:

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

Sau đó, bạn có thể thêm công việc chia tỷ lệ hình ảnh của mình từ bên trong phương thức onPreDraw ().


8
Anh em mã rất đẹp và logic +1 cho điều đó. bạn cũng có thể đạt được điều này bằng cách đặt thuộc tính ImageView android: điều chỉnhViewBound = "true" thành true :)
AZ_

này nhưng trong khi gỡ lỗi con trỏ không đi minside onPreDraw (). Tại sao nó lại như vậy?
Geetanjali

3
Tôi nghĩ bạn cần thêm vto.removeOnPreDrawListener (cái này); dòng bên trong onPreDraw ()
sagus_helgy

1
@ KK_07 xem chỉnh sửa theo nhận xét của Sufferer. Chỉ cần loại bỏ người nghe sau khi bạn đã hoàn thành với nó.
Kevin Coppock

6
Làm thế nào để bạn gán giá trị cho FinalHeight và FinalWidth bên trong một lớp bên trong mà không làm cho chúng cuối cùng?
Chris

29

Tôi chỉ đặt thuộc tính này và bây giờ HĐH Android đang chăm sóc mọi thứ.

android: điều chỉnhViewBound = "true"

Sử dụng cái này trong layout.xml của bạn, nơi bạn đã trồng ImageView: D


4
@jww Tôi không thực sự trả lời các cử tri tiêu cực: p, Lần đầu tiên đọc về getWidth và getMeasured trong tài liệu Android. sau đó đến và xuống bầu người.
AZ_

27

Tôi có thể có được chiều rộng và chiều cao hình ảnh bằng cách vẽ được;

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

14

Lý do các chế độ của ImageView là 0 là vì khi bạn truy vấn chúng, chế độ xem vẫn chưa thực hiện bố cục và đo các bước. Bạn chỉ nói với chế độ xem nó sẽ "hành xử" như thế nào trong bố cục, nhưng nó vẫn không được tính toán để đặt mỗi chế độ xem.

Làm thế nào để bạn quyết định kích thước để cung cấp cho xem hình ảnh? Bạn có thể đơn giản sử dụng một trong các tùy chọn mở rộng được triển khai thực sự không?


Tôi đã đưa chiều cao và chiều rộng mặc định cho ImageView nhưng khi tôi cố gắng lấy chúng trong mã thì nó trả về cho tôi 0. Tôi nghĩ rằng tôi phải làm tăng ImageView trước. nhưng làm thế nào để?
AZ_

Tôi giải quyết điều đó trong câu trả lời của tôi. Đọc lại :) Tôi nghĩ rằng quan điểm của bạn đã bị thổi phồng. Bạn có thể thấy nó? nếu bạn có thể, thì nó sẽ tăng cao.
Pedro Loureiro

13

Đăng lên chủ đề UI làm việc cho tôi.

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

            }
});

Thực sự hữu ích!
Xavi Jimenez

Sai lầm. Truy vấn chiều rộng và chiều cao từ UI không đảm bảo rằng các giá trị đó đã sẵn sàng. Lạm phát lượt xem chỉ tình cờ được hoàn thành trong mẫu của bạn, nhưng rất có thể là khác
rommex

6

tập tin xml của bạn:

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

tập tin java của bạn:

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

5

Tôi nghĩ bạn có thể để HĐH Android đảm nhiệm việc này cho bạn. Đặt loại tỷ lệ trên ImageView thành fitXYvà hình ảnh mà nó hiển thị sẽ có kích thước phù hợp với kích thước hiện tại của chế độ xem.

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

4

Cách đơn giản nhất là lấy chiều rộng và chiều cao của ImageView trong phương thức onWindowF FocusChanged của hoạt động

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

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

}

1
onWindowF FocusChanged chỉ hoạt động trên API18 trở lên và đó không phải là cách tốt nhất ... tuy nhiên cảm ơn
Milad gh

1

Nếu bạn đã tạo nhiều hình ảnh động hơn hãy thử hình ảnh này:

// khởi tạo mảng hình ảnh của bạn

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

// tạo lập trình và thêm vào khung nhìn cha

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

// Đó là nó. Chúc mừng mã hóa.


-2

Bạn của tôi bởi bạn không nhận được chiều cao của hình ảnh được lưu trữ trong db. Nhưng bạn đang có chiều cao xem. Để có chiều cao của hình ảnh bạn phải tạo bitmap từ db, s image.and hơn bạn có thể tìm nạp chiều cao và chiều rộng của hình ảnh


2
Tôi biết chiều cao và chiều rộng của hình ảnh nhưng tôi muốn biết Chiều cao và chiều rộng của ImageView để tôi có thể chia tỷ lệ cho phù hợp. Tôi mong rằng bạn hiểu ý của tôi.
AZ_
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.