Padding ไม่มีผลกับ <shape> ในเค้าโครง XML


93

ฉันกำลังพยายามตั้งค่าช่องว่างในการ<shape>ประกาศภายในไฟล์ / เค้าโครง XML แต่สิ่งที่ฉันตั้งไว้ไม่มีอะไรเปลี่ยนแปลงที่เกี่ยวข้องกับการขยาย หากฉันแก้ไขคุณสมบัติอื่น ๆ ฉันจะเห็นผลกระทบบน UI แต่ใช้ไม่ได้กับช่องว่างภายใน โปรดให้คำแนะนำเกี่ยวกับสาเหตุที่อาจเกิดขึ้นได้หรือไม่?

นี่คือ XML Shape ที่ฉันพยายามจัดสไตล์:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" 
      android:shape="rectangle">

    <stroke android:width="1dp" 
            android:color="#ffffff" 
            android:dashWidth="2dp"/>

    <solid android:color="@color/button_white_cover"/>

    <corners android:radius="11dp"/>

    <padding android:left="1dp" 
             android:top="20dp"
             android:right="20dp" 
             android:bottom="2dp"/>
 </shape>

คำตอบ:


113

ในที่สุดฉันก็ได้แก้ไขปัญหาเกี่ยวกับช่องว่างภายในแล้ว

ดังนั้นการเว้นช่องว่างตรงนี้จะไม่มีผลต่อรูปร่าง แทนที่จะใช้วิธีนี้คุณจะต้องใช้ช่องว่างในช่องว่างอื่น ๆ ที่จะใช้งานได้ ดังนั้นฉันมี drawable ที่ใช้รูปร่างและฉันทำสิ่งต่อไปนี้:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/shape_below"/>
   <item android:top="10px" android:right="10px" android:drawable="@drawable/shape_cover"/>
</layer-list>

ดังที่คุณเห็นใน<item>องค์ประกอบที่สองที่ฉันตั้งค่าช่องว่างภายใน (บนและขวา) และหลังจากนี้ทุกอย่างก็ใช้ได้

ขอบคุณ.


สวัสดีฉันไม่เข้าใจวิธีใช้วิธีแก้ปัญหานี้ ฉันมีปุ่มที่ใช้รูปร่างและการตั้งค่า adnroid: top และ android: right ไม่มีผล ฉันจะแก้ปัญหานี้อย่างไร ขอบคุณ.
icecream

2
ฉันคิดว่าสิ่งที่ Lyubomyr พูดคือการทำอะไรแบบนี้ซึ่งเหมาะกับฉัน แต่มุมนั้นมักจะมีพื้นหลังสีขาวขุ่นทำให้เกิดปัญหาในการแสดงผล (ขออภัยสำหรับรูปแบบในความคิดเห็น!): <layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item> <shape android: shape =" rectangle "> <size android: width =" 0dp "android: height =" 45dp "android: color =" @ android: color / transparent "/> </shape></item> <item android: top =" 0dp "android: right =" 0dp "android: bottom =" 0dp "android: left =" 0dp "android: drawable =" @ drawable / button_blue_shape "/> </layer-list>
DustinB

นอกหัวข้อด้วย แต่อาจมีประโยชน์: หากคุณใช้ drawable เป็นเพียงสีคุณสามารถเขียนเช่น android: drawable = "@ color / divider" ได้เช่นกัน แต่สิ่งนี้จะหยุดพักบนอุปกรณ์รุ่นเก่า ฉันทดสอบบน 2.2 และมันเสีย ไม่แน่ใจว่าระดับใดที่ยอมรับได้
Pijusn

อันที่จริง<item>ยอมรับสิ่งที่วาดได้สำหรับเด็ก (แม้ว่าจะไม่ได้มีการบันทึกไว้อย่างชัดเจน) นั่นคือวิธีที่คุณสามารถบรรลุพฤติกรรมนี้ได้ภายใน xml เดียว
Alex Cohn

3
คำตอบนี้ดูเหมือนจะถูกต้องแม้กระทั่งเจ็ดปีต่อมา มีไว้<shape><padding> เพื่ออะไร?
David Lord

75

