ปรับขนาดภาพให้เต็มความกว้างและความสูงคงที่ด้วย Picasso


164

ฉันมี LinearLayout แนวตั้งที่รายการใดรายการหนึ่งImageViewถูกโหลดโดยใช้ Picasso ฉันต้องเพิ่มความกว้างของภาพเป็นความกว้างของอุปกรณ์แบบเต็มและเพื่อแสดงส่วนตรงกลางของภาพที่ถูกครอบตัดด้วยความสูงคงที่ (150dp) ฉันมีรหัสต่อไปนี้:

Picasso.with(getActivity()) 
    .load(imageUrl) 
    .placeholder(R.drawable.placeholder) 
    .error(R.drawable.error) 
    .resize(screenWidth, imageHeight)
    .centerInside() 
    .into(imageView);

ฉันควรใส่ค่าใดscreenWidthและimageHeight(= 150dp)

คำตอบ:


486

คุณกำลังมองหา:

.fit().centerCrop()

ความหมายเหล่านี้:

  • fit- รอจนกว่าจะImageViewมีการวัดและปรับขนาดภาพให้ตรงกับขนาดของมัน
  • centerCrop- ปรับขนาดภาพเพื่อให้ได้สัดส่วนภาพที่กว้างขึ้นจนเต็มขนาด ครอบตัดทั้งด้านบนและด้านล่างหรือซ้ายและขวาเพื่อให้ตรงกับขนาดที่แน่นอน

5
สิ่งที่ควรเป็นความสูงของภาพดู? ฉันไม่ต้องการความสูงคงที่สำหรับ imageView ของฉัน ควรเปลี่ยนตามความสูงของภาพ
Chetna

4
.fit().centerInside()ทำงานสำหรับฉันที่เพิ่งใช้.centerInside()ถูกกระแทกกับCenter inside requires calling resize with positive width and height.ข้อผิดพลาด
Rock Lee

@ Rock Lee คุณต้องปรับขนาด: '. load (url) .resize (targetWidth, targetHeight)' .........
FRK

8
.fit().centerCrop()หรือ.fit().centerInside()ไม่ทำงาน imageViewภาพจะไม่โหลดใน ไม่มี.fit()ภาพกำลังโหลดดี ฉันไม่ได้ใช้.resize()ทั้งสองกรณี
Nishant Bhakta

วิธีปรับขนาดโดยไม่ต้องครอบตัดจากด้านใดด้านหนึ่งและยังรักษามุมมอง
Rohit Sharma

1

ในบางกรณีความพอดี () ไม่มีประโยชน์ ก่อนที่คุณจะต้องรอให้การวัดความกว้างและความสูงสิ้นสุด เพื่อให้คุณสามารถใช้ globallayoutlistener ตัวอย่างเช่น;

imageView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                Picasso.with(getActivity())
                        .load(imageUrl)
                        .placeholder(R.drawable.placeholder)
                        .error(R.drawable.error)
                        .resize(screenWidth, imageHeight)
                        .fit
                        .centerInside()
                        .into(imageView);
                imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.