Android 如何将阴影应用于ImageView?

Android 如何将阴影应用于ImageView?,android,android-imageview,textview,shadow,Android,Android Imageview,Textview,Shadow,我想将阴影应用于图像视图。当我将阴影应用到TextView时,我得到了阴影,但同样的阴影没有应用到ImageView。如何解决此问题?我们还可以使用提供圆角背景和阴影的。要使用它,您需要将作为依赖项添加到build.gradle中的项目中,如下所示 dependencies { compile 'com.android.support:cardview-v7:23.0.1' ------- } 注:将上述行中的23.0.1更改为受尊重的版本 因此,我用cardwiew包围了Im

我想将阴影应用于
图像视图
。当我将阴影应用到
TextView
时,我得到了阴影,但同样的阴影没有应用到
ImageView
。如何解决此问题?

我们还可以使用提供圆角背景和阴影的。要使用它,您需要将作为依赖项添加到build.gradle中的项目中,如下所示

dependencies {
    compile 'com.android.support:cardview-v7:23.0.1'
    -------
}
注:将上述行中的
23.0.1
更改为受尊重的版本

因此,我用
cardwiew
包围了
ImageView
,使阴影如下图所示

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardBackgroundColor="@android:color/white">

    <ImageView
        android:id="@+id/dish_image"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:adjustViewBounds="true" />

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

它将在图像周围添加阴影

注意:我不知道这是否是一个好的解决方法。我是初学者。我 尝试实现
cardwiew
,它给出了实现的想法 这个也一样。如果不好,请告诉我原因


这是罗曼·盖伊在Devxx的演讲,pdf格式

希望这有帮助

注释

不要忘记,对于蜂窝和更高版本,您需要调用
setLayerType(LAYER\u TYPE\u SOFTWARE,mShadow)
,否则您将看不到自己的影子!(@Dmitriy_Boichenko)

SetShadowLayer
不幸的是,它不能与硬件加速一起工作,因此会大大降低性能(@Matt Wear)

答案取自

对于大于21的Api。 您可以在imageview或按钮中尝试使用xml:


您可以创建一个可绘制的图层列表,并将图像和阴影的两个项目(可绘制)放入其中


您的阴影项目的位置和内容可能会根据您要应用阴影的位置(顶部、左侧、右侧、右侧和左侧等)和阴影样式而变化

创建一个shadow_rect.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="0dp"/>
        </shape>
    </item>
    <item android:right="1dp"  android:bottom="2dp">
        <shape
            android:shape="rectangle">
            <solid android:color="@android:color/white"/>
            <corners android:radius="1dp"/>
        </shape>
    </item>

</layer-list>


然后在Imageview中使用它作为android:background=“@drawable/shadow\rect。

Imageview

  <ImageView
     ......
  android:elevation="2dp"
  android:background="@drawable/myrect"/>

背景可绘制定义为具有圆角的矩形:

<!-- res/drawable/myrect.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <solid android:color="#42000000" />
    <corners android:radius="5dp" />
</shape>

您可以使用适当的
outlineSpotShadowColor

要将阴影设置为true请使用
@color/black
尝试
setOutlineSpotShadowColor
,并将
高程增加到12dp


要使用
@android:color/transparent
将阴影设置为false
setOutlineSpotShadowColor
,并降低
高程

我想您正在寻找这个:我希望这会对您有所帮助。我可能错了,但您使用的是“文本阴影”“在
TextView
上。这很好。您需要的是
ImageView
上的“框阴影”。我认为这是不存在的。您需要构建一个自定义背景,看起来像阴影来实现这一点。可能的
android:elevation=“2dp”
副本有时已经足够好了。似乎
android:elevation
只有在定义了
android:background
的情况下才有效。如果不定义两者,我就不会得到任何阴影。
card\u view
是如何声明的?…与
app
xmlns通常是如何声明的一样。circle ImageView呢?@user924我在很长一段时间后看到了这个答案:-)。Cardview内部为高端设备使用立面。对于低端设备,它使用画布上的自定义图形。因此,更好地在源代码中获取更多信息。我将花一些时间更新答案。
android:elevation
似乎对ImageViewElevation不起作用api 21中添加了elevation。您可能正在使用较低版本。使用较低api版本的卡布局。我使用的是api 24。提升在大多数情况下似乎都可以正常工作,但在ImageView上不行。什么是
位图
?您的ImageView将具有匹配的父级高度和宽度,请尝试提供边距或填充。因为立面将隐藏在其他布局后面。您是否试图理解OP的要求?
  <ImageView
     ......
  android:elevation="2dp"
  android:background="@drawable/myrect"/>
<!-- res/drawable/myrect.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <solid android:color="#42000000" />
    <corners android:radius="5dp" />
</shape>