ตามที่มีความคิดเห็นสองสามข้อกล่าวถึงแนวทางที่ดีที่สุดคือ<shape>การรวม<item>องค์ประกอบและตั้งค่าช่องว่างภายในแทน อย่างไรก็ตามมีตัวเลือกอื่น ๆ ตามรายละเอียดในลิงค์ด้านล่าง เช่น

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="8dp"
        android:right="8dp"
        android:top="8dp"
        android:bottom="8dp">

        <shape android:shape="rectangle">
            ...
        </shape>
    </item>
</layer-list>

ขึ้นอยู่กับความต้องการของคุณแทนที่จะใช้ Layer-list คุณสามารถใช้ประเภท drawable ต่อไปนี้:

  • รายการเลเยอร์
  • ตัวเลือก
  • ระดับรายการ
  • การเปลี่ยนแปลง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับประเภท drawable ที่มีให้ดูเอกสาร Android นี้

แหล่งที่มา:


ใช่คุณไม่ได้กล่าวถึง<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924

@ user924 ฉันไม่แน่ใจว่าประเด็นของคุณคืออะไร หนึ่งสามารถรวมรายการไว้ใน <layer-list> หากสิ่งนั้นตอบสนองวัตถุประสงค์ของตน แต่ไม่จำเป็นสำหรับคำถามเดิมหรือสำหรับการถ่ายทอดวิธีการแก้ปัญหาทั่วไปซึ่งก็คือการซ้อนเนื้อหาภายใน <item> ด้วยช่องว่างภายใน
TheIT

3
ฉันหมายความว่าจะเป็นการดีกว่าที่จะให้ตัวอย่างที่คุณสามารถคัดลอกและเรียกใช้โดยไม่มีรุ่น แต่ในกรณีนี้ <item> จะไม่ได้รับการแก้ไข (เพราะควรอยู่ใน <layer-list>)
user924

2
@ user924 ฉันเข้าใจความหมายของคุณแล้วขอบคุณมากที่ชี้ให้เห็นปัญหาและช่วยปรับปรุงคำตอบ ฉันได้อัปเดตตัวอย่างโค้ดและเพิ่มความคิดเห็นเกี่ยวกับประเภทที่วาดได้
TheIT

23

คำตอบของ Lyobomyr ใช้งานได้ แต่นี่เป็นวิธีแก้ปัญหาเดียวกันที่ใช้ แต่ไม่มีค่าใช้จ่ายในการสร้างไฟล์ที่ดึงได้ใหม่ดังนั้นจึงลดความยุ่งเหยิงของไฟล์ให้น้อยที่สุด:

https://stackoverflow.com/a/3588976/578746

คัดลอก / วาง anwser โดย anon ในคำตอบ SO ด้านบน:

<item android:left="6dp"
      android:right="6dp">

    <shape android:shape="rectangle">
        <gradient android:startColor="#ccd0d3"
                  android:centerColor="#b6babd"
                  android:endColor="#ccd0d3"
                  android:height="1px"
                  android:angle="0"/>
    </shape>
</item>


1
ขอบคุณสำหรับคำตอบนี้ Yahel แต่อย่าลืมโพสต์ลิงก์คำตอบเท่านั้น ให้ข้อมูลที่จำเป็นทั้งหมดในคำตอบของคุณเสมอเนื่องจากเนื้อหาลิงก์อาจเปลี่ยนแปลงหรือไม่ถูกต้อง
TheIT

แก้ไขคำตอบ
Yahel

22

คุณสามารถลองสิ่งที่ใส่เข้าไป:

<?xml version="1.0" encoding="UTF-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="2dp"
    android:insetLeft="1dp"
    android:insetRight="20dp"
    android:insetTop="20dp">

    <shape android:shape="rectangle">

        <stroke
            android:width="1dp"
            android:color="#ffffff"
            android:dashWidth="2dp" />

        <solid android:color="@color/button_white_cover" />

        <corners android:radius="11dp" />
    </shape>

</inset>

9

ฉันแก้ไขปัญหานี้ดังนี้:

<shape android:shape="oval"  >
    <stroke android:width="4dp" android:color="@android:color/transparent" />
    <solid android:color="@color/colorAccent" />
</shape>

เพียงแค่เพิ่มเส้นขีดที่โปร่งใสลงไป


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