为什么Google没有在安卓里ps4向下兼容容setElevation这个方法

20143人阅读
ANDROID L(5)
转载请注明本文出自大苞米的博客(),谢谢支持!
Android L:
Google已经确认Android L就是Android Lollipop(5.0)。
Google之前就已经提前推出了Android L Developer Preview(开发者预览版)来帮助开发者更快的了解Android特性,而不久前也推出了64位的模拟器镜像,而且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市。
相信Android L正式版离我们也不远了,所以是时候开始学习Android L了!
关于Android L如何配置模拟器和创建项目,如果大家有兴趣的话可以看看我之前的一篇文章:
Material Design:
Material Design是Google推出的一个全新的设计语言,它的特点就是拟物扁平化。
Material Design包含了很多内容,我大致把它分为四部分:
主题和布局——
视图和阴影——
UI控件——
今天就先来说说第二部分——Material视图和阴影
视图和阴影
View的大小位置都是通过x,y确定的,而现在有了z轴的概念,而这个z值就是View的高度(elevation),而高度决定了阴影(shadow)的大小。
View Elevation(视图高度)
View的z值由两部分组成,elevation和translationZ(它们都是Android L新引入的属性)。
eleavation是静态的成员,translationZ是用来做动画。
Z = elevation + translationZ
在layout中使用&android:elevation属性去定义&
在代码中使用&View.setElevation&方法去定义&
设置视图的translation,可以使用View.setTranslationZ方法&
新的ViewPropertyAnimator.z和ViewPropertyAnimator.translationZ方法可以设置视图的elevation值
新的属性值:translationZ允许你创建一个动画暂时的反应出View的高度值(elevation)变化。
这对于响应触摸手势很有用处,请看下面代码(官方Demo中的代码):
一个简单触摸监听,在点击和抬起的时候分别设置translationZ的值,效果如下图所示:
Shadows and Outlines(阴影和轮廓)
视图的背景边界决定了默认的阴影形状。轮廓(Outlines)代表了图形对象的外形状,并确定了对于触摸反馈的波纹区域。
在Android L中设置一个阴影很简单,只需要两点:
1.设置eleavation值
2.添加一个背景或者outline
可以在xml中通过定义一个背景来设置outline:
也可以通过代码来创建一个outline:
给视图设置一个outline(如果为了防止一个视图产生阴影可以设置outline为null):
上面的方法在Android L5.0正式版中已经被替换,下面我再介绍以下Android L5.0设置outline的方法:
ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
public void getOutline(View view, Outline outline) {
int size = getResources().getDimensionPixelSize(R.dimen.fab_size);
outline.setOval(0, 0, size, size);
fab.setOutlineProvider(viewOutlineProvider);
下图是使用不同eleavation值产生的阴影效果:
下图是不同背景/轮廓产生的阴影和拖拽效果:
Drawable Tinting(着色)
对于Android L还有一个独特的特点就是现在可以定义图片的alpha遮罩,并且可以轻松的使用android:tint属性去调整色调。
下面是一个使用tint属性给背景调整不同颜色的例子:
Clipping Views(裁剪视图)
可以使用View.setClipToOutline方法去剪切一个视图的outline区域。
只有rectangle,circle, 和round rectangle outlines支持裁剪(Outline.canClip方法用来判断是否可以裁剪)
为了裁剪一个可绘制的视图形状,需要先设置一个outline然后调用View.setClipToOutline方法:
下面请看一个使用裁剪的例子:
首先创建一个轮廓,给轮廓设置区域大小,添加轮廓到视图上,确认裁剪,效果图如下:
因为裁剪视图是一个很耗资源的操作,所以当裁剪一个视图时不要添加动画(为了达到这个效果可以使用Reveal Effect动画,动画篇会介绍)。
我将Material Design分为如下四部分:
主题和布局——
视图和阴影——
UI控件——
本文的视图和阴影非常重要,因为在以后Android L的开发中会经常用到。
当我把Android L所有特性介绍之后就会着手开始写实例Demo了,配合实例Demo相信会更容易理解。
剩余的UI控件,动画,我会陆续更新,敬请期待。。。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:413925次
积分:4969
积分:4969
排名:第4502名
原创:53篇
评论:643条
(2)(3)(1)(1)(1)(1)(1)(4)(3)(1)(4)(2)(3)(6)(1)(4)(4)(4)(6)(2)&nbsp&#8250&nbsp&nbsp&#8250&nbsp
关于使用 CardView 开发过程中要注意的细节
原文出处:&2014 年,随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 ―― CardView。经历了相当长的一段时间相信许多 Android 开发者都已经应用了这个控件,现在才写这篇文章可能有点晚,但对于刚刚开始使用的开发者以及其他已经使用了一段时间但做出来效果不好的同学应该能帮上点小忙。正题开始~
◆ 注意不同 SDK 版本(低于 Lollipop 21)上的边距(Margin)效果Google 在 Android Lollipop 中引入了 Material Design 设计中的阴影(Elevation)和 Z 轴位移,其目的就是突出界面中不同元素之间的层次关系。为了统一不同系统版本的视觉效果,Google 针对 SDK 21 以下的系统给 CardView 加入一个 Elevation 兼容(即 XML 中的 app:cardElevation 和 Java 代码中的 setCardElevation)。然而,在低版本中设置了 CardElevation 之后 CardView 会自动留出空间供阴影显示,而 Lollipop 之后则需要手动设置 Margin 边距来预留空间,导致我在设置 Margin 在 Android 5.x 机器上调试好后,在 Kitkat 机器调试时发现边距非常大,严重地浪费了屏幕控件。因此,我们需要自定义一个 dimen 作为 CardView 的 Margin 值:创建 /res/value 和 /res/value-v21 资源文件夹于项目对应 Module 目录下,前者放置旧版本/通用的资源文件(了解的可以跳过),后者放置 21 及更高 SDK 版本的资源文件。在 value 内的 dimen.xml 创建一个 Dimension (&dimen& 属性),随便命个名(如 xxx_card_margin)并填入数值 0dp。接着在 value-v21 文件夹内的 dimen.xml 创建名字相同的 Dimension,并填入你期望的预留边距(一般和 CardElevation 阴影大小相同)最后,在你布局中的 CardView 中设置&android:layout_margin=&@dimen/xxx_card_margin&这样依赖就解决了低版本中边距过大或者视觉效果不统一的问题了。&◆ 为你的 Card 添加点击效果当使用 CardView 的场合是作为列表中的一个 Item 且直接单击 Item 有相应的操作,那么就有必要加上视觉反馈来告诉用户这个 Card 是可点击的。(此处用其他例子代替 CardView 演示)如果你是用了 AppCompat v7 支持库:那么你可以直接给 CardView 加上&android:foreground=&?attr/selectableItemBackground& 这个属性会在 Lollipop 上自动加上 Ripple 效果,在旧版本则是一个变深/变亮的效果。如果你没使用这个支持库或者觉得这个效果在旧版本显得有点僵硬:你可以尝试自定义一个 Drawable,和上一条一样根据不同 SDK 版本分别编写不同的效果,在此就不多介绍自定义 Drawable 的方法。&◆ 让点击效果更加贴近 Material Design上面曾提到过一个概念:Z 轴位移,即决定元素层次的深度,与 Elevation 大小相加构成实际显示的阴影深度。在 Material Design Guidelines 中有建议卡片、按钮这类元素触摸时应当有一个浮起的效果,也就是增大 Z 轴位移(设计缘由可以参照 NovaDNG 在知乎的回答:)要实现这个效果并不难,我们只需要借助 Lollipop 的一个新属性&android:stateListAnimator&(PS:这也意味着这个方法不可以用于旧版本系统QAQ)首先,创建一个 TranslationZ 的变换动画放在 /res/anim,自己取一个名(如 touch_raise.xml),加入以下内容:&?xml&version=&1.0&&encoding=&utf-8&?&
&selector&xmlns:android=&/apk/res/android&&
&item&android:state_enabled=&true&&android:state_pressed=&true&&
&objectAnimator
android:duration=&@android:integer/config_shortAnimTime&
android:propertyName=&translationZ&
android:valueTo=&@dimen/touch_raise&
android:valueType=&floatType&&/&
&objectAnimator
android:duration=&@android:integer/config_shortAnimTime&
android:propertyName=&translationZ&
android:valueTo=&0dp&
android:valueType=&floatType&&/&
&/selector&然后为你需要添加效果的 CardView(其他 View 同理)所在的 Layout XML 复制多一份到 /res/layout-v21,然后在新的那份 XML 的 CardView 中加入属性&android:stateListAnimator=&@anim/touch_raise&。这样,你的卡片按住时就会有浮起(阴影加深)的效果了。&◆ 尽量不要用作固定高度的 List Item除了横向滚动列表和类似 Google Play 音乐中的带封面图片卡片 Item,其他地方应该尽量避免做固定高度的卡片。举一个错误例子,我之前写的快递查询应用「水表助手」,快递卡片就是用了固定宽度(误人子弟系列QAQ)不需要用卡片的地方也不应该使用,滥用只会让用户更快地厌倦你的界面设计。(这个是复制自官方的错误范例)&◆ 低版本(低于 Lollipop)的 setElevation 不是万能的由于缺少一些系统 API(如 RenderThread),CardView 中的 Elevation 兼容实现并不完美,和真正的实现方法还是有较大的差距(不是指效果),所以调用 setCardElevation 也不能随心所欲地传入一个 Float 型,在低版本系统使用时应当处理一下传入的数值(似乎只能是整数,碰到过错误但是没详细研究……懒癌请原谅)或加上 try-catch (不推荐)。――――――――我是分割线――――――――除了本文提到的五个点,CardView 还有许多需要注意的地方,在这里就不一一列举了~对于实现 Material Design 卡片,CardView 并不是唯一的选择,也有人通过自己写 Drawable、Layout 来实现出性能更好的卡片效果,但对在这方面不擅长的同学来说 CardView 算是最好的选择,毕竟是 Google 自家的东西,在效果、兼容性方面都十分到位。
上一篇: 原文出处: http://blog.csdn.net/lmj/article/details/ 一、概述 距离上一篇博客有段时间没更新了,主要是最近有些私事导致的,那么就先来一篇简单一点的博客脉动回来。 对于加载图片,大家都不陌生,一般为了尽可能避免OOM都会按照如下做
下一篇: 这篇文章只说说那些我关注的变化,完整文档请看官网: http://android-/2015/10/android-support-library-231.html 优化升级 RecyclerView的改变 这个版本最大的变化是动画系统。使用 ItemAnimator 的 canReuseUpdatedViewHolder() 方Google Maps adds in-navigation voice control, elevation info for bicyclists | Android Central

我要回帖

更多关于 setelevation使用 的文章

 

随机推荐