【问题标题】:Is there any way to do a Material-style shadow in API < 21 (5.0 Lollipop)?有没有办法在 API < 21 (5.0 Lollipop) 中做一个 Material 风格的阴影?
【发布时间】:2014-07-22 16:50:44
【问题描述】:

Material design 非常强调“纸张”的隐喻。要制作这些,阴影是必不可少的。由于 Material Design 是一种哲学并且不是 API(尽管它被内置在 L 中),这应该在任何地方(Windows 窗体、HTML/CSS 等)完成。 如何在 Android API 14 到 20 中执行此操作?

请注意,预制的 PNG 对于圆形和其他非方形形状并不实用。

【问题讨论】:

  • 你可以自己画。
  • @Code-Apprentice 我该怎么做呢?
  • 希望兼容性库能够提供其中一些功能
  • 查看library
  • @sanemars 如果您认为这是我的问题的答案,请将其作为答案而不是评论发布:3

标签: android shadow dropshadow material-design


【解决方案1】:

如果您不担心过去 Lollipop 的向后兼容性,您可以直接在 XML 中设置海拔属性

    android:elevation="10dp"

否则,您必须使用 support.v4.ViewCompat 库在 Java 中进行设置。

    ViewCompat.setElevation(myView, 10);

并将其添加到您的 build.gradle

    compile 'com.android.support:support-v4:21.+'

http://developer.android.com/reference/android/support/v4/view/ViewCompat.html#setElevation(android.view.View,%20float)

【讨论】:

  • 为什么?这在标准 Android API 20 中可用吗?它是如何工作的?
  • 我做了更多研究并编辑了我的答案,现在这样更有帮助吗?
  • 非常好!谢谢你,我以后可能会用到它!
  • 为什么这与从 xml 或 java 的设置有关?我不明白为什么这不适用于 xml...:(
【解决方案2】:

在 Lollipop 之前渲染阴影并不容易,但可能。诀窍是阴影只是视图的黑色模糊形状。你可以自己做。

  1. 将阴影投射视图绘制到设置了 LightingColorFilter(0,0) 的位图
  2. 使用 ScriptIntrisincBlur 对其进行模糊处理
  3. 画出形状
  4. 在形状顶部绘制视图

听起来好像要编写很多代码,但它适用于所有情况,因此您可以轻松涵盖所有视图。

【讨论】:

  • 不错的解决方案!我希望有一种方法可以在没有 Java 的情况下做到这一点,这样就没有机会跳过效果(崩溃、提前返回、分支语句等)
【解决方案3】:

这里只是一个粗略的示例......

<?xml version="1.0" encoding="utf-8"?>

<!-- Drop Shadow Stack -->
<item>
    <shape android:shape="oval">
        <corners android:radius="64dp"/>
        <solid android:color="#009A3D"/>
        <size
            android:width="64dp"
            android:height="64dp"/>
        <padding
            android:top="1dp"
            android:right="1dp"
            android:bottom="1dp"
            android:left="1dp"/>
        <solid android:color="#00CCCCCC"/>
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <corners android:radius="64dp"/>
        <solid android:color="#009A3D"/>
        <size
            android:width="64dp"
            android:height="64dp"/>
        <padding
            android:top="1dp"
            android:right="1dp"
            android:bottom="1dp"
            android:left="1dp"/>
        <solid android:color="#10CCCCCC"/>
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <corners android:radius="64dp"/>
        <solid android:color="#009A3D"/>
        <size
            android:width="64dp"
            android:height="64dp"/>
        <padding
            android:top="1dp"
            android:right="1dp"
            android:bottom="1dp"
            android:left="1dp"/>
        <solid android:color="#20CCCCCC"/>
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <corners android:radius="64dp"/>
        <solid android:color="#009A3D"/>
        <size
            android:width="64dp"
            android:height="64dp"/>
        <padding
            android:top="1dp"
            android:right="1dp"
            android:bottom="1dp"
            android:left="1dp"/>
        <solid android:color="#30CCCCCC"/>
    </shape>
</item>
<item>
    <shape android:shape="oval">
        <corners android:radius="64dp"/>
        <solid android:color="#009A3D"/>
        <size
            android:width="64dp"
            android:height="64dp"/>
        <padding
            android:top="1dp"
            android:right="1dp"
            android:bottom="1dp"
            android:left="1dp"/>
        <solid android:color="#50CCCCCC"/>
    </shape>

</item>

<!-- Background -->
<item>
    <shape android:shape="oval">

        <corners android:radius="64dp"/>
        <solid android:color="#009A3D"/>
        <size
            android:width="64dp"
            android:height="64dp"/>
    </shape>
</item>

在你的布局文件中你可以使用它...

<Button
        android:id="@+id/add_btn"

        android:text="+"
        android:textColor="#FFFDFC"
        android:textSize="44sp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="50dp"
        android:layout_marginBottom="40dp"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:clickable="true"
        android:enabled="true"
        android:singleLine="false"
        android:layout_alignParentTop="false"
        android:background="@drawable/round_button"/>

【讨论】:

  • 有趣...这适用于像星星这样的形状吗?
【解决方案4】:

可以在旧平台上使用简单的 java 类模拟浮动操作按钮(带阴影)。

我在这里使用 Faiz Malkani 的版本:https://github.com/FaizMalkani/FloatingActionButton

[请注意,要使其与 Gingerbread 兼容,您需要对他的代码中的动画和透明度调用进行一些 SDK 版本检查。]

【讨论】:

  • 这适用于任意形状吗? (矩形、圆角矩形、星形等)
【解决方案5】:

您可以使用 android.support.v7.widget.CardView。

也许不是完美的解决方案,但对我来说正在努力实现我想要的。因此,例如,这是我在我的应用程序中使用的技巧......在一个矩形上,我对结果感到满意。

private View.OnTouchListener touch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        final android.support.v7.widget.CardView card_view = (android.support.v7.widget.CardView) ((View) v.getParent()).findViewById(R.id.card_view);


        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                card_view.setCardElevation(6);
                card_view.setScaleX(1.007f);
                card_view.setScaleY(1.007f);
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:

                card_view.setCardElevation(3);
                card_view.setScaleX(1f);
                card_view.setScaleY(1f);
                break;
        }
        return false;
    }
};

在我使用的 xml 文件中:

<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"

android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent"

card_view:cardCornerRadius="2dp"
card_view:cardMaxElevation="6dp"
card_view:cardElevation="3dp">

【讨论】:

  • 也许增加圆角半径也可以给我们一个圆!
  • 我试过了......但不幸的是它几乎是一个圆形......它是一个椭圆形
  • soooo 将大小设置为正方形:P
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多