Android原生阴影实现方案(API28及以上)
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),还有其他几个点需要注意的:
- 一定要设置背景,而且是不透明的背景,因为阴影是通过投影来产生的,没有或透明的背景是无法产生的阴影的。设置了背景就一定会产生阴影?不一定,这里感觉有bug,有些背景图片无法产生阴影,网上查了一下,也有人遇到:在background是图片时、直接设置具体颜色值时容易无效,比如:#ffaacc。感觉background设置为点9图和shape时效果最好;
- 阴影是绘制在父控件的空间上的,所以在子控件和父控件的边界之间要留一定的空间来绘制阴影;
- 设置elevation的View最好是ViewGroup的子类;
5、总结
总结起来,设置阴影就需要:
- 设置Z轴(elevation);
- 光源:outlineSpotShadowColor(主光源)、outlineAmbientShowColor(环境光源);
- 环境阴影透明度(ambientShadowAlpha);
- 设置不透明背景(background);
- 留出阴影绘制空间;
Android原生阴影实现方案(API28及以上)相关推荐
- Android 双u盘方案
1 L1813系统上双U盘设计方案--系统设计 1.1 方案背景 Android原生的磁盘管理方案,设计的思想是将EMMC上的空间通过sdcard的server模拟成一个Sto ...
- 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)
前篇<献给android原生应用层开发初学者技术架构选型和整合的方案思路(一)> 本篇侧重于安卓创建的创建和后续 demo 中用到的 lib 在 gradle 中的依赖配置,本文假设您已经 ...
- uniapp android原生,在uni-app项目中集成Android原生工程
[TOC] # 在uni-app项目中集成Android原生工程 按照官方的方案,我们如果进行本地打包的话,需要重新创建一个Android原生工程,于是就会导致我们管理多个项目,切来切去的也麻烦. 经 ...
- Android Webview H5 秒开方案实现
本文首发于微信公众号「玉刚说」 原文链接:Android Webview H5 秒开方案实现 前言 现在许多app都嵌入了H5页面, 然而WebView加载速度慢这个问题却一直影响着用户的体验, 所以 ...
- Kotlin 风险高、RxJava 已过时,Android 原生开发现状分析!
当你好不容易学会了某个框架或者工具,觉得它很好用的时候,它或许就要过时了. 英文:The State of Native Android Development 作者:Vasiliy Zukanov, ...
- Android原生系统开发如何优雅的提供系统级的API供第三方程序调用?
目录 故事背景 二.开发步骤 Step1.添加一个专属系统级服务 2.1.1.模仿Android原生服务接口,如WifiManager,规划自己的Manager 2.1.2.为我们的Manager生成 ...
- Android 原生控件之一 TextView
Android 原生控件之一 TextView 前言 来源 开始 XML属性 1.android:allowUndo 2.android:autoLink 3.android:autoSizeMaxT ...
- Android原生UI开发框架 《Jetpack Compose入门到精通》最全上手指南
前言 在去年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明 ...
- 敢问路在何方?国外安卓大神对Android原生开发现状剖析
点击上方"终端研发部",选择"星标" 回复"资源",领取全网最火的Java核心知识总结~ 前言 原文地址:The State of Nati ...
最新文章
- 吴恩达老师深度学习视频课笔记:卷积神经网络
- HDU2108(凹多边形还是凸多边形)
- Python3 集合set
- LVS +DR +keepalived高可用性web集群
- React学习(3)——列表、键值与表单
- 构建一个计算机网络,计算机网络--网络构建(一)
- UIView的autoresizingMask属性
- WPF RichTextBox自动调整高度
- 系统蓝屏代码为0X00000024的解决办法
- Atitit.java jar hell解决方案-----Djava.ext.dirs in ide envi..
- 远程连接ubuntu的MongoDB遇到的坑
- 未来的工作都被计算机代替,未来10年,50%的工作将被机器取代?而这些职业却无法被取代...
- 数据结构——二叉链表创建二叉树(C语言版)
- 算法设计与分析(屈婉玲)pdf
- 破解密码——利用粘滞键漏洞破解Windows 7 PIN
- 【转载】网站域名备案相关流程介绍
- Chrome远程调试手机端UC浏览器
- matlab求圆的共切线,Matlab或Python怎么作出两个圆的公切线
- C盘空间大释放——Downloaded Installations
- Halcon椭圆测量