Làm thế nào để hiển thị bóng xung quanh tuyến tính trong Android?


79

Làm cách nào để hiển thị bóng đổ cho bố cục tuyến tính của tôi. Tôi muốn nền tròn màu trắng với bóng xung quanh tuyến tính. Tôi đã làm điều này cho đến nay.

<LinearLayout
 android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@xml/rounded_rect_shape"
android:orientation="vertical"
android:padding="10dp">
<-- My buttons, textviews, Imageviews go here -->
</LinearLayout>

Và round_rect_shape.xml trong thư mục xml

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

   <solid android:color="#ffffff" />

   <corners
      android:bottomLeftRadius="3dp"
      android:bottomRightRadius="3dp"
      android:topLeftRadius="3dp"
      android:topRightRadius="3dp" />
</shape>

Câu trả lời:


28

Không có thuộc tính như vậy trong Android, để hiển thị một cái bóng. Nhưng những cách khả thi để làm điều đó là:

  1. Thêm một LinearLayout đơn giản với màu xám, qua đó thêm bố cục thực tế của bạn, với lề ở dưới cùng và bên phải bằng 1 hoặc 2 dp

  2. Có một hình ảnh 9 bản vá với bóng đổ và đặt nó làm nền cho bố cục Tuyến tính của bạn


9-bản vá là cách tốt nhất để làm điều đó!
Andranik

Có cách nào để sử dụng 9 bản vá với đa giác tùy chỉnh không? Tôi đã thử công cụ này inloop.github.io/shadow4android nhưng nó chỉ tạo bóng cho các hình bầu dục / hình chữ nhật
rimes

143

Cũng có một giải pháp khác cho vấn đề này bằng cách triển khai danh sách lớp sẽ hoạt động như nền cho LinearLayoout.

Thêm tệp background_with_shadow.xml vào res/drawable. Chứa:

<?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="@android:color/darker_gray" />
        <corners android:radius="5dp"/>
        </shape>
    </item>
    <item android:right="1dp" android:left="1dp" android:bottom="2dp">
        <shape 
            android:shape="rectangle">
        <solid android:color="@android:color/white"/>
        <corners android:radius="5dp"/>
        </shape>
    </item>
</layer-list>

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

<LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/background_with_shadow"/>

Chà! Tôi đã thực hiện một số điều này và trông không quá tuyệt. Nếu bạn đang tìm kiếm một giá đỡ holo, nó có vẻ hoàn hảo. Cảm ơn anh bạn.
jfcogato,

Hiệu ứng đẹp, cảm ơn !! Nhưng có một vấn đề nhỏ - dễ nhận thấy - mà tôi gặp phải: bóng đổ không thực sự bên cạnh bố cục màu trắng, nhưng chia sẻ không gian ở giữa. Nếu những gì tôi đang nói không đủ rõ ràng, chỉ cần thử mã tương tự với 100dp thay cho 1dp. Tôi biết, nó vô hình trong hầu hết các trường hợp nhưng nếu ai đó có thể đưa ra giải pháp cho tôi, điều đó sẽ rất hoàn hảo!
Poutrathor

1
@Poutrathor, thật thú vị khi bạn nhận thấy vấn đề đó. Rất tiếc, tôi không có giải pháp nào khác để cung cấp vào lúc này. Bạn đang cố gắng hoàn thành điều gì? Có thể ai đó có thể giúp bạn thêm về vấn đề của bạn.
muthee

"Nó là gì mà bạn đang cố gắng hoàn thành?" Sự hoàn hảo, tất nhiên! Đùa thôi, tôi để ý nên báo cáo. giải pháp của bạn thực sự tốt cho bóng rất ngắn hợp thời trang và tôi đang sử dụng nó rất vui. Tôi ước gì có thể cung cấp cho u hơn upvotes :)
Poutrathor

3
Ngoài ra, hình dạng phía trên là bóng (!), Trong khi hình dạng phía dưới là phần lớn hơn chính.
sandalone

30

Chà, điều này rất dễ đạt được.

Chỉ cần tạo một GradientDrawablecái có màu đen và chuyển sang màu trong suốt, thay vì sử dụng mối quan hệ gốc để đặt hình dạng của bạn gần với Chế độ xem mà bạn muốn có bóng, sau đó bạn chỉ cần cung cấp bất kỳ giá trị nào cho chiều cao hoặc chiều rộng.

