阴影效果
Android5.0以前,通常用X和Y两个属性表示View的平面位置,而在Android5.0中,增加了一个新属性Z,对应于垂直方向的位置,让View具有立体的效果,Z属性通过阴影的大小表示View的高低。
View的Z值有两部分组成:
- elevation:静态的,通过android:elevation或 View.setElevation()方法进行设置。
- translationZ:动态的,用来实现动画效果,通过View.setTranslationZ()方法设置。
Z = elevation + translationZ
可以使用 ViewPropertyAnimator.z()和ViewPropertyAnimator.translationZ()方法实现elevation属性的动画效果;
还可以使用StateListAnimator声明elevation动画,比如Button按下的动画效果就是这样实现的。
自定义阴影轮廓
View的背景形状决定了阴影的轮廓,所以,可以使用shape标签自定义形状作为View的background属性,从而自定义阴影的轮廓。
另外,还可以通过代码自定义View的阴影轮廓,一般需要以下几个步骤:
- 新建一个继承于ViewOutlineProvider的类;
- 重载getOutline()方法自定义轮廓;
- 使用View.setOutlineProvider()方法为View设置自定义的轮廓;
示例代码如下:
1 | ViewOutlineProvider outlineProvider = new ViewOutlineProvider() { |
默认的ViewOutlineProvider类从View的background属性获取阴影轮廓,如果View不需要阴影效果,可以通过setOutlineProvider()将其设置为null。
裁剪View
裁剪(Clip)View可以很容易改变View的形状,可以通过View.setClipToOutline()方法或android:clipToOutline属性将View裁剪至轮廓区域。
仅支持矩阵、椭圆和圆角矩阵的裁剪,这是由Outline.canClip()方法决定的。
如果要将视图的裁剪作用到Drawable背景对象上,首先使用View.setOutlineProvider()方法裁剪视图,然后调用View.setClipToOutline()方法,将裁剪作用到View的背景上。
裁剪视图操作比较耗费系统资源,所以,不要为裁剪视图的形状添加动画,如果要实现这样的动画效果,可以使用Reveal动画,具体可以参考MaterialDesign中的动画。
Drawable着色
从Android5.0开始,可以为Drawable图片资源着色(Tint),这样可以让图片资源与APP的主题匹配。
可以通过setTint()方法为BitmapDrawable、NinePatchDrawable以及VectorDrawable对象着色,也可以在XML布局文件中使用android:tint和android:tintMode属性设置着色的颜色和模式。