วิธีรับความกว้างและความสูงของ android.widget.ImageView


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

ฉันมีมุมมองภาพที่มีความสูงและความกว้างเริ่มต้นบางภาพจะถูกจัดเก็บในฐานข้อมูลและฉันต้องการปรับขนาดภาพตามความกว้างความสูงของ Imageview เพราะฉันไม่ต้องการให้มันเป็นค่าเริ่มต้นเพราะเมื่อฉันเปลี่ยนมันความสูงและความกว้างฉันต้องเปลี่ยนมันในโค้ดด้วย

ฉันพยายามรับความสูงและความกว้างของ ImageView แต่กลับ 0 ให้ฉันในทั้งสองกรณี

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

สิ่งนี้ส่งคืนฉัน 0 แม้ว่าจะมีความสูงและความกว้างเริ่มต้น


«เนื่องจากฉันไม่ต้องการให้ค่าเริ่มต้นเพราะเมื่อใดที่ฉันเปลี่ยนความสูงและความกว้างฉันต้องเปลี่ยนเป็นรหัส» - อันไหนที่สามารถเปลี่ยนได้ มุมมองภาพหรือภาพที่เก็บไว้?
Pedro Loureiro

คุณใช้android:scaleType="centerInside"ไม่ได้เหรอ
bigstones

2
@nightcracker: นั่นไม่ใช่ ASCII
Joey

7
@ Јοеуเมื่อฉันพูดว่า "ASCII" ฉันหมายถึง "ASCII art" ซึ่งรวมศิลปะมากกว่าที่ประกอบด้วยชุดอักขระ ASCII เท่านั้น
orlp

1
นี่ไม่ได้ตอบคำถามโดยตรง แต่ถ้าคุณสงสัยว่าทำไม getHeight () / getWidth () ถึงกลับ 0 พวกเขาจะกลับ 0 เสมอถ้าคุณเรียกวิธีการเหล่านั้นก่อนที่จะมีการ "ดึง" มุมมองนั้นคือถ้าคุณ เรียกวิธีการเหล่านี้ใน onCreate () มันจะกลับ 0
audiojared

คำตอบ:


222

คำตอบของฉันสำหรับคำถามนี้อาจช่วยให้คุณ:

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

จากนั้นคุณสามารถเพิ่มการปรับขนาดภาพของคุณได้จากภายในวิธีการ onPreDraw ()


8
พี่ชายของโค้ดที่ดีมากและตรรกะ +1 สำหรับสิ่งนั้น คุณสามารถทำได้โดยการตั้งค่าคุณสมบัติ ImageView android: adjustViewBounds = "true" เป็น true :)
AZ_

เฮ้ แต่ในขณะที่ตัวชี้การดีบักไม่ไป minside onPreDraw () ทำไมถึงเป็นเช่นนั้น?
Geetanjali

3
ฉันคิดว่าคุณต้องเพิ่ม vto.removeOnPreDrawListener (นี่); เข้าไปด้านใน onPreDraw ()
sagus_helgy

1
@ KK_07 ดูการแก้ไขตามความคิดเห็นของผู้ประสบภัย เพียงแค่ต้องลบผู้ฟังหลังจากคุณทำเสร็จแล้ว
Kevin Coppock

6
คุณจะกำหนดค่าให้กับขั้นสุดท้ายอย่างไรความสูงและสุดท้ายความกว้างภายในชั้นในโดยไม่ทำให้สุดท้าย
คริส

29

ฉันเพิ่งตั้งค่าคุณสมบัตินี้และตอนนี้ Android OS ดูแลทุกอย่าง

หุ่นยนต์: adjustViewBounds = "true"

ใช้สิ่งนี้ใน layout.xml ของคุณซึ่งคุณได้ปลูก ImageView: D


4
@ jww ฉันไม่ได้ตอบผู้ลงคะแนนติดลบ: p, อ่านครั้งแรกเกี่ยวกับ getWidth และ getMeasured ในเอกสาร Android จากนั้นก็ลงคะแนนโหวตคน
AZ_