Đây là một ví dụ, tệp này phải được tạo bên trong res/drawable, tôi đặt tên nó là shadow.xml:

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

    <gradient
        android:startColor="#9444"
        android:endColor="#0000"
        android:type="linear"
        android:angle="90"> <!-- Change this value to have the correct shadow angle, must be multiple from 45 -->
    </gradient>

</shape>

Đặt đoạn mã sau ở trên từ a LinearLayout, chẳng hạn, đặt android:layout_widthandroid:layout_heightthành fill_parent2.3dp, bạn sẽ có một hiệu ứng đổ bóng đẹp mắt LinearLayout.

<View
    android:id="@+id/shadow"
    android:layout_width="fill_parent"
    android:layout_height="2.3dp"  
    android:layout_above="@+id/id_from_your_LinearLayout" 
    android:background="@drawable/shadow">
</View>

Lưu ý 1: Nếu bạn tăng android:layout_heightnhiều bóng hơn sẽ được hiển thị.

Lưu ý 2: Sử dụng android:layout_above="@+id/id_from_your_LinearLayout"thuộc tính nếu bạn đang đặt mã này bên trong RelativeLayout, nếu không hãy bỏ qua nó.

Hy vọng nó sẽ giúp một ai đó.


xin chào ... Tôi biết điều này đã cũ ... nhưng bạn đang nói rằng cách duy nhất để có được hiệu ứng đổ bóng xung quanh cấu trúc khung nhìn hình chữ nhật là tạo một cấu trúc hình chữ nhật khác, và sau đó xếp chúng lại cho phù hợp ??? ... cảm ơn ... Tôi là người mới trong Android ...
dsdsdsdsd

Xin chào @dsdsdsdsds Tôi không chắc đây có phải là whay duy nhất để có được hiệu ứng đổ bóng hay không vì material design đã giới thiệu rất nhiều tài nguyên thiết kế, tôi sẽ xem xét khi về nhà và tôi sẽ bình luận ở đây nếu tôi tìm thấy bất cứ điều gì.
Murillo Ferreira

18

Đối với kẹo mút trở lên, bạn có thể sử dụng độ cao .

Đối với các phiên bản cũ hơn:

Đây là một bản hack lười biếng từ: http://odedhb.blogspot.com/2013/05/android-layout-shadow-without-9-patch.html

(toast_frame không hoạt động trên KitKat, bóng đã bị xóa khỏi bánh mì nướng)

chỉ dùng:

android:background="@android:drawable/toast_frame"

hoặc là:

android:background="@android:drawable/dialog_frame"

làm nền

ví dụ:

<TextView
        android:layout_width="fill_parent"
        android:text="I am a simple textview with a shadow"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:padding="16dp"
        android:textColor="#fff"
        android:background="@android:drawable/toast_frame"
        />

và với màu bg khác nhau:

<LinearLayout
        android:layout_height="64dp"
        android:layout_width="fill_parent"
        android:gravity="center"
        android:background="@android:drawable/toast_frame"
        android:padding="4dp"
        >
    <Button
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="Button shadow"
            android:background="#33b5e5"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="#fff"
            android:layout_gravity="center|bottom"
            />

</LinearLayout>

cũng android:background="@android:drawable/alert_light_frame"cho màu trắng
abbasalim

12

Hãy thử điều này .. layout_shadow.xml

<?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>

Áp dụng cho bố cục của bạn như thế này

 android:background="@drawable/layout_shadow"

7

Tôi biết điều này đã cũ, nhưng hầu hết các câu trả lời này đều yêu cầu thêm hàng tấn mã.

Nếu bạn có nền màu sáng, bạn có thể chỉ cần sử dụng điều này:

android:elevation="25dp"

Không phải là có ít dòng mã, mà mã của bạn phải hoạt động trên tất cả các thiết bị. Độ cao bạn đề nghị sẽ làm việc chỉ trong API 21 trở lên
musooff

6

Trên thực tế, tôi đồng ý với @odedbreiner nhưng tôi đặt khung thoại bên trong lớp đầu tiên và ẩn nền đen dưới lớp trắng.

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@android:drawable/dialog_frame"
        android:right="2dp" android:left="2dp" android:bottom="2dp" android:top="5dp" >
        <shape android:shape="rectangle">
            <corners android:radius="5dp"/>
        </shape>
    </item>
    <item>
        <shape
            android:shape="rectangle">
            <solid android:color="@android:color/white"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
</layer-list>

2
  1. lưu 9.png này. (đổi tên nó thành 9.png)

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

2. lưu nó trong của bạn drawable.

3. đặt nó vào bố cục của bạn.

4. bộ đệm.

