การขยายที่ไม่ต้องการรอบ ImageView


142

ฉันต้องรวมกราฟิกส่วนหัวในทุกกิจกรรม / มุมมองของฉัน ไฟล์ที่มีส่วนหัวเรียกว่า header.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content"
  android:background="#0000FF" 
  android:padding="0dip">

  <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/header"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="0dip"
    android:layout_marginTop="0dip"
    android:layout_marginBottom="0dip"
    android:padding="0dip"
    android:paddingTop="0dip"
    android:paddingBottom="0dip"
    android:layout_gravity="fill"
    android:background="#00FF00"
    />
</FrameLayout>

สังเกตandroid:background="#00FF00"(สีเขียว) มันเป็นเพียงจุดประสงค์ในการสร้างภาพ

ฉันรวมไว้ในมุมมองของฉันเช่นนี้:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  style="@style/white_background">

  <include layout="@layout/header" />
  (...)

ดังนั้นเมื่อฉันลองใช้จริงผลที่ได้จะเป็นรูปซ้ายแทนที่จะเป็นรูป (ขวา):

สังเกตชายแดนสีเขียว

(1) ส่วนนี้ - สีส้ม - ส่วนที่เป็นรูปภาพ / ImageView ในคำถาม
(2) ขอบสีเขียวที่ไม่ได้รับการแก้ไข หมายเหตุ: ตามปกติพื้นที่สีเขียวจะมีความโปร่งใส - backgroundมันสีเขียวเพียงเพราะผมตั้ง

สังเกตกรอบสีเขียวรอบ ๆ รูปภาพที่ด้านบน มันเป็นส่วนหนึ่งของ ImageView และฉันไม่สามารถเข้าใจได้ว่าทำไมมันถึงอยู่ที่นั่นหรือฉันจะกำจัดมันได้อย่างไร มันตั้งค่าการเติมเต็มและระยะขอบทั้งหมดเป็น 0 (แต่ผลลัพธ์จะเหมือนกันเมื่อฉันละเว้น) ภาพเป็น 480x64px jpeg * และฉันวางไว้ใน res / drawable (ไม่ใช่ในอย่างใดอย่างหนึ่งdrawable-Xdpi)

(* jpeg เพราะดูเหมือนว่าฉันเจอปัญหา png gamma เก่า - ตอนแรกฉันแก้ปัญหาด้วยการทำให้เส้นขอบสีเขียวเป็นสีส้มเหมือนภาพและสีไม่ตรงกัน)

ฉันลองใช้กับ htc desire / 2.2 / Build 2.33.163.1 และจำลอง ฉันอธิบายปัญหาให้กับใครบางคนใน # android-dev; เธอสามารถสร้างปัญหาขึ้นมาใหม่ได้ แต่ก็ไม่มีคำอธิบายเช่นกัน เป้าหมายการสร้างคือ 1.6

update @tehgoose: รหัสนี้ให้ผลลัพธ์ด้านบน + ล่างที่เหมือนกันทั้งหมด

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  style="@style/white_background">

  <!-- <include layout="@layout/header" />  -->

  <ImageView
    android:src="@drawable/header"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#00FF00"
    android:layout_weight="0"
    />

  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dip"
    android:layout_weight="1">

    (... rest of the elements)

  </LinearLayout>
</LinearLayout>

ส่วนต่างติดลบและ / หรือค่าandroid:layout_margin="-10dp"android:padding="-10dp"
แพ็ดดิง

คำตอบ:


442

ในที่สุด!

<ImageView
  (...)
  android:adjustViewBounds="true" />

adjustViewbounds แอตทริบิวต์ได้เคล็ดลับ:

ตั้งค่านี้เป็นจริงหากคุณต้องการให้ ImageView ปรับขอบเขตเพื่อรักษาอัตราส่วนกว้างยาวของ drawable

i stumbled เมื่อได้ที่นี่ ขอบคุณสำหรับความช่วยเหลือของคุณ!


7
ฉันมีปัญหาเดียวกัน แต่วิธีนี้ไม่มีผล
Marty Miller

