阴影和裁剪View及Drawable着色

阴影效果

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
2
3
4
5
6
7
ViewOutlineProvider outlineProvider = new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0, view.getWidth() + 10, view.getHeight() + 10, 30f);
}
};
view.setOutlineProvider(outlineProvider);

默认的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属性设置着色的颜色和模式。

坚持原创技术分享,您的支持将鼓励我继续创作!