Ví dụ :

<LinearLayout  
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/shadow"
  android:paddingBottom="6dp"
  android:paddingLeft="5dp"
  android:paddingRight="5dp"
  android:paddingTop="6dp"
>

.
.
.
</LinearLayout>

2

Tạo một XML mới theo ví dụ có tên "shadow.xml" tại DRAWABLE với mã sau (bạn có thể sửa đổi nó hoặc tìm một cái khác tốt hơ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="@color/middle_grey"/>
        </shape>
    </item>

    <item android:left="2dp"
          android:right="2dp"
          android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>

</layer-list>

Sau khi tạo XML trong LinearLayout hoặc một Widget khác mà bạn muốn tạo bóng râm, bạn sử dụng thuộc tính BACKGROUND để xem phần hoàn thiện. Nó sẽ giống như:

<LinearLayout
    android:orientation="horizontal"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:paddingRight="@dimen/margin_med"
    android:background="@drawable/shadow"
    android:minHeight="?attr/actionBarSize"
    android:gravity="center_vertical">

1

Bạn có thể sử dụng lớp sau cho thẻ xml:

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.os.Build;
import android.support.annotation.FloatRange;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;

import com.webappmate.weeassure.R;

/**
 * Created by GIGAMOLE on 13.04.2016.
 */
public class ShadowLayout extends FrameLayout {

    // Default shadow values
    private final static float DEFAULT_SHADOW_RADIUS = 30.0F;
    private final static float DEFAULT_SHADOW_DISTANCE = 15.0F;
    private final static float DEFAULT_SHADOW_ANGLE = 45.0F;
    private final static int DEFAULT_SHADOW_COLOR = Color.DKGRAY;

    // Shadow bounds values
    private final static int MAX_ALPHA = 255;
    private final static float MAX_ANGLE = 360.0F;
    private final static float MIN_RADIUS = 0.1F;
    private final static float MIN_ANGLE = 0.0F;
    // Shadow paint
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG) {
        {
            setDither(true);
            setFilterBitmap(true);
        }
    };
    // Shadow bitmap and canvas
    private Bitmap mBitmap;
    private final Canvas mCanvas = new Canvas();
    // View bounds
    private final Rect mBounds = new Rect();
    // Check whether need to redraw shadow
    private boolean mInvalidateShadow = true;

    // Detect if shadow is visible
    private boolean mIsShadowed;

    // Shadow variables
    private int mShadowColor;
    private int mShadowAlpha;
    private float mShadowRadius;
    private float mShadowDistance;
    private float mShadowAngle;
    private float mShadowDx;
    private float mShadowDy;

    public ShadowLayout(final Context context) {
        this(context, null);
    }

    public ShadowLayout(final Context context, final AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ShadowLayout(final Context context, final AttributeSet attrs, final int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        setWillNotDraw(false);
        setLayerType(LAYER_TYPE_HARDWARE, mPaint);

        // Retrieve attributes from xml
        final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShadowLayout);

        try {
            setIsShadowed(typedArray.getBoolean(R.styleable.ShadowLayout_sl_shadowed, true));
            setShadowRadius(
                    typedArray.getDimension(
                            R.styleable.ShadowLayout_sl_shadow_radius, DEFAULT_SHADOW_RADIUS
                    )
            );
            setShadowDistance(
                    typedArray.getDimension(
                            R.styleable.ShadowLayout_sl_shadow_distance, DEFAULT_SHADOW_DISTANCE
                    )
            );
            setShadowAngle(
                    typedArray.getInteger(
                            R.styleable.ShadowLayout_sl_shadow_angle, (int) DEFAULT_SHADOW_ANGLE
                    )
            );
            setShadowColor(
                    typedArray.getColor(
                            R.styleable.ShadowLayout_sl_shadow_color, DEFAULT_SHADOW_COLOR
                    )
            );
        } finally {
            typedArray.recycle();
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        // Clear shadow bitmap
        if (mBitmap != null) {
            mBitmap.recycle();
            mBitmap = null;
        }
    }

    public boolean isShadowed() {
        return mIsShadowed;
    }

    public void setIsShadowed(final boolean isShadowed) {
        mIsShadowed = isShadowed;
        postInvalidate();
    }

    public float getShadowDistance() {
        return mShadowDistance;
    }

    public void setShadowDistance(final float shadowDistance) {
        mShadowDistance = shadowDistance;
        resetShadow();
    }

    public float getShadowAngle() {
        return mShadowAngle;
    }

    @SuppressLint("SupportAnnotationUsage")
    @FloatRange
    public void setShadowAngle(@FloatRange(from = MIN_ANGLE, to = MAX_ANGLE) final float shadowAngle) {
        mShadowAngle = Math.max(MIN_ANGLE, Math.min(shadowAngle, MAX_ANGLE));
        resetShadow();
    }

    public float getShadowRadius() {
        return mShadowRadius;
    }

    public void setShadowRadius(final float shadowRadius) {
        mShadowRadius = Math.max(MIN_RADIUS, shadowRadius);

        if (isInEditMode()) return;
        // Set blur filter to paint
        mPaint.setMaskFilter(new BlurMaskFilter(mShadowRadius, BlurMaskFilter.Blur.NORMAL));
        resetShadow();
    }

    public int getShadowColor() {
        return mShadowColor;
    }

    public void setShadowColor(final int shadowColor) {
        mShadowColor = shadowColor;
        mShadowAlpha = Color.alpha(shadowColor);

        resetShadow();
    }

    public float getShadowDx() {
        return mShadowDx;
    }

    public float getShadowDy() {
        return mShadowDy;
    }

    // Reset shadow layer
    private void resetShadow() {
        // Detect shadow axis offset
        mShadowDx = (float) ((mShadowDistance) * Math.cos(mShadowAngle / 180.0F * Math.PI));
        mShadowDy = (float) ((mShadowDistance) * Math.sin(mShadowAngle / 180.0F * Math.PI));

        // Set padding for shadow bitmap
        final int padding = (int) (mShadowDistance + mShadowRadius);
        setPadding(padding, padding, padding, padding);
        requestLayout();
    }

    private int adjustShadowAlpha(final boolean adjust) {
        return Color.argb(
                adjust ? MAX_ALPHA : mShadowAlpha,
                Color.red(mShadowColor),
                Color.green(mShadowColor),
                Color.blue(mShadowColor)
        );
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // Set ShadowLayout bounds
        mBounds.set(
                0, 0, MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)
        );
    }

    @Override
    public void requestLayout() {
        // Redraw shadow
        mInvalidateShadow = true;
        super.requestLayout();
    }

    @Override
    protected void dispatchDraw(final Canvas canvas) {
        // If is not shadowed, skip
        if (mIsShadowed) {
            // If need to redraw shadow
            if (mInvalidateShadow) {
                // If bounds is zero
                if (mBounds.width() != 0 && mBounds.height() != 0) {
                    // Reset bitmap to bounds
                    mBitmap = Bitmap.createBitmap(
                            mBounds.width(), mBounds.height(), Bitmap.Config.ARGB_8888
                    );
                    // Canvas reset
                    mCanvas.setBitmap(mBitmap);

                    // We just redraw
                    mInvalidateShadow = false;
                    // Main feature of this lib. We create the local copy of all content, so now
                    // we can draw bitmap as a bottom layer of natural canvas.
                    // We draw shadow like blur effect on bitmap, cause of setShadowLayer() method of
                    // paint does`t draw shadow, it draw another copy of bitmap
                    super.dispatchDraw(mCanvas);

                    // Get the alpha bounds of bitmap
                    final Bitmap extractedAlpha = mBitmap.extractAlpha();
                    // Clear past content content to draw shadow
                    mCanvas.drawColor(0, PorterDuff.Mode.CLEAR);

                    // Draw extracted alpha bounds of our local canvas
                    mPaint.setColor(adjustShadowAlpha(false));
                    mCanvas.drawBitmap(extractedAlpha, mShadowDx, mShadowDy, mPaint);

                    // Recycle and clear extracted alpha
                    extractedAlpha.recycle();
                } else {
                    // Create placeholder bitmap when size is zero and wait until new size coming up
                    mBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565);
                }
            }

            // Reset alpha to draw child with full alpha
            mPaint.setColor(adjustShadowAlpha(true));
            // Draw shadow bitmap
            if (mCanvas != null && mBitmap != null && !mBitmap.isRecycled())
                canvas.drawBitmap(mBitmap, 0.0F, 0.0F, mPaint);
        }

        // Draw child`s
        super.dispatchDraw(canvas);
    }


}