4
ว้าว ... หากไม่มีแอตทริบิวต์นั้นจะมีการเพิ่มช่องว่างที่ไม่ต้องการขึ้นอยู่กับความหนาแน่นของหน้าจอดังนั้นจึงเกิดขึ้นกับอุปกรณ์บางอย่างเท่านั้น มันทำให้ฉันถั่วเพราะภาพดูดีในอุปกรณ์ทั้งหมดที่ฉันเป็นเจ้าของแล้วเมื่อฉันลองบนอุปกรณ์ของเพื่อนมันดูเหมือนอึ ขอบคุณ.
DiscDev

ขอบคุณพระเจ้าฉันเปลี่ยน atempt ครั้งแรกของฉันจากการพยายามที่จะแก้ปัญหาข้อผิดพลาดเพื่อหาสิ่งที่ weard ของ Android ฉันเชื่อว่าปัญหานี้เริ่มต้นขึ้นในผู้ผลิตบางรายที่เปลี่ยนสิ่งต่าง ๆ จาก Android และจากนั้นพวกเขาต้องวางคุณสมบัติเพื่อแก้ปัญหาในรุ่นถัดไป
Ratata Tata

น่าเศร้าที่นี่ใช้ไม่ได้กับ apis ที่ต่ำกว่า, api 16 & 17 เป็นอย่างน้อย
แพ้

1
ว้าวนี่คือสิ่งที่ฉันกำลังมองหาฉันกำลังเกาหัวฉันสักสองสามชั่วโมงแม้จะพยายามทำให้เค้าโครงของฉันเป็นโมฆะและตั้งความสูง / ความกว้างของภาพ โซลูชันที่เรียบง่ายดังกล่าวทำงานได้อย่างสมบูรณ์แบบโดยไม่ต้องใช้ scaleType
CodyEngel

39
android:scaleType="fitXY"

มันใช้งานได้สำหรับฉัน


3
scaleType="fitXY"ทำสิ่งที่แตกต่างแม้ว่า: เปลี่ยนอัตราส่วนภาพของภาพที่นำไปสู่การบิดเบือน สิ่งนี้อาจยอมรับได้ในบางครั้งเช่นสำหรับภาพพื้นหลังที่เป็นนามธรรม
stefs

1
ฉันควบคุมอัตราส่วนโดยใช้ Android: ความกว้างและ Android: ความสูงและ scaleType = "fitXY" ไม่ได้เติม imageView ให้ฉันด้วยอัตราส่วนภาพที่ต้องการนั่นเป็นประสบการณ์ของฉันอย่างน้อย ขอบคุณสำหรับข้อมูลของคุณ
Badr

มันใช้งานได้ แต่ภาพนั้นไม่เรียบร้อยไม่สมดุลถูกตัดออกมา
59

1
ไม่ใช่เฉพาะ Android เท่านั้น: scaleType = "fitEnd" ทำงานเหมือนเวทมนต์
The บรรณารักษ์

ฉันพบการผสมผสานandroid:adjustViewBounds="true"และandroid:scaleType="fitXY"เป็นสิ่งที่ฉันต้องการเพื่อจัดแนว ImageViews ในเลย์เอาต์ของฉัน ภาพที่ถูกปิดโดยพิกเซลหรือสอง (ขนาดเล็กมากบนจอแสดงผลความละเอียดสูง) adjustViewBoundsมีเพียง การเพิ่มความscaleTypeน่าจะเป็นการบังคับให้มีการปรับขนาดภาพในขั้นสุดท้ายหลังจากปรับขอบเขตมุมมองแล้วซึ่งจะทำให้ภาพขยายตามขนาดเต็มของขอบเขตใหม่
Jeff Lockhart

3

มันเกี่ยวกับอัตราส่วนภาพ ระบบจะรักษาอัตราส่วนภาพดั้งเดิมของแหล่งภาพไว้ตามค่าเริ่มต้น ซึ่งในกรณีส่วนใหญ่ไม่ตรงกับเค้าโครงหรือส่วนข้อมูลที่ระบุในเค้าโครง ดังนั้น,

  1. เปลี่ยนขนาดของรูปภาพให้พอดีกับเลย์เอาต์ที่ระบุหรือ
  2. ใช้android:scaleTypeเพื่อให้พอดีกับภาพ ตัวอย่างเช่นคุณสามารถระบุandroid:scaleType="fitXY"

3

ช่องว่างภายในเสริมเหล่านี้ถูกสร้างอัตโนมัติเนื่องจากหุ่นยนต์จะพยายามใช้อัตราส่วนภาพดั้งเดิม โปรดลองด้านล่าง