27

ฉันสามารถรับความกว้างและความสูงของภาพได้ด้วยการวาดได้

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

14

เหตุผลที่ขนาดภาพของ ImageView เป็น 0 คือเมื่อคุณทำการสอบถามมุมมองดังกล่าวยังไม่ได้ดำเนินการตามขั้นตอนของเค้าโครงและการวัด คุณเพียงแค่บอกมุมมองว่าจะ "ประพฤติ" อย่างไรในการจัดวาง แต่ก็ยังไม่ได้คำนวณว่าจะให้มุมมองแต่ละมุมมองไปที่ใด

คุณตัดสินใจขนาดที่จะให้กับมุมมองภาพได้อย่างไร? คุณไม่สามารถใช้หนึ่งในตัวเลือกการปรับขนาดที่ใช้งานตามปกติได้หรือไม่


ฉันได้กำหนดความสูงและความกว้างเริ่มต้นให้กับ ImageView แล้ว แต่เมื่อฉันลองรับพวกมันด้วยโค้ดมันจะคืนค่า 0 ให้ฉันฉันคิดว่าฉันต้องขยาย ImageView ก่อน แต่ทำอย่างไร
AZ_

ฉันพูดถึงเรื่องนี้ในคำตอบของฉัน อ่านอีกครั้ง :) ฉันคิดว่ามุมมองของคุณสูงเกินจริงไปแล้ว เห็นไหม หากคุณสามารถทำได้ก็ขยายตัว
Pedro Loureiro

13

โพสต์ไปยังเธรด UI ใช้งานได้สำหรับฉัน

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

            }
});

มีประโยชน์จริง ๆ !
Xavi Jimenez

ไม่ถูกต้อง. การค้นหาความกว้างและความสูงจาก UI ไม่รับประกันว่าค่าเหล่านั้นจะพร้อมใช้งาน อัตราเงินเฟ้อมุมมองเพิ่งจะเสร็จสิ้นในตัวอย่างของคุณ แต่อาจเป็นอย่างอื่น
rommex

6

ไฟล์ xml ของคุณ:

 <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 ของคุณ:

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

5

ฉันคิดว่าคุณสามารถปล่อยให้ระบบปฏิบัติการ Android ดูแลคุณได้ ตั้งค่าประเภทสเกลบน ImageView เป็นfitXYและรูปภาพที่แสดงจะถูกปรับขนาดให้พอดีกับขนาดปัจจุบันของมุมมอง

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

4

วิธีที่ง่ายที่สุดคือการรับความกว้างและความสูงของ ImageView ในวิธีการของ Windows การเปลี่ยนแปลงโฟกัสของกิจกรรม

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

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

}

1
onWindowFocusChanged ทำงานเพียง API18 และมากกว่าและมันไม่สามารถเป็นวิธีที่ดีที่สุด ... แต่ขอบคุณ
Milad GH

1

หากคุณสร้างภาพหลายภาพแบบไดนามิกกว่าลองภาพนี้:

// เริ่มต้นอาร์เรย์ภาพของคุณ

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

// สร้างโดยทางโปรแกรมและเพิ่มในมุมมองพาเรนต์

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

// แค่นั้นแหละ. Happy Coding


-2

เพื่อนของฉันโดยคุณนี้จะไม่ได้รับความสูงของภาพที่เก็บไว้ใน db.but แต่คุณจะได้รับความสูงของมุมมองสำหรับความสูงของภาพที่คุณต้องสร้างบิตแมปจาก db, s image.and กว่าคุณสามารถดึงความสูงและความกว้างของ imageview


2
ฉันรู้จักความสูงและความกว้างของภาพ แต่ฉันต้องการทราบความสูงและความกว้างของ ImageView เพื่อที่ฉันจะสามารถปรับขนาดได้ตามความเหมาะสม ฉันหวังว่าคุณจะได้รับคะแนนของฉัน
AZ_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.