PreivewItemManager
问题描述:遇到了一个桌面文件夹中的图标过大,导致文件夹中的应用程序显示超过文件夹的边界,或者说,文件夹的图标整体偏上,或者偏左的问题
路径:packages\apps\Launcher3\src\com\android\launcher3\folder\PreviewItemManager.java
private void drawPreviewItem(Canvas canvas, PreviewItemDrawingParams params, PointF offset,
boolean shouldClipPath, Path clipPath) {
canvas.save();
if (shouldClipPath) {
canvas.clipPath(clipPath);
}
canvas.translate(offset.x + params.transX, offset.y + params.transY);
canvas.scale(params.scale, params.scale);
Drawable d = params.drawable;
if (d != null) {
Rect bounds = d.getBounds();
int leftOffset = bounds.left < 0 ? -bounds.left : 0; // 计算左边界超出的偏移量
int topOffset = bounds.top < 0 ? -bounds.top : 0; // 计算顶部边界超出的偏移量
canvas.save();
canvas.translate(leftOffset, topOffset); // 将画布向右下平移超出边界的距离
canvas.scale((mIntrinsicIconSize*2) / (bounds.width()*3), (mIntrinsicIconSize*2) / (bounds.height()*3)); // 缩放图标至合适尺寸
d.draw(canvas); // 绘制应用程序图标
canvas.restore();
}
canvas.restore();
}
这段代码是一个私有方法,用于在画布上绘制预览项目的图标。分步解释它的功能:
- canvas.save() 和 canvas.restore() 方法用于保存和恢复画布的当前状态,以确保后续操作不会影响其他绘制。
- shouldClipPath 参数表示是否应该对绘制进行路径裁剪,而 clipPath 参数则是用来指定裁剪的路径。如果 shouldClipPath 为 true,则会通过 canvas.clipPath(clipPath) 对绘制进行裁剪。
- canvas.translate(offset.x + params.transX, offset.y + params.transY) 用于设置绘制的偏移量,即绘制在画布上的位置。
- canvas.scale(params.scale, params.scale) 用于缩放绘制物体,其中 params.scale 表示缩放系数。
- params.drawable 是要绘制的图标的 drawable 对象。
- 如果 params.drawable 不为空,则会进行绘制。首先,通过 d.getBounds() 获取图标的边界矩形,并将画布中心与图标中心对齐(即使图标在画布上的位置相对于其边界矩形的左上角偏移);然后,根据实际图标大小和期望的内在图标大小(mIntrinsicIconSize),通过缩放画布来调整图标的大小;最后,通过 d.draw(canvas) 绘制图标。
- 最后,通过 canvas.restore() 恢复画布的状态。
总体而言,这段代码的作用是在给定的画布上绘制预览项目的图标,并根据需要进行裁剪、偏移和缩放操作。具体的绘制效果会受到输入参数的影响,例如图标的大小、位置、缩放系数等等。如果想要更加详细了解绘制过程,请参考代码中涉及的其他相关内容。
这个类中则对文件夹图标的显示进行了具体的计算。