最近项目要求,ui有很多有关于阴影的设计要求,网上找了些实现方式,但都不是很理想。现在闲下来了,就寻思着自己写个阴影布局耍耍,以备后用。先说道说道我找到的几种阴影实现方式:

系统阴影

Andorid 系统自api 21之后就多了一个熟悉 android:elevation ,这是android最新引入的轴的概念,可通过设置elevation来设置阴影(z轴的大小),设置如下:

 <!-- base z depth of the view. -->
<attr name="elevation" format="dimension" /> <TextView
android:id="@+id/shadow1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:text="系统阴影"
android:background="#fff"
android:gravity="center"
android:textSize="14sp"
android:textColor="@color/colorBlack"
android:layout_width="100dp"
android:elevation="3dp"
android:layout_height="80dp"/>
 

效果也是不错,可以完成一些简单的阴影设置效果。

但需要注意些细节,不然 elevation 可能会无效:

  • 父布局要保留足够的空间,elevation本身不占有view的大小
  • 需要设置背景色且不可设置为透明色
  • 不能设置是否为扩散的还是指定方向的

layer-list 伪阴影

为什么说是伪阴影呢,layer-list本身很强大,器支持的层叠式绘制基本可以解决我们大多说的背景设计,对于一些要求不是很严格的阴影用它也不是不可以,但效果是真的不好,毕竟shape提供的层叠()并不支持模糊绘制(或者可以选择使用模糊背景图片绘制)。下面给一个用layer-list绘制的阴影做参考。

 <TextView
android:id="@+id/shadow2"
app:layout_constraintStart_toEndOf="@id/shadow1"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="50dp"
android:layout_marginTop="20dp"
android:text="layer-list阴影"
android:gravity="center"
android:background="@drawable/shadow_layer"
android:textSize="14sp"
android:textColor="@color/colorBlack"
android:layout_width="100dp"
android:layout_height="80dp"/> <!--shadow_layer.xml -->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="3dp"
android:left="3dp">
<shape android:shape="rectangle">
<solid android:color="#333333"/>
<gradient android:startColor="#80ff0000"
android:type="radial"
android:centerX="0.5"
android:centerY="0.5"
android:gradientRadius="30"
android:endColor="#10ff0000"/>
<size android:width="100dp" android:height="80dp"/>
</shape>
</item> <item android:bottom="3dp"
android:right="3dp">
<shape android:shape="rectangle">
<solid android:color="#fff"/>
<size android:width="100dp" android:height="80dp"/>
</shape>
</item> </layer-list>

效果比较生硬,其本质就是颜色的渐变,如下:

还有如让ui切阴影背景图,但由于控件大小规格差异较大,风格差异较大,并不推荐使用。

自定义阴影布局

这是我比较推荐的方式,可参考CardView的阴影实现自定义一个阴影布局实现。其实现是通过 setShadowLayer、setMaskFilter 实现。

 //        mPaint.setShadowLayer(blurRadius,0,0,shadowColor);
if (blurRadius>0){
mPaint.setMaskFilter(new BlurMaskFilter(blurRadius,BlurMaskFilter.Blur.NORMAL));
}

相较于 setShadowLayer 来说,setMaskFilter 可供选中的实现方式要多一个blur实现类型,效果更好些,所以我是通过使用 setMaskFilter 来实现自定义阴影布局。


 <cn.enjoytoday.shadow.ShadowLayout
android:id="@+id/shadow3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/shadow1"
android:layout_marginTop="20dp"
android:text=""
app:shadowRadius="0dp"
app:shadowColor="#333"
app:blurRadius="5dp"
app:xOffset="0dp"
app:yOffset="0dp"
android:layout_marginStart="15dp"
android:gravity="center"
android:background="@drawable/shadow_layer"
android:textSize="14sp"
android:textColor="@color/colorBlack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <TextView
android:padding="5dp"
android:text="自定义应用布局"
android:gravity="center"
android:textSize="14sp"
android:textColor="@color/colorBlack"
android:layout_width="100dp"
android:layout_height="80dp"/> </cn.enjoytoday.shadow.ShadowLayout>

使用

ShadowView 托管于GitHub, 仿照css的Box Shadow 的阴影实现效果设计实现,可通过设置水平、竖直偏移确认阴影方向,可设置模糊半径和圆角半径、阴影颜色等。可通过gradle直接依赖使用:

添加依赖

repositories {
//...
maven { url 'https://jitpack.io' }
} dependencies {
implementation 'com.github.amikoj:ShadowView:1.0.1'
}

xml中使用

   <cn.enjoytoday.shadow.ShadowLayout
android:orientation="vertical"
android:id="@+id/shadowLayout"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:gravity="center"
app:shadowRadius="10dp"
app:shadowColor="#bebebe"
app:bgColor="#fff"
app:xOffset="10dp"
app:yOffset="0dp"
app:blurRadius="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <!--嵌套需要添加阴影的布局 --> </cn.enjoytoday.shadow.ShadowLayout>
 

属性说明

