本条目介绍一个名为“overflow tilted browse card(溢出倾斜浏览卡片)”的界面实现技巧,示例代码基于 Kotlin 与 Jetpack Compose。其核心是让矩形卡片中的小封面图旋转几度、悬挂在卡片一角,并被卡片自身的圆角干净地裁切成斜边。
【用途】 用于构建卡片式浏览列表中的单张卡片:封面图倾斜溢出、背景为渐变、右上角带圆形徽标与半透明图标、左上角为最多两行的标题文本,整卡可点击。文档明言该视觉效果由两个决策决定:父容器负责裁切(clip),子元素先被移出边缘、再旋转。
【主要能力与要点】
- 修饰符顺序:修饰符从左到右包裹,最左侧绘制在最外层。父级 clip 必须置于其需要约束的背景与 drawBehind 之前;子级先 rotate 后 clip,圆角随图像旋转,若先 clip 后 rotate 则会在已旋转的图像上套一个轴对齐圆角矩形、把四角切掉。
- 裁切来源:产生斜切边的是父级裁切而非子级裁切;offset 只改变绘制位置、不改变测量尺寸,因此子元素确实悬在卡片外,由父级裁切将其变为斜边。移除父级 clip,同样的代码就会渲染成一张盖到相邻卡片上的方形照片。
- 旋转后的占位计算:旋转不改变测量尺寸,父级仍按 s×s 布局,但旋转 θ 后实际占据边长 s·(|cos θ|+|sin θ|) 的轴对齐盒。文档给出示例:64 dp 在 25° 时约为 85 dp,每边比布局系统所知多出约 10.5 dp;再叠加向外偏移,并给出文本 end padding 约 72 dp 的来源。这些数值建议算一次并写在相邻 padding 处,并在旁边注明推导过程。
- 无论封面是否加载都预留空间:封面通常来自异步请求且可能为空,文本应无条件留白,避免图片出现时布局回流;渐变加徽标状态应设计成独立看也完整,而非空槽位。
- 装饰尺寸锚定维度:按比例计算的徽标尺寸应锚定高度或 min(width, height),否则在 2:1 卡片上会翻倍;文档建议在注释中说明这一点。
- 封面填充方式:使用 ContentScale.Crop 填满方形区域,避免旋转后从角落露出背景;Fit 会产生随图像一同旋转的黑边。
- RTL 行为:offset 在从右到左布局中会镜像水平值,但对齐方式须一并镜像,否则装饰会落到中间;文档建议在 RTL 语言环境下实际检查。
- 背景:此处为带角度的渐变而非纯色,由需要盒尺寸的绘制修饰符绘制,颜色由条目标题确定性地生成,使未加载封面的卡片看起来是有意设计而非空白。
【使用方式(核查与验证)】 文档给出若干 grep 命令,用于检查每个旋转及其周边修饰符链、定位“先 clip 后 rotate”的危险顺序、查找向外偏移的子元素。另建议人工验证:放入支持的最长标题,确认省略号避开倾斜图像而非仅避开 64 dp 盒子;把角度设为 45°(外接盒最宽为 s·√2)确认留白经过推导而非目测。
【适用场景与限制】 适用于采用 Jetpack Compose 的 Android 卡片式 UI 开发。文档仅涉及布局与绘制技巧,未提供性能数据、兼容版本范围、价格或平台支持等事实,相关内容暂未提供。