sử dụng Tag trong xml như thế này:

<yourpackagename.ShadowLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_gravity="center_horizontal"
        app:sl_shadow_color="#9e000000"
        app:sl_shadow_radius="4dp">
<child views>
</yourpackagename.ShadowLayout>

CẬP NHẬT

đặt mã dưới đây trong attrs.xml trong tài nguyên >> giá trị

  <declare-styleable name="ShadowLayout">
    <attr name="sl_shadowed" format="boolean"/>
    <attr name="sl_shadow_distance" format="dimension"/>
    <attr name="sl_shadow_angle" format="integer"/>
    <attr name="sl_shadow_radius" format="dimension"/>
    <attr name="sl_shadow_color" format="color"/>
</declare-styleable>

Nó sẽ cung cấp bóng cho bất kỳ xem, hy vọng nó sẽ làm việc cho bạn
Shashwat Gupta

@CoolMind Tôi đã cập nhật mã cho R.styleable.ShadowLayout. Vui lòng kiểm tra câu trả lời của tôi được cập nhật
Shashwat Gupta

Cảm ơn cho một bản cập nhật. Tôi đã thử kiểm tra nó trên trình mô phỏng API 19 <TextView>, nó tập trung vào TextView nhưng không thêm bóng.
CoolMind

Nó hoạt động. Tôi nghĩ sl_shadowed = "true" là cần thiết, radius là padding tức là chiều rộng của bóng, khoảng cách và góc tạo nên dx, dy bù. Những gì tôi nghĩ nên được thêm vào là một cái gì đó như thế này // Đặt đệm cho bóng bitmap val padding = (shadowDistance + shadowRadius) .toInt () setPadding (if (shadowLeft) padding else 0, if (shadowTop) padding else 0, if (shadowRight) ) đệm khác 0, nếu (shadowBottom) đệm khác 0) Sau đó, bạn có điều kiện có thể bật bóng trên mép ưa thích của bố cục
Michał Ziobro

