Material Design 为 UI 元素引入了高度。高度帮助用户理解每个元素的相对重要性,并将注意力集中在当前任务上。
视图的高度,用 *Z* 属性表示,决定其阴影的视觉外观。具有较高 *Z* 值的视图会投射更大、更柔和的阴影,并且会遮挡具有较低 *Z* 值的视图。但是,视图的 *Z* 值不会影响视图的大小。
阴影由抬高视图的父视图绘制。它们受标准视图剪裁的约束,默认情况下会被父视图剪裁。
高度也可用于创建动画,在这些动画中,当执行操作时,小部件会暂时升到视图平面上方。
更多信息,请参阅 Material Design 中的高度。
为你的视图分配高度
视图的 *Z* 值有两个组成部分
- 高度:静态组件
- 平移:用于动画的动态组件
Z = elevation + translationZ
*Z* 值以 dp(与密度无关的像素)为单位测量。
要设置视图的默认(静止)高度,请在 XML 布局中使用 android:elevation
属性。要在活动的代码中设置视图的高度,请使用 View.setElevation()
方法。
要设置视图的平移,请使用 View.setTranslationZ()
方法。
ViewPropertyAnimator.z()
和 ViewPropertyAnimator.translationZ()
方法允许你为视图的高度设置动画。更多信息,请参阅 ViewPropertyAnimator
的 API 参考和 属性动画 开发者指南。
你还可以使用 StateListAnimator
以声明方式指定这些动画。这对于状态更改触发动画的情况尤其有用,例如用户点击按钮时。更多信息,请参阅 使用 StateListAnimator 设置视图状态更改动画。
自定义视图阴影和轮廓
视图背景 drawable 的边界决定其阴影的默认形状。*轮廓* 表示图形对象的外部形状,并定义触摸反馈的波纹区域。
考虑以下视图,它使用背景 drawable 定义:
<TextView android:id="@+id/myview" ... android:elevation="2dp" android:background="@drawable/myrect" />
背景 drawable 定义为具有圆角的矩形
<!-- res/drawable/myrect.xml --> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#42000000" /> <corners android:radius="5dp" /> </shape>
由于背景 drawable 定义了视图的轮廓,因此视图投射的阴影具有圆角。提供自定义轮廓会覆盖视图阴影的默认形状。
要在代码中为视图定义自定义轮廓,请执行以下操作:
- 扩展
ViewOutlineProvider
类。 - 覆盖
getOutline()
方法。 - 使用
View.setOutlineProvider()
方法将新的轮廓提供程序分配给你的视图。
你可以使用 Outline
类中的方法创建具有圆角的椭圆形和矩形轮廓。视图的默认轮廓提供程序从视图的背景获取轮廓。要防止视图投射阴影,请将其轮廓提供程序设置为 null
。
剪裁视图
剪裁视图允许你更改视图的形状。你可以剪裁视图以与其他设计元素保持一致,或者为了响应用户输入而更改视图的形状。你可以使用 View.setClipToOutline()
方法将视图剪裁到其轮廓区域。只有矩形、圆形和圆角矩形轮廓支持剪裁,这由 Outline.canClip()
方法确定。
要将视图剪裁到 drawable 的形状,请将 drawable 设置为视图的背景(如前面的示例所示),然后调用 View.setClipToOutline()
方法。
剪裁视图是一项代价高昂的操作,因此不要设置你用于剪裁视图的形状的动画。要实现此效果,请使用 显示动画。