Android修行手册 - 阴影效果的几种实现以及一些特别注意点

这篇具有很好参考价值的文章主要介绍了Android修行手册 - 阴影效果的几种实现以及一些特别注意点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总
游戏脚本-辅助自动化 Android控件全解手册 再战Android系列
Scratch编程案例 软考全系列 Unity3D学习专栏
蓝桥系列 ChatGPT和AIGC

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

android 阴影,熬夜再战Android系列,android,阴影效果,elevation,CardView

👉实践过程

😜阴影原理

我们处在一个三维空间中,有阳光的地方就有阴影,真实的阴影其实是一种光影的效果。一个有光照的角度,加上物体有厚度就会形成一个阴影层。知道了阴影的产生需要光源和高度,技术也是如此,技术的实现是基于现实生活的现象。在各种平台开发中阴影基本都是以拔高 Z 轴来实现的。
可以理解为有一束斜光投向屏幕,Z 轴值越大,离光就越近,阴影的范围就越大;Z 轴值越小,离光就越远,阴影的范围就越小。
在 Android 平台实现阴影的方式有三种。

😜elevation

android5.0 引入了Z轴的概念,于是就有着这种风格,也就是目前比较火的Material Design。

  1. android:elevation 设置该组件“浮”起来的高度,to难过过设置该属性可以让该组件呈现3D效果。
  2. android:translationZ 设置该组件在Z方向(垂直屏幕方向)上的位移。

说起 Z 轴, translateZ 一般用来控制的弹起效果或其他动画效果。
而阴影直接使用的是 elevation 属性,是写在 xml 文件中的静态配置。

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

上面代码中 elevation 就是设置偏移阴影。一般这一个属性就足够了,但是设计的需求总是多种多样,就引出了另外两个属性 outlineAmbientShadowColor 和 outlineSpotShadowColor
outlineAmbientShadowColor:这是主光源,也就是发光点是什么
outlineSpotShadowColor:这是环境周围的光色
还有一个很少用到的属性 环境阴影透明度(ambientShadowAlpha),透明度的取值为0-1,可根据实际情况来调试。需要通过主题设置来实现:

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

这种实现方案只是很普通的阴影,一般会出现一边的阴影比较浓,一边的比较淡,而且受限制,需要API 21 以上才可用。

😜layer-list

产品又说了:啊,你这很普通啊喂,能不能实现那种毛茸茸的感觉呢。
那就得使用 layer-list 。
layer-list 的方式的就一层一层绘制叠加,下面的 item 总是覆盖在上面的 item 上。
这种方式是最推荐的,不能性能好且实现的效果多种多样。但是因为实现上要多做不少内容所以很容易被人们抛弃。

 <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:left="2dp"
        android:top="2dp">
        <shape android:shape="rectangle" >
		 <!--这里可以是梯度的值,也可以是solid,看实际的效果自己调测-->
            <gradient
                android:angle="90"
                android:centerX="50"
                android:centerY="50"
                android:endColor="#03000000"
                android:startColor="#0F000000" />
            <corners
                android:bottomLeftRadius="6dip"
                android:bottomRightRadius="6dip"
                android:topLeftRadius="6dip"
                android:topRightRadius="6dip" />
        </shape>
    </item>

    <item
        android:bottom="3dp"
        android:right="3dp">
        <shape android:shape="rectangle" >
            <solid android:color="#FFFFFF"/>
            <corners
                android:bottomLeftRadius="6dip"
                android:bottomRightRadius="6dip"
                android:topLeftRadius="6dip"
                android:topRightRadius="6dip" />
        </shape>
    </item>
</layer-list>

如上面的代码是用两个颜色块叠加实现的,从上面一看就知道代码量蹭蹭的涨。还有更复杂的是用一条条线条叠加来实现,避免了中间区域无用的绘制。
android 阴影,熬夜再战Android系列,android,阴影效果,elevation,CardView

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <padding
                android:bottom="2dp"
                android:left="2dp"
                android:right="2dp"
                android:top="2dp" />
            <solid android:color="#0DFFFFFF" />
            <corners android:radius="16dp" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <padding
                android:bottom="2dp"
                android:left="2dp"
                android:right="2dp"
                android:top="2dp" />
            <solid android:color="#10FFFFFF" />
            <corners android:radius="16dp" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <padding
                android:bottom="2dp"
                android:left="2dp"
                android:right="2dp"
                android:top="2dp" />
            <solid android:color="#15FFFFFF" />
            <corners android:radius="16dp" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <padding
                android:bottom="2dp"
                android:left="2dp"
                android:right="2dp"
                android:top="2dp" />
            <solid android:color="#20FFFFFF" />
            <corners android:radius="16dp" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <padding
                android:bottom="2dp"
                android:left="2dp"
                android:right="2dp"
                android:top="2dp" />
            <solid android:color="#30FFFFFF" />
            <corners android:radius="16dp" />
        </shape>
    </item>
    <item>
        <shape>
            <solid android:color="#FFFFFF" />
            <corners android:radius="16dp" />
        </shape>
    </item>
</layer-list>

😜CardView

这个实现上也挺简单,需要 androidx.cardview.widget.CardView ,表现效果上很不错,但是也有缺点就是多嵌套了一层父类,这对性能又是一层消耗。

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="1670mm"
    android:layout_height="940mm"
    android:layout_centerInParent="true"
    app:cardElevation="10mm"
    tools:ignore="InOrMmUsage,ContentDescription,HardcodedText">
    <TextView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:text="CardView"
      android:gravity="center"
      android:background="#fff000"/>