0

Một giải pháp khả thi là sử dụng 9 hình ảnh bản vá như thế này http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch

HOẶC LÀ

Tôi đã làm điều này theo cách sau đây. Đây là bố cục chính của tôi trong đó round_corner.xml và drop_shadow.xml được sử dụng làm tài nguyên nền. round_corner_two giống như round_corner.xml chỉ khác ở thuộc tính màu sắc. sao chép round_corner.xml, drop_shadow.xml và round_conere_two.xml vào thư mục có thể vẽ được.

<RelativeLayout
    android:id="@+id/facebook_id"
    android:layout_width="250dp"
    android:layout_height="52dp"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="28dp"
    android:background="@drawable/round_corner" >

    <LinearLayout
        android:id="@+id/shadow_id"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_margin="1dp"
        android:background="@drawable/drop_shadow" >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_marginBottom="2dp"
            android:background="@drawable/round_corner_two"
            android:gravity="center"
            android:text="@string/fb_butn_text"
            android:textColor="@color/white" >
        </TextView>
    </LinearLayout>
</RelativeLayout>

round_corner.xml:

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

<!-- view background color -->
<solid
    android:color="#ffffff" >
</solid>

<!-- view border color and width -->
<stroke
    android:width="0dp"
    android:color="#3b5998" >
</stroke>

<!-- If you want to add some padding -->
<padding
    android:left="1dp"
    android:top="1dp"
    android:right="1dp"
    android:bottom="1dp"    >
</padding>

<!-- Here is the corner radius -->
<corners
    android:radius="10dp"   >
</corners>

</shape>

drop_shadow.xml

<?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="@android:color/darker_gray" />
    <corners android:radius="12dp"/>
    </shape>
</item>
<item android:right="1dp" android:left="1dp" android:bottom="5dp">
    <shape 
        android:shape="rectangle">
    <solid android:color="@android:color/white"/>
    <corners android:radius="5dp"/>
    </shape>
</item>
</layer-list>

0

tôi biết điều này là 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

<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>

bạn cần thêm phụ thuộc:

compile 'com.android.support:cardview-v7:25.0.1'

-1

đặt xml drwable này làm nền của bạn; ---

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

<!-- Bottom 2dp Shadow -->
<item>
    <shape android:shape="rectangle" >
        <solid android:color="#d8d8d8" />-->Your shadow color<--

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

<!-- White Top color -->
<item android:bottom="3px" android:left="3px" android:right="3px" android:top="3px">-->here you can customize the shadow size<---
    <shape android:shape="rectangle" >
        <solid android:color="#FFFFFF" />

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

</layer-list>

Điều này tạo ra bóng cho văn bản, không phải bố cục.
Abhinav Manchanda

3
Không, nó sẽ không hiển thị bóng. Bạn có thể vui lòng cung cấp câu trả lời chi tiết hơn về cách thức hoạt động của nó không?
Yi H.
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.