Android tuyến tính: Thêm đường viền với bóng xung quanh tuyến tính


147

Tôi muốn tạo cùng một đường viền của linearLayout này làm ví dụ:

nhập mô tả hình ảnh ở đây

Trong ví dụ này, chúng ta có thể thấy rằng đường viền không giống nhau xung quanh linearLayout. Làm cách nào tôi có thể tạo tệp này bằng tệp có thể vẽ XML?

Hiện tại, tôi chỉ có thể tạo một đường viền đơn giản xung quanh linearLayout như thế này:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <corners
      android:radius="1dp"
      android:topRightRadius="0dp"
      android:bottomRightRadius="0dp"
      android:bottomLeftRadius="0dp" />
  <stroke
      android:width="1dp"
      android:color="#E3E3E1" />

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

</shape>

1
bạn có thể sử dụng thuộc backgroundtính cho việc đó ... tạo một tệp XML có hình dạng như hình chữ nhật, màu sắc và hiệu ứng bóng cho nó và đặt nó làm nền cho bố cục tuyến tính của bạn ..
Pragnesh Ghoda

sử dụng đột quỵ cho viền màu xám và hiệu ứng đệm cũng vậy
Pragnesh Ghoda

Tôi nghĩ rằng, hai bố cục xml của nó, giả sử một là bố cục tuyến tính và bên trong là bố cục tương đối có phần đệm
Giru Bhai

Bạn có thể giúp tôi tạo tập tin xml này không?
wawanopoulos

1
Một cách khác có thể là sử dụng hình ảnh vá 9 làm nền cho bố cục của bạn. Điều này sẽ cho phép một bóng mờ thực sự mịn màng (theo thực tế, theo ý kiến ​​của tôi).
Phantômaxx

Câu trả lời:


257

Thử cái này..

<?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="#CABBBBBB"/>
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>

@Hariharan Cảm ơn rất nhiều! tôi đã thử mã của bạn và nó có vẻ ổn. Nhưng, có một điều cần làm, làm thế nào tôi có thể thêm một viền mỏng (1dp) ở bên trái và bên phải của linearlayout? (làm ví dụ)
wawanopoulos

2
@wawanopoulos Chỉ cần thay thế "0dp"bằng "1dp"câu trả lời của Hariharan.
Phantômaxx

bạn có thể thêm màu #EAEAEA vào bố cục chính để nó giống như hình ảnh câu hỏi
Samad

3
Tôi cũng đề nghị cho điều này, bạn có thể sử dụng <gradient>trong của bạn <shape>để tăng cường hiệu ứng viền, và nếu đó thực sự là hiệu ứng mà UI của bạn cần thay vì chỉ viền màu.
patrickjason91

đảm bảo nếu bạn có bố cục bên trong với match_parent thì hãy đặt lề 1 cho bố cục bên trong
Shaktisinh Jadeja

82

Đó là lý do CardView tồn tại. Thẻ xem | Nhà phát triển Android
Đây chỉ là một FrameLayout hỗ trợ độ cao trong các thiết bị tiền kẹo.

<android.support.v7.widget.CardView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:cardUseCompatPadding="true"
    app:cardElevation="4dp"
    app:cardCornerRadius="3dp" >

    <!-- put whatever you want -->

</android.support.v7.widget.CardView>

Để sử dụng điều này, bạn cần thêm phụ thuộc vào build.gradle:

compile 'com.android.support:cardview-v7:23.+'

làm thế nào có thể thay đổi màu bóng
Aditay Kaushal


1
hành vi rất lạ trong các thiết bị có 4.4.4 (hoặc tương tự). Một khoản lợi nhuận khổng lồ được thêm vào cardview in và làm cho UI rất xấu.
Morteza Rastgoo

Đây phải là câu trả lời được chấp nhận. Một bản cập nhật nhỏ mặc dù. Bạn nên sử dụng androidx một -> androidx.cardview.widget.CardView
Bogdan

59

Tôi nhận được kết quả tìm kiếm tốt nhất bằng cách sử dụng đồ họa 9 bản vá.

Bạn chỉ có thể tạo một đồ họa vá 9 cá nhân bằng cách sử dụng trình chỉnh sửa sau: http://inloop.github.io/shadow4android/

Thí dụ:

Đồ họa 9 bản vá:

Đồ họa 9 bản vá:

Kết quả:

nhập mô tả hình ảnh ở đây

Nguồn:

<LinearLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:orientation="vertical"
android:background="@drawable/my_nine_patch"

1
Làm thế nào tôi có thể ẩn đường màu đen? Xin hãy giúp đỡ
Isaac Darlong

@Isaac lưu hình ảnh dưới dạng my_nine_patch.9.png (.9.png là hình ảnh 9 lô)
arun