</androidx.cardview.widget.CardView>

😜注意事项

  1. 控件必须设置背景 background,且不能为透明,因为透明的view是没有阴影的。

  2. 阴影是绘制于父控件上的,所以控件与父控件的边界之间需有足够空间绘制出阴影才行。

  3. 有网友提出图片尽量使用.png, 防止图片过大导致 oom 或者 elevation 失效

  4. 经过本人测试,除了上述原因外,还有:background 是图片时、background 直接设置具体颜色值时容易无效如:#ffaacc,background 是 shape 时效果最好

  5. 设置 elevation 的 View 最好是 ViewGroup 子类
    今天在 Android 界面的设计中遇到一个问题,我想要用 elevation 设置阴影效果,也就是对某个 View 添加 android:elevation,但是没有效果,解决办法是必须给这个 view 设置 background ,这样就会出来阴影的。就是我们说的注意事项一。
    默认情况下,阴影是由 background 提供的,如果控件没有设置 background,则需要加上
    android:outlineProvider=“bounds”

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
android 阴影,熬夜再战Android系列,android,阴影效果,elevation,CardView文章来源地址https://www.toymoban.com/news/detail-846974.html

到了这里,关于Android修行手册 - 阴影效果的几种实现以及一些特别注意点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android修行手册 - VideoView全解-上

    往期文章分享 点击跳转=《导航贴》- Unity手册,系统实战学习 点击跳转=《导航贴》- Android手册,重温移动开发 本文约4.8千字,新手阅读需要9分钟,复习需要3分钟 【 收藏随时查阅不再迷路 】 众所周知,人生是一个漫长的流程,不断 克服困难 ,不断反思前进的过程。在这

    2024年02月01日
    浏览(30)
  • Android修行手册-POI操作中文API文档

    Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总 游戏脚本-辅助自动化 Android控件全解手册 再战Android系列 Scratch编程案例 软考全系列 Unity3D学习专栏 蓝桥系列 ChatGPT和AIGC 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游戏等

    2024年01月16日
    浏览(35)
  • Android修行手册-多路USB外接摄像头

    点击跳转=Unity3D特效百例 点击跳转=案例项目实战源码 点击跳转=游戏脚本-辅助自动化 点击跳转=Android控件全解手册 点击跳转=Scratch编程案例 点击跳转=软考全系列 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游戏等) 有什么需要欢

    2024年02月07日
    浏览(40)
  • Android修行手册-基础优化系列图片篇,ios音视频面试内容

    图片款=(480/480)*400=400 占用内存为300*400*4=480000 那么它占用内存为什么是变化的? Android会先解析图片文件本身的数据格式,然后还原成Bitmap对象,Bitmap的大小就跟上面的计算方式相关联。 再举例1080*452的png图片,图片占用存储空间大小为56kb,内存如图: 上图一目了然,不

    2024年04月27日
    浏览(36)
  • Android修行手册 - 文档插件Aspose的jar包去除所有限制学习版

    专栏分享 点击跳转=Unity3D特效百例 点击跳转=案例项目实战源码 点击跳转=游戏脚本-辅助自动化 点击跳转=Android控件全解手册 点击跳转=Scratch编程案例 众所周知,人生是一个漫长的流程,不断 克服困难 ,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考

    2024年02月13日
    浏览(27)
  • Android 截屏实现的几种方式

    image.png image.png 1、View 截屏 View 截图是将当前 View 界面截取下来,而对于屏幕上其他信息比如:状态栏或其他应用的界面将无法截取。 1.1 截取除了导航栏之外的屏幕 1.2 截取某个控件或者区域 2、WebView 截屏 WebView 截屏有四种方式 2.1 使用 capturePicture() 方法(已废弃) private

    2024年02月06日
    浏览(26)
  • Android 实现GIF播放的几种方式

    Glide 是Android上比较常见的图片加载框架,其介绍可以看Android Glide简单使用。 布局文件,GIF文件可以在 ImageView 里面显示 调用 load() 方法,导入图片并用 ImageView 显示 当然这样的方式只能循环播放,如果想要指定循环次数,需要调用 GifDrawable 的 setLoopCount() 方法。 android-gif-d

    2024年02月02日
    浏览(23)
  • 拉普拉斯矩阵的定义,常见的几种形式以及代码实现?

    拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵、基尔霍夫矩阵或离散拉普拉斯算子,主要应用在图论中,作为一个图的矩阵表示。对于图 G=(V,E),其Laplacian 矩阵的定义为 L=D-A,其中 L 是Laplacian 矩阵, D=diag(d)是顶点的度矩阵(对角矩阵),d=rowSum(A),对角线上元素依次为各个顶点

    2023年04月25日
    浏览(36)
  • Python 实现单例模式的几种方式以及存在的问题

    Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。 直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象 先执行了类的__new__方法(我们没写时,默认调用ob

    2024年01月22日
    浏览(33)
  • Unity案例-实现心电图效果(1),写给1-3年Android程序员的几点建议

    👉 前提 小空是开发医疗产品软件的,所以心电图是必须要绘制的效果。刚开始的时候小空是准备使用一个闪烁粒子预制体,然后利用代码进行不断的创建,但是想想总感觉哪里不对。一直没有真实的动手进行下去。 直到某一天突然的灵光乍现:完全可以利用一个粒子的拖尾

    2024年04月25日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包