scaletype = "fitCenter"
android:adjustViewBounds="true"
android:layout_height="wrap_content"

0

อาจจะเป็นคุณสามารถให้specific height to imageView say 50dp or 40dpและadjust image to make green borderหายไป

เช่น: android:layout_height="40dp"


การตั้งค่า layout_width = "480px" และ layout_height = "64px" ให้ผลลัพธ์ที่ฉันต้องการ แต่พิกเซลไม่สามารถใช้งานได้จริง ฉันไม่เข้าใจจริงๆว่าวิธีการที่แปลเป็น DP
stefs

คุณควรใช้ dp เช่นเดียวกับที่คุณทำกับพิกเซล นั่นคือทั้งหมดที่พวกเขา; แสดงพิกเซลอิสระ แต่มันได้ผล
Udaykiran

dp / dip หมายถึง Density Independent Pixels; เท่าที่ฉันเข้าใจมันครอบคลุมความหนาแน่นที่แตกต่างกัน แต่ (แน่นอน) ไม่ใช่ขนาดหน้าจอที่แตกต่างกัน สิ่งที่ฉันต้องการก็คือภาพที่จะขยายความกว้างของหน้าจอ 100% และออกจากความสูงเพื่อให้ได้สัดส่วน
stefs

0
android:layout_height="wrap_content"

คุณต้องเปลี่ยนเป็น "fill_parent"

คุณอาจต้องปรับขนาดภาพของคุณด้วยดังนั้นจึงเป็นอัตราส่วนที่เหมาะสมในการเติม framelayout ที่อยู่ในภาพ

ฉันไม่เข้าใจว่าทำไมคุณต้องมีเลย์เอาต์เฟรมเลย หากไม่มีภาพของคุณก็จะเติมเต็มหน้าจอต่อไป

แก้ไข:ใช่ขอโทษ xml คือความสูงของภาพ


1
สิ่งเดียวที่จะเพิ่มคือการที่เขาจะต้องมีความสูงรูปแบบชุดของImageViewมันไม่ได้ดังนั้นเห็นได้ชัดในคำตอบของคุณ :)
ernazm

ฉันลองโดยไม่ใช้เลย์เอาท์โดยรอบเหมือนกันไม่เปลี่ยนแปลงอะไรเลย นอกจากนี้รูปภาพปัจจุบันเป็นเพียงตัวยึดตำแหน่ง - จะมีองค์ประกอบเพิ่มเติมในไม่ช้า (แสดงถึงรูปแบบโดยรอบ) ฉันไม่ต้องการให้ภาพตรงกับหน้าจอฉันต้องการที่นั่นตรงด้านบน
stefs

ตรวจสอบอีกครั้งเพื่อดูว่าภาพของคุณมีพื้นที่ว่างด้านบนและด้านล่าง ถ้าไม่ลองปรับขนาดวัตถุ imageview โดยใช้ android: scaleType = "" ควรมีสิ่งหนึ่งที่เหมาะกับสิ่งที่คุณกำลังมองหา
NotACleverMan


-1

คุณต้องจัดเตรียมรูปร่างรอบ ๆ มุมมองภาพเพื่อให้ดูดีขึ้น

นี่คือสิ่งที่ฉันได้ใช้:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--<gradient android:startColor="#FFFFFF" android:endColor="#969696"

    android:angle="270">
-->
<gradient android:startColor="#FFFFFF" android:endColor="#FFFFFF"

    android:angle="270">
</gradient>
    <stroke android:width="2dp" android:color="@color/graycolor" />
<corners android:radius="2dp" />
<padding android:left="5dp" android:top="5dp" android:right="5dp"
    android:bottom="5dp" />


2
โว้ว! ฉันทำงานกับรูปร่าง (สำหรับพื้นหลังของแท็บ) แต่โดยสุจริตฉันไม่เข้าใจว่าฉันควรนำไปใช้ที่นี่ได้อย่างไร
stefs

@Schnalle: สร้างสองไฟล์ shapes.xml และหนึ่ง selector.xml ใช้ภาพพื้นหลังเป็นไฟล์ selector.xml ในไฟล์ตัวเลือกมีสองสถานะสำหรับสถานะโฟกัส / เลือกและสถานะปกติ
Zoombie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.