属性名 类型 说明
shadowColor color 阴影渲染颜色
shadowRadius dimension 背景圆角半径(0为矩形)
blurRadius dimension 模糊半径
xOffset dimension 水平位移
yOffset dimension 竖直位移
bgColor color 背景色

代码设置

也可通过代码设置阴影属性:

 shadowLayout.getShadowConfig()   //获取配置类
. setBlurRadius(blurRadius) //设置模糊半径
.setXOffset(xoffset) //设置水平位移,最大为20dp
.setYOffset(yoffset) //设置竖直位移,最大为20dp
.setShadowRadius(shadowRadius) //设置圆角半径,为0时不是圆角
.setShadowColor(shadowColor) //设置阴影颜色
.commit(); //生效修改

Android 布局阴影实现的更多相关文章

  1. 【转】在Android布局中使用include和merge标签

    内容转自:http://fengweipeng1208.blog.163.com/blog/static/21277318020138229754135/ 在我们开发android布局时,经常会有很多 ...

  2. Android成长日记-Android布局优化

    Android常用布局 1. LinearLayout(线性布局) 2. RelativeLayout(相对布局) 3. TableLayout(表格布局) 4. AbsoluteLayou(绝对布局 ...

  3. 【转】Android布局优化之ViewStub

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

  4. Android 布局之LinearLayout

    Android 布局之LinearLayout 1 LinearLayout简介 LinearLayout是线程布局.它包括2个方向(android:orientation):“水平”(horizon ...

  5. Android 布局之RelativeLayout

    Android 布局之RelativeLayout 1 RelativeLayout简介 RelativeLayout是相对布局. RelativeLayout布局属性 1.1 与parent相对的属 ...

  6. Android 布局之TableLayout

    Android 布局之TableLayout 1 TableLayout简介 TableLayout是表格布局.TableLayout 可设置的属性包括全局属性及单元格属性. 1.1 全局属性 有以下 ...

  7. Android 布局之FrameLayout

    Android 布局之FrameLayout 1 FrameLayout简介 对于FrameLayout,官方介绍是:FrameLayout is designed to block out an a ...

  8. Android 布局之GridLayout

    Android 布局之GridLayout 1 GridLayout简介 GridLayout是Android4.0新提供的网格矩阵形式的布局控件. GridLayout的继承关系如下:java.la ...

  9. Xamarin Android布局文件没有智能提示

    Xamarin Android布局文件没有智能提示 在Visual Studio 2015中,Android项目的Main.axml文件没有智能提示,不便于布局文件的编写.解决办法:(1)从Xamar ...

随机推荐

  1. Java异常处理只有Try-Catch吗?

    今天,我们将讨论一个非常重要的主题-Java 中的异常处理.尽管有时可能会对此主题进行过多的讨论,但并非每篇文章都包含有用且相关的信息. Java 中最常见的异常处理机制通常与 try-catch 块 ...

  2. IdentityServer4 保护.net framework webapi

    一.IS4服务器配置 1.新建一个Asp.net  Core MVC程序,模板选择 Empty 2.Nuget添加 IdentityServer4,我这里添加的是2.5.3 3.添加Config文件, ...

  3. PHP页面跳转三种实现方法

    一.header()函数 header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器.header()函数的定义如下 ...

  4. python_thread

    多任务编程:可以有效的利用计算机资源,同时执行多个任务进程:进程就是程序在计算机中一次执行的过程进程 和 程序的区别:    1.程序是一个静态文件的描述,不占计算机的系统资源    2.进程是一个动 ...

  5. Netty学习——protoc的新手使用流程

    Netty学习——protoc的新手使用流程 关于学习的内容笔记,记下来的东西等于又过了一次脑子,记录的更深刻一些. 1. 使用IDEA创建.proto文件,软件会提示你安装相应的语法插件 安装成功之 ...

  6. 使用cookies弹出层每24小时弹出一次

    第一步:下载cookies的库 https://github.com/js-cookie/js-cookie 第二步:设置Cookies的失效时间,这里有两种方法,按天计算和按小时计算 functio ...

  7. 解惑Python模块学习,该如何着手操作...

    Python模块 晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力.然后C.Java.Python-对于零基础入门的,当然是选择Python的人较多了.可朋友说他只是看了简单的语法,可pyth ...

  8. 你知道 http 响应头中的 ETag 是如何生成的吗

    关于 etag 的生成需要满足几个条件 当文件不会更改时,etag 值保持不变.所以不能单纯使用 inode 便于计算,不会特别耗 CPU.这样子 hash 不是特别合适 便于横向扩展,多个 node ...

  9. MVVMLight绑定数据

    我们先新建一个WPF项目MVVMLightDemo,添加GalaSoft.MvvmLight.dll(没有可以自己下载) 然后在项目中添加三个文件夹,如图: 先添加我们的Model,在Model下新建 ...

  10. .Net core-邮件发送(同步,异步)底层代码(欢迎留言讨论)

    using MailKit.Net.Smtp;using MimeKit;using System;using System.Collections.Generic;using System.IO;u ...