【问题标题】:How to add shadow to linear layout - android?如何为线性布局添加阴影 - android?
【发布时间】:2017-01-05 06:03:41
【问题描述】:

在我的 android 应用程序中,我必须实现如下图所示的内容:

我曾尝试使用 shadow xmls 进行线性布局,但它似乎并没有达到我想要的效果。 我使用的代码是:

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

请建议我怎样才能做到这一点。

【问题讨论】:

  • 你不能在 xml 中做到这一点,你必须在 java 中使用自定义 Drawable
  • 将您的线性布局放入卡片视图中
  • @pskink 我认为如果她在 LinearLayout 中添加图层列表作为背景,这是可能的。?
  • @AshishSrivastava 你能指出一个我可以参考的例子吗??

标签: android


【解决方案1】:

你可以把一个9-patchImage带阴影作为背景,也可以用下面的xml作为阴影的linearlayout的背景

  <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Drop Shadow Stack -->
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#02000000" />
            <corners android:radius="8dp" />
        </shape>
    </item>
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#05000000" />
            <corners android:radius="7dp" />
        </shape>
    </item>
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#10000000" />
            <corners android:radius="6dp" />
        </shape>
    </item>
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#15000000" />
            <corners android:radius="5dp" />
        </shape>
    </item>
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#20000000" />
            <corners android:radius="4dp" />
        </shape>
    </item>
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#25000000" />
            <corners android:radius="3dp" />
        </shape>
    </item>
    <item>
        <shape>
            <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
            <solid android:color="#30000000" />
            <corners android:radius="3dp" />
        </shape>
    </item>

    <!-- Background -->
    <item>
    <shape>
            <solid android:color="#ffffff" />
        <corners android:radius="3dp" />
    </shape>
   </item>
</layer-list>

从不需要阴影的任何一侧删除填充

注意:

这不是我的,我从很久以前的某个地方复制了它,找不到它来给予适当的信任。如果您知道它的出处,请随时编辑并保留学分

【讨论】:

  • 感谢这对我有帮助。是否可以使底部的阴影更柔和?就像它会淡出一样?
  • 在顶部&lt;solid android:color="#02000000" /&gt; 将前2位数字#02改为更少,它表示黑色应该透明多少
  • @Redman 首先谢谢。这太棒了。尽管它服务于目的。你能写一个简短的说明你是如何想出这个的,或者可能是解释这个代码背后的逻辑。跨度>
【解决方案2】:

一种简单的方法是将您的layout放在cardview中。提供海拔等以使其更加逼真。

<android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="4dp">

        <LinearLayout
            android:text="Hello Card"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        ...............

        </LinearLayout>

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

【讨论】:

    【解决方案3】:

    我可能会迟到,但以防其他人需要它。你可以使用这个工具http://inloop.github.io/shadow4android/ 它允许您制作带有阴影的图像,但不将其视为普通图像,而是将其视为特殊图像。您将获得以 .9.png 而不是 .png 结尾的图像 您应该保留 .9,因为它会指示 Android Studio 将其视为 9 补丁

    然后将此图像添加到您的 drawables 文件夹中。将其用作布局的背景,您将获得漂亮的自然阴影效果,直到现在我从未见过任何可绘制的对象能够做到这一点

    【讨论】:

      【解决方案4】:

      也许你可以使用 CardView 代替 LinearLayout,它提供了 som api 来实现阴影

      【讨论】:

      • 我需要为 1 个线性布局实现阴影部分。我不认为 cardview 对我来说是可行的。
      【解决方案5】:

      这样的事情应该可以解决问题:

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

      然后在您的 LinearLayout 中添加图层列表作为背景。

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

      您也可以参考此post 以供参考。

      编辑:将 background_with_shadow.xml 文件添加到 res/drawable。

      对于 Android 5.0 及更高版本,请参阅:Defining Shadows and Clipping Views

      【讨论】:

        【解决方案6】:

        此代码将符合您的要求

        <selector xmlns:android="http://schemas.android.com/apk/res/android">
        
            <item><layer-list>
                    <item android:right="5dp" android:top="5dp"><shape>
                            <corners android:radius="3dp" />
        
                            <solid android:color="#D6D6D6" />
                    </shape></item>
                <item android:bottom="3dp" android:left="3dp"><shape>
                        <gradient android:angle="270" android:endColor="#E2E2E2" android:startColor="#BABABA" />
        
                        <stroke android:width="1dp" android:color="#BABABA" />
        
                        <corners android:radius="4dp" />
        
                        <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
                    </shape></item>
            </layer-list></item>
        
        </selector>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          • 1970-01-01
          • 2013-01-15
          • 1970-01-01
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          相关资源
          最近更新 更多