在API < 21(5.0 Lollipop)中是否有实现Material风格阴影的方法?

11
Material design非常强调“纸张”这一比喻。为了制作这些,阴影是必不可少的。由于Material design是一种哲学而不是API(尽管它已经内置在L中),因此应该在任何地方(Windows Forms、HTML/CSS等)进行操作。 我如何在Android API 14到20中实现这一点? 请注意,预制的PNG对于圆形和其他非正方形的形状并不实用。

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

13

为什么?这在标准的Android API 20中可用吗?它是如何工作的? - Ky -
我进行了更多的研究并编辑了我的回答,现在更有帮助了吗? - Ethan
1
非常好!谢谢你,我将来可能会用到它! - Ky -
为什么这与从xml或java设置有关?我不明白为什么这不能从xml中工作... :( - Morteza Rastgoo

4

这只是一个粗略的示例,展示了如何使用IT技术来解决问题。

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

有趣...这对星形图形有效吗? - Ky -

4
在Lollipop之前渲染阴影并不容易,但也是有可能的。关键在于阴影只是一个视图的黑色模糊形状。您可以自己实现它。
以下是步骤:
  1. 将投射阴影的视图绘制到具有设置为LightingColorFilter(0,0)的位图中
  2. 使用ScriptIntrisincBlur进行模糊处理
  3. 绘制形状
  4. 在形状上方绘制视图
听起来需要写很多代码,但它适用于所有情况,所以您可以轻松地处理所有视图。

不错的解决方案!但我希望有一种不需要Java的方法,这样就不会出现跳过效果(崩溃、早期返回、分支语句等)的可能性。 - Ky -

1

您可以使用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">

也许增加那个角的半径就可以得到一个圆形! - Ky -
我尝试过那样做...但不幸的是,它只得到了一个几乎是圆形的形状...它是一个椭圆。 - Cristi Maris
把大小设置成正方形的样子 :P - Ky -

1
浮动操作按钮(带阴影)可以通过一个简单的Java类在旧平台上模拟。
我在这里使用的是Faiz Malkani的版本:https://github.com/FaizMalkani/FloatingActionButton [请注意,要使其与Gingerbread兼容,您需要在他的代码中放置一些SDK版本检查来处理动画和透明度调用。]

这对任意形状都适用吗?(矩形、圆角矩形、星形等) - Ky -

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接