Android控件的阴影效果的实现方式有很多种,这里介绍一下另一种Android原生的阴影实现方案(API28及以上)。

1、阴影原理

阴影效果的实现采用的是Android原生的View的属性,拔高Z轴。Z轴会让View产生阴影的效果:

可以理解为有一束斜光投向屏幕,Z 轴值越大,离光就越近,阴影的范围就越大;Z 轴值越小,离光就越远,阴影的范围就越小。

2、Z轴

Z=elevation+ translationZ
拔高Z轴可以通过控制elevation和translationZ。区别:

elevation:一般是写在 xml 文件中做静态配置,单纯的控制Z轴;

translateZ:除了控制Z轴,还可以用来控制动画效果,比如我们点击按钮时希望它有一个弹起的效果:

由于我们只需要实现阴影效果,所以这里只配置elevation即可。

3、如何设置阴影?

阴影的效果由Z轴(elevation)、光源(shadowColor)和环境阴影透明度(ambientShadowAlpha)三者综合决定的。所以我们需要对这三者进行合理的设置:

Z轴(elevation)

直接在需要产生阴影的布局根布局里设置elevation即可;

光源(shadowColor)

产生阴影的光源有两个:主光源(key light)和环境光源(ambient light)。实际产生的阴影是由这两个光源组合产生的。
光源分布的位置:

看看各个光源的展示效果:

具体代码:

<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="250dp"android:layout_height="match_parent"android:background="@drawable/common_bg"android:elevation="25dp"android:outlineAmbientShadowColor="#B309101D"android:outlineSpotShadowColor="@color/transparent">...</androidx.constraintlayout.widget.ConstraintLayout>

elevation:设置Z轴

outlineSpotShadowColor:设置主光源

outlineAmbientShowColor:设置环境光源

环境阴影透明度(ambientShadowAlpha)

环境阴影透明度是通过主题theme设置的:

<style name="AppTheme" parent="Theme">...<item name="android:ambientShadowAlpha">1</item>...
</style>

透明度的取值为0-1,可根据实际情况来调试。

4、注意事项

除了设置上面的三个条件Z轴(elevation)、光源(shadowColor)和环境阴影透明度(ambientShadowAlpha),还有其他几个点需要注意的:

  1. 一定要设置背景,而且是不透明的背景,因为阴影是通过投影来产生的,没有或透明的背景是无法产生的阴影的。设置了背景就一定会产生阴影?不一定,这里感觉有bug,有些背景图片无法产生阴影,网上查了一下,也有人遇到:在background是图片时、直接设置具体颜色值时容易无效,比如:#ffaacc。感觉background设置为点9图和shape时效果最好;
  2. 阴影是绘制在父控件的空间上的,所以在子控件和父控件的边界之间要留一定的空间来绘制阴影;
  3. 设置elevation的View最好是ViewGroup的子类;

5、总结

总结起来,设置阴影就需要:

  1. 设置Z轴(elevation);
  2. 光源:outlineSpotShadowColor(主光源)、outlineAmbientShowColor(环境光源);
  3. 环境阴影透明度(ambientShadowAlpha);
  4. 设置不透明背景(background);
  5. 留出阴影绘制空间;

Android原生阴影实现方案(API28及以上)相关推荐

  1. Android 双u盘方案

     1      L1813系统上双U盘设计方案--系统设计 1.1     方案背景 Android原生的磁盘管理方案,设计的思想是将EMMC上的空间通过sdcard的server模拟成一个Sto ...

  2. 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)

    前篇<献给android原生应用层开发初学者技术架构选型和整合的方案思路(一)> 本篇侧重于安卓创建的创建和后续 demo 中用到的 lib 在 gradle 中的依赖配置,本文假设您已经 ...

  3. uniapp android原生,在uni-app项目中集成Android原生工程

    [TOC] # 在uni-app项目中集成Android原生工程 按照官方的方案,我们如果进行本地打包的话,需要重新创建一个Android原生工程,于是就会导致我们管理多个项目,切来切去的也麻烦. 经 ...

  4. Android Webview H5 秒开方案实现

    本文首发于微信公众号「玉刚说」 原文链接:Android Webview H5 秒开方案实现 前言 现在许多app都嵌入了H5页面, 然而WebView加载速度慢这个问题却一直影响着用户的体验, 所以 ...

  5. Kotlin 风险高、RxJava 已过时,Android 原生开发现状分析!

    当你好不容易学会了某个框架或者工具,觉得它很好用的时候,它或许就要过时了. 英文:The State of Native Android Development 作者:Vasiliy Zukanov, ...

  6. Android原生系统开发如何优雅的提供系统级的API供第三方程序调用?

    目录 故事背景 二.开发步骤 Step1.添加一个专属系统级服务 2.1.1.模仿Android原生服务接口,如WifiManager,规划自己的Manager 2.1.2.为我们的Manager生成 ...

  7. Android 原生控件之一 TextView

    Android 原生控件之一 TextView 前言 来源 开始 XML属性 1.android:allowUndo 2.android:autoLink 3.android:autoSizeMaxT ...

  8. Android原生UI开发框架 《Jetpack Compose入门到精通》最全上手指南

    前言 在去年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明 ...

  9. 敢问路在何方?国外安卓大神对Android原生开发现状剖析

    点击上方"终端研发部",选择"星标" 回复"资源",领取全网最火的Java核心知识总结~ 前言 原文地址:The State of Nati ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:卷积神经网络
  2. HDU2108(凹多边形还是凸多边形)
  3. Python3 集合set
  4. LVS +DR +keepalived高可用性web集群
  5. React学习(3)——列表、键值与表单
  6. 构建一个计算机网络,计算机网络--网络构建(一)
  7. UIView的autoresizingMask属性
  8. WPF RichTextBox自动调整高度
  9. 系统蓝屏代码为0X00000024的解决办法
  10. Atitit.java jar hell解决方案-----Djava.ext.dirs in ide envi..
  11. 远程连接ubuntu的MongoDB遇到的坑
  12. 未来的工作都被计算机代替,未来10年,50%的工作将被机器取代?而这些职业却无法被取代...
  13. 数据结构——二叉链表创建二叉树(C语言版)
  14. 算法设计与分析(屈婉玲)pdf
  15. 破解密码——利用粘滞键漏洞破解Windows 7 PIN
  16. 【转载】网站域名备案相关流程介绍
  17. Chrome远程调试手机端UC浏览器
  18. matlab求圆的共切线,Matlab或Python怎么作出两个圆的公切线
  19. C盘空间大释放——Downloaded Installations
  20. Halcon椭圆测量

热门文章

  1. [4/101] 101次面试之经典面试题
  2. 【漏洞复现】和信创天云桌面系统—任意文件上传
  3. 低线城市外卖市场逐渐下沉,创业者如何有效开展本地外卖平台
  4. Linux配置主机名
  5. php开发环境之samba服务以及docker容器安装配置
  6. python财务应用是什么意思,python财务应用案例代码
  7. MySQL not in 优化方案
  8. Linux 中安装 JDK(rpm包安装)
  9. 【绿冰壶的脚本小屋】第二期:基于icmp协议开发简易ping工具
  10. devc++球吃食物C语言代码