ฉันค้นหารอบ ๆ แต่ไม่พบวิธีที่เหมาะสมในการดำเนินการนี้ ฉันต้องการให้เอฟเฟกต์เงาต่อไปนี้ในมุมมองของฉัน:
บอกตามตรงฉันไม่รู้ว่าวินาทีนี้ทำโดยใช้เอฟเฟกต์เงาหรือไม่ ความคิดใด ๆ ?
คำตอบ:
ฉันรู้ว่าคำถามนี้ได้รับคำตอบแล้ว แต่ฉันต้องการให้คุณรู้ว่าฉันพบว่าdrawable
ในAndroid Studio
นั้นคล้ายกับรูปภาพที่คุณมีในคำถามมาก: ลองดูสิ่งนี้:
android:background="@drawable/abc_menu_dropdown_panel_holo_light"
ดูเหมือนว่า:
หวังว่าจะเป็นประโยชน์
แก้ไข
ตัวเลือกด้านบนมีไว้สำหรับเวอร์ชันเก่าAndroid Studio
ดังนั้นคุณอาจไม่พบ สำหรับเวอร์ชันที่ใหม่กว่า:
android:background="@android:drawable/dialog_holo_light_frame"
ยิ่งไปกว่านั้นหากคุณต้องการมีรูปร่างที่กำหนดเองฉันขอแนะนำให้ใช้ซอฟต์แวร์วาดภาพเหมือนPhotoshop
และวาดมัน
อย่าลืมที่จะบันทึกเป็น.9.png
ไฟล์ (ตัวอย่าง: my_background.9.png
)
อ่านเอกสาร: วาด 9-patch
แก้ไข 2
วิธีแก้ปัญหาที่ดีกว่าและทำงานยากน้อยกว่าคือการใช้CardView
และตั้งค่าapp:cardPreventCornerOverlap="false"
เพื่อป้องกันไม่ให้มุมมองซ้อนทับเส้นขอบ:
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="2dp"
app:cardElevation="2dp"
app:cardPreventCornerOverlap="false"
app:contentPadding="0dp">
<!-- your layout stuff here -->
</android.support.v7.widget.CardView>
ตรวจสอบให้แน่ใจว่าได้รวมเวอร์ชันล่าสุดไว้ในเวอร์ชันbuild.gradle
ปัจจุบันแล้ว
compile 'com.android.support:cardview-v7:26.0.0'
/<sdk-path>/extras/android/support
เท่านั้น
cardView
ฉันใช้ Android Studio 0.8.6 และไม่พบ:
android:background="@drawable/abc_menu_dropdown_panel_holo_light"
ดังนั้นฉันจึงพบสิ่งนี้แทน:
android:background="@android:drawable/dialog_holo_light_frame"
และดูเหมือนว่า:
การวางพื้นหลัง@android:drawable/dialog_holo_light_frame
ให้เงา แต่คุณไม่สามารถเปลี่ยนสีพื้นหลังหรือรูปแบบเส้นขอบได้ดังนั้นจึงเป็นการดีกว่าที่จะได้รับประโยชน์จากเงาของมันในขณะที่ยังสามารถใส่พื้นหลังผ่านรายการเลเยอร์
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--the shadow comes from here-->
<item
android:bottom="0dp"
android:drawable="@android:drawable/dialog_holo_light_frame"
android:left="0dp"
android:right="0dp"
android:top="0dp">
</item>
<item
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp">
<!--whatever you want in the background, here i preferred solid white -->
<shape android:shape="rectangle">
<solid android:color="@android:color/white" />
</shape>
</item>
</layer-list>
บันทึกไว้ในโฟลเดอร์ drawable ภายใต้พูด shadow.xml
เพื่อกำหนดให้กับมุมมองในไฟล์เลย์เอาต์ xml จะตั้งค่าพื้นหลังของมัน
android:background="@drawable/shadow"
สร้าง card_background.xml ในโฟลเดอร์ res / drawable ด้วยรหัสต่อไปนี้:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#BDBDBD"/>
<corners android:radius="5dp"/>
</shape>
</item>
<item
android:left="0dp"
android:right="0dp"
android:top="0dp"
android:bottom="2dp">
<shape android:shape="rectangle">
<solid android:color="#ffffff"/>
<corners android:radius="5dp"/>
</shape>
</item>
</layer-list>
จากนั้นเพิ่มรหัสต่อไปนี้ในองค์ประกอบที่คุณต้องการให้เค้าโครงการ์ด
android:background="@drawable/card_background"
บรรทัดต่อไปนี้กำหนดสีของเงาสำหรับการ์ด
<solid android:color="#BDBDBD"/>
CardViewให้เงาที่แท้จริงแก่คุณใน Android 5+ และมีไลบรารีสนับสนุน เพียงปิดมุมมองของคุณด้วยเท่านี้ก็เสร็จแล้ว
<android.support.v7.widget.CardView>
<MyLayout>
</android.support.v7.widget.CardView>
มันต้องการการพึ่งพาครั้งต่อไป
dependencies {
...
compile 'com.android.support:cardview-v7:21.0.+'
}
CardView
ระดับเงาที่แตกต่างกันสำหรับระดับความสูงต่างๆในโหมดความเข้ากัน
ใช้คุณสมบัติการยกระดับเพื่อให้ได้เงาที่ส่งผลต่อ:
<View ...
android:elevation="2dp"/>
ใช้สำหรับ v21 ที่ผ่านมาเท่านั้นโปรดดูที่ลิงค์นี้: http://developer.android.com/training/material/shadows-clipping.html
อาจจะสายไป แต่สำหรับผู้ที่ยังคงมองหาคำตอบสำหรับสิ่งนี้ฉันพบโครงการบน git hub และนี่เป็นโครงการเดียวที่ตรงกับความต้องการของฉันจริงๆ android-materialshadowninepatch
เพียงเพิ่มบรรทัดนี้ในการพึ่งพา build.gradle ของคุณ
compile 'com.h6ah4i.android.materialshadowninepatch:materialshadowninepatch:0.6.3'
ไชโย ยกนิ้วให้ผู้สร้าง! มีความสุข
ฉันรู้ว่านี่เป็นการแฮ็กอย่างโง่เขลา
แต่ถ้าคุณต้องการสนับสนุนภายใต้ v21 นี่คือความสำเร็จของฉัน
rectangle_with_10dp_radius_white_bg_and_shadow.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Shadow layers -->
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_1" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_2" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_3" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_4" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_5" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_6" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_7" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_8" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_9" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_10" />
</shape>
</item>
<!-- Background layer -->
<item>
<shape>
<solid android:color="@android:color/white" />
<corners android:radius="10dp" />
</shape>
</item>
</layer-list>
rectangle_with_10dp_radius_white_bg_and_shadow.xml (v21)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/white" />
<corners android:radius="10dp" />
</shape>
view_incoming.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rectangle_with_10dp_radius_white_bg_and_shadow"
android:elevation="7dp"
android:gravity="center"
android:minWidth="240dp"
android:minHeight="240dp"
android:orientation="horizontal"
android:padding="16dp"
tools:targetApi="lollipop">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Hello World !" />
</LinearLayout>
นี่คือผลลัพธ์:
ภายใต้ v21 (นี่คือสิ่งที่คุณสร้างด้วย xml)
สูงกว่า v21 (การแสดงผลระดับความสูงจริง)
หากคุณต้องการใช้เงาอย่างถูกต้องคุณต้องทำสิ่งต่อไปนี้
พิจารณามุมมองนี้ซึ่งกำหนดด้วยพื้นหลังที่วาดได้:
<TextView
android:id="@+id/myview"
...
android:elevation="2dp"
android:background="@drawable/myrect" />
พื้นหลังที่วาดได้ถูกกำหนดให้เป็นสี่เหลี่ยมผืนผ้าที่มีมุมโค้งมน:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#42000000" />
<corners android:radius="5dp" />
</shape>
นี่เป็นวิธีที่แนะนำในการใช้เงาลองดูที่https://developer.android.com/training/material/shadows-clipping.html#Shadows
ใช้คุณสมบัติการยกระดับเพื่อให้เงามีผล:
<YourView
...
android:elevation="3dp"/>
สร้างพื้นหลังที่วาดได้เช่นนี้เพื่อแสดงเงาโค้งมน
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Drop Shadow Stack -->
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#00CCCCCC" />
</shape>
</item>
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#10CCCCCC" />
</shape>
</item>
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#20d5d5d5" />
</shape>
</item>
<item>
<shape>
<corners android:radius="6dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#30cbcbcb" />
</shape>
</item>
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#50bababa" />
</shape>
</item>
<!-- Background -->
<item>
<shape>
<solid android:color="@color/gray_100" />
<corners android:radius="4dp" />
</shape>
</item>
</layer-list>
คำถามนี้อาจจะเก่า แต่สำหรับใครก็ตามในอนาคตที่ต้องการวิธีง่ายๆในการบรรลุเอฟเฟกต์เงาที่ซับซ้อนลองดูห้องสมุดของฉันที่นี่ https://github.com/BluRe-CN/ComplexView
การใช้ไลบรารีคุณสามารถเปลี่ยนสีเงาปรับแต่งขอบและอื่น ๆ อีกมากมาย นี่คือตัวอย่างเพื่อบรรลุสิ่งที่คุณต้องการ
<com.blure.complexview.ComplexView
android:layout_width="400dp"
android:layout_height="600dp"
app:radius="10dp"
app:shadow="true"
app:shadowSpread="2">
<com.blure.complexview.ComplexView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:color="#fdfcfc"
app:radius="10dp" />
</com.blure.complexview.ComplexView>
หากต้องการเปลี่ยนสีเงาให้ใช้ app: shadowColor = "your color code"
ใช้รูปร่างนี้เป็นพื้นหลัง:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:drawable/dialog_holo_light_frame"/>
<item>
<shape android:shape="rectangle">
<corners android:radius="1dp" />
<solid android:color="@color/gray_200" />
</shape>
</item>
</layer-list>