ĐÂY LÀ THỨ TỐT NHẤT!
Numanqmr

35

được rồi, tôi biết đây là cách quá muộn. nhưng tôi đã có cùng một yêu cầu. tôi đã giải quyết như thế này

1.Đầu tiên tạo một tệp xml (ví dụ: Border_shadow.xml) trong thư mục "drawable" và sao chép mã dưới đây vào nó.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<item>
    <shape>
        <!-- set the shadow color here -->
        <stroke
            android:width="2dp"
            android:color="#7000" />

        <!-- setting the thickness of shadow (positive value will give shadow on that side) -->

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

        <corners android:radius="3dp" />
    </shape>
</item>

<!-- Background -->

<item>
    <shape>
        <solid android:color="#fff" />
        <corners android:radius="3dp" />
    </shape>
</item>

2.now trên bố cục nơi bạn muốn bóng (ví dụ: linearLayout) thêm cái này trong android: nền

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dip"
    android:background="@drawable/border_shadow"
    android:orientation="vertical">

và điều đó đã làm việc cho tôi.


20

Điều này rất đơn giản:

Tạo một tệp có thể vẽ với một gradient như thế này:

cho bóng dưới một góc nhìn below_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">   
<gradient
    android:startColor="#20000000"
    android:endColor="@android:color/transparent"
    android:angle="270" >
</gradient>
</shape>

cho bóng trên một góc nhìn above_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">   
<gradient
    android:startColor="#20000000"
    android:endColor="@android:color/transparent"
    android:angle="90" >
</gradient>
</shape>

và cứ thế cho bóng phải và trái chỉ cần thay đổi góc của gradient :)


nơi tôi gọi dưới đây_shadow? bối cảnh của một quan điểm?
Arthur Melo

1
Tạo tập tin xml dưới đây, sau đó trong chế độ xem của bạn, thêm "Chế độ xem" trong bố cục của bạn và đặt bên dưới_shadow.xml làm nền của chế độ xem này
Morteza Rastgoo

Tôi đã làm giống như bạn đã nói, nhưng "trên_shadow" của tôi không trong suốt khi tôi đặt chế độ xem đó trong chế độ xem tùy chỉnh. Nó hoạt động tốt riêng. Tôi nên làm gì?
SoYoung

18

Thay vào đó, bạn có thể sử dụng hình ảnh vá 9 làm nền cho bố cục của mình, cho phép tạo bóng "tự nhiên" hơn:

nhập mô tả hình ảnh ở đây

Kết quả:

nhập mô tả hình ảnh ở đây

Đặt hình ảnh trong /res/drawablethư mục của bạn .
Hãy chắc chắn rằng phần mở rộng tập tin là .9.png, không.png

Nhân tiện, đây là một sửa đổi (giảm đến kích thước bình phương tối thiểu) của một tài nguyên hiện có trong thư mục tài nguyên sdk API 19.
Tôi đã để lại các điểm đánh dấu màu đỏ, vì chúng dường như không có hại, như được hiển thị trong công cụ draw9patch.

[BIÊN TẬP]

Khoảng 9 bản vá, trong trường hợp bạn không bao giờ có bất cứ điều gì để làm với chúng.

Chỉ cần thêm nó làm nền của Chế độ xem của bạn.

Các khu vực được đánh dấu màu đen (trái và trên cùng) sẽ kéo dài (theo chiều dọc, chiều ngang).
Các khu vực được đánh dấu màu đen (phải, dưới cùng) xác định "khu vực nội dung" (nơi có thể thêm văn bản hoặc Chế độ xem - bạn có thể gọi các khu vực không được đánh dấu là "phần đệm", nếu bạn muốn).

Hướng dẫn: http://radleymarx.com/blog/simple-guide-to-9-patch/


1
Chỉ cần thêm nó làm nền của Chế độ xem của bạn. Các khu vực được đánh dấu màu đen (trái và trên cùng) sẽ kéo dài (theo chiều dọc, chiều ngang). Các khu vực được đánh dấu màu đen (phải, dưới cùng) xác định "khu vực nội dung" (nơi có thể thêm văn bản hoặc Chế độ xem - gọi đó là "phần đệm", nếu bạn muốn). Hướng dẫn: radleymarx.com/blog/simple-guide-to-9-patch
Phantômaxx

9

Bạn tạo một tệp .xml có thể vẽ được với tên drop_shadow.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<item android:state_pressed="true">
        <layer-list>
            <item android:left="4dp" android:top="4dp">
                <shape>
                    <solid android:color="#35000000" />
                    <corners android:radius="2dp"/>
                </shape>
            </item>
            ...
        </layer-list>
    </item>-->
    <item>
        <layer-list>
            <!-- SHADOW LAYER -->
            <!--<item android:top="4dp" android:left="4dp">
                <shape>
                    <solid android:color="#35000000" />
                    <corners android:radius="2dp" />
                </shape>
            </item>-->
            <!-- SHADOW LAYER -->
            <item>
                <shape>
                    <solid android:color="#35000000" />
                    <corners android:radius="2dp" />
                </shape>
            </item>
            <!-- CONTENT LAYER -->
            <item android:bottom="3dp" android:left="1dp" android:right="3dp" android:top="1dp">
                <shape>
                    <solid android:color="#ffffff" />
                    <corners android:radius="1dp" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

Sau đó:

<LinearLayout
...
android:background="@drawable/drop_shadow"/>

3

Sử dụng dòng duy nhất này và hy vọng bạn sẽ đạt được kết quả tốt nhất;

sử dụng: android:elevation="3dp" Điều chỉnh kích thước bao nhiêu tùy ý và đây là cách tốt nhất và đơn giản nhất để đạt được bóng như các nút và các bóng Android mặc định khác. Hãy cho tôi biết nếu nó hoạt động!


@ MichałZiobro Sử dụng nó với bố cục của bạn như nếu bạn có bố cục trên một cái khác nhỏ hơn và bạn muốn hiển thị bóng. nó nên hoạt động Bạn có thể thấy các văn bản và nút của mình trở nên vô hình nhưng khi bạn chạy ứng dụng, bạn sẽ thấy bóng tối tốt nhất. Tôi không chắc đó là một loại lỗi hay gì đó nhưng trong trường hợp của tôi khi tôi sử dụng mã đó, nó làm cho tất cả các Chế độ xem của tôi không hiển thị trong bản xem trước AS nhưng hoạt động tốt nhất trong ứng dụng khi tôi gỡ lỗi / khởi chạy nó trong thiết bị của tôi. Hãy cho tôi biết nếu nó làm việc hay không. Cảm ơn.
Tamim

3

Nếu bạn đã có đường viền từ hình dạng, chỉ cần thêm độ cao:

<LinearLayout
    android:id="@+id/layout"
    ...
    android:elevation="2dp"
    android:background="@drawable/rectangle" />

2
Hành vi trên API <21 là gì?
CoolMind

1
Thật không may, nó không hoạt động trước Lollipop nên bạn nên sử dụng một số câu trả lời khác từ câu hỏi này. Nhưng nếu bạn đang nhắm mục tiêu các điện thoại mới hơn thì đây là một cách khá dễ dàng để làm việc đó hoạt động tốt.
Krzynool

2

1.Đầu tiên tạo một tên tệp xml Shadow.xml trong thư mục "drawable" và sao chép mã dưới đây vào nó.

 <?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="#CABBBBBB" />
                <corners android:radius="10dp" />
            </shape>
        </item>

        <item
            android:bottom="6dp"
            android:left="0dp"
            android:right="6dp"
            android:top="0dp">
            <shape android:shape="rectangle">
                <solid android:color="@android:color/white" />
                <corners android:radius="4dp" />
            </shape>
        </item>
    </layer-list>

Sau đó thêm danh sách lớp làm nền trong linearLayout của bạn.

<LinearLayout
        android:id="@+id/header_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shadow"
        android:orientation="vertical">

cảm ơn rất nhiều, mã của bạn có vẻ ổn ...
John dahat

1
@Johndahat ok thôi
Sudhir singh

1

Ya Mahdi aj --- cho RelativeLayout

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <gradient
                android:startColor="#7d000000"
                android:endColor="@android:color/transparent"
                android:angle="90" >
            </gradient>
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="3dp"
        android:top="0dp"
        android:bottom="3dp">
        <shape android:shape="rectangle">
            <padding
                android:bottom="40dp"
                android:top="40dp"
                android:right="10dp"
                android:left="10dp"
                >
            </padding>
            <solid android:color="@color/Whitetransparent"/>
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>

1

Tôi biết điều này là muộn nhưng nó có thể giúp ai đó.

Bạn có thể sử dụng một ràng buộcLayout và thêm thuộc tính sau vào xml,

        android:elevation="4dp"

0

Tôi tìm thấy cách tốt nhất để giải quyết điều này.

  1. Bạn cần đặt một nền hình chữ nhật vững chắc trên bố cục.

  2. Sử dụng mã này - ViewCompat.setElevation(view , value)

  3. Trên tập bố trí cha android:clipToPadding="false"


2
Trong trường hợp bạn không biết, đây là cách triển khai ViewCompat.setElevation()phương thức hiện tại trên lớp ViewCompat : public void setElevation(View view, float elevation) {}. Như bạn có thể thấy, nó không được thực hiện. Tôi thực sự nghi ngờ nó sẽ giúp ích được gì, và thực sự tự hỏi liệu bạn có thực sự kiểm tra câu trả lời của chính mình không, lol
mradzinski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.