มุมมองภาพ Android ไม่เคารพ maxWidth?


113

ดังนั้นฉันจึงมีมุมมองภาพที่ควรแสดงภาพโดยพลการรูปโปรไฟล์ที่ดาวน์โหลดจากอินเทอร์เน็ต ฉันต้องการให้ ImageView นี้ปรับขนาดภาพให้พอดีกับความสูงของคอนเทนเนอร์หลักและตั้งค่าความกว้างสูงสุด 60dip อย่างไรก็ตามหากรูปภาพมีอัตราส่วนที่ชาญฉลาดและไม่จำเป็นต้องมีความกว้างเต็ม 60dip ความกว้างของ ImageView ควรลดลงเพื่อให้พื้นหลังของมุมมองพอดีกับภาพ

ฉันลองแล้ว

<ImageView android:id="@+id/menu_profile_picture"
    android:layout_width="wrap_content"
    android:maxWidth="60dip"
    android:layout_height="fill_parent"
    android:layout_marginLeft="2dip"
    android:padding="4dip"
    android:scaleType="centerInside"
    android:background="@drawable/menubar_button"
    android:layout_centerVertical="true"/>

แต่นั่นทำให้ ImageView มีขนาดใหญ่มากด้วยเหตุผลบางประการอาจใช้ความกว้างภายในของรูปภาพและ wrap_content เพื่อตั้งค่า - อย่างไรก็ตามมันไม่ได้เป็นไปตามแอตทริบิวต์ maxWidth ของฉัน .. มันใช้ได้เฉพาะในคอนเทนเนอร์บางประเภทหรือไม่ มันอยู่ใน LinearLayout ...

ข้อเสนอแนะใด ๆ ?

คำตอบ:


303

อา,

android:adjustViewBounds="true"

จำเป็นสำหรับ maxWidth ในการทำงาน

ใช้งานได้แล้ว!


ขอบคุณสำหรับการแบ่งปันคุณช่วยทำเครื่องหมายคำตอบของคุณว่าถูกต้องได้ไหม!?
WarrenFaith

1
ขอบคุณมาก .. ทำงานได้ดีสำหรับฉัน :)
Nirav Dangi

7
และทางโปรแกรม: imageView.setAdjustViewBounds (จริง);
Cyril Jacquart

7
สำหรับใครก็ตามที่พบว่าการค้นหานี้ใช้ไม่ได้โปรดตรวจสอบว่าไม่ได้ตั้งค่าความกว้าง / ความสูงเป็น match_parent
Kevin Worth

และที่นี่ฉันได้ขโมย ImageView ภายในพิเศษของ AOSP ที่ถูกสร้างขึ้นเพื่อเคารพขอบเขตเหล่านี้
TheWanderer

4

การตั้งค่าadjustViewBoundsไม่ได้ช่วยถ้าคุณใช้match_parentแต่วิธีแก้ปัญหาคือกำหนดเองง่ายๆImageView:


public class LimitedWidthImageView extends ImageView {
    public LimitedWidthImageView(Context context) {
        super(context);
    }

    public LimitedWidthImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LimitedWidthImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int specWidth = MeasureSpec.getSize(widthMeasureSpec);
        int maxWidth = getMaxWidth();
        if (specWidth > maxWidth) {
            widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth,
                    MeasureSpec.getMode(widthMeasureSpec));
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

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