调整页面元素的大小和位置

您可以通过两种不同的方式获取和更改网页元素的大小和位置:

  1. 使用其 getter 和 setter 函数来设置大小和位置。
  2. 使用 getTransform()setTransform() 函数操控其仿射转换,同时保留固有大小。

读取页面元素属性

调整大小和旋转

如图所示,大小和位置是相对于未旋转的渲染页面元素的边界框测量的:

  • :从页面左上角到未旋转的边界框左上角的距离。使用 getLeft()getTop() 读取值。
  • WidthHeight:未旋转的边界框的宽度和高度。 使用 getWidth()getHeight() 读取值。
  • 旋转:相对于边界框中心周围的垂直线的顺时针旋转。使用 getRotation() 读取值。

所有长度均以点 (pt) 为单位。旋转以度 (°) 为单位。

设置页面元素属性

您可以在使用 insertShape() 等插入方法创建页面元素时设置其大小和位置。对于现有形状,您可以设置大小、位置和旋转;还可以设置元素的缩放比例,以调整其大小或沿其某个边缘进行镜像。

创建时

您可以在创建页面元素时提供位置和尺寸信息。

var slide = SlidesApp.getActivePresentation().getSlides()[0];
var shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 100, 200, 300, 60);
Logger.log('Left: ' + shape.getLeft() + 'pt; Top: '
                    + shape.getTop() + 'pt; Width: '
                    + shape.getWidth() + 'pt; Height: '
                    + shape.getHeight() + 'pt; Rotation: '
                    + shape.getRotation() + ' degrees.');

上述脚本会在当前演示文稿的第一张幻灯片上创建一个形状,并为其指定位置和大小,然后读取该形状的位置和大小信息。预期日志如下:

Left: 100pt; Top: 200pt; Width: 300pt; Height: 60pt; Rotation: 0 degrees.

尺寸、位置和旋转

您可以在创建页面元素后更新其大小和位置:

  • 使用 setLeft()setTop() 设置未旋转边界框的左上角位置。
  • 使用 setWidth()setHeight() 设置边界框的渲染宽度和高度。
  • 使用 setRotation() 设置边界框围绕其中心的顺时针旋转。

以下脚本会在当前演示文稿的第一张幻灯片上创建一个形状,使用 setter 更新其位置、大小和旋转角度,并读取形状的位置和大小信息。

var slide = SlidesApp.getActivePresentation().getSlides()[0];
var shape = slide.insertShape(SlidesApp.ShapeType.RECTANGLE);
shape.setLeft(100).setTop(200).setWidth(50).setHeight(60).setRotation(90);
Logger.log('Left: ' + shape.getLeft()
                    + 'pt; Top: ' + shape.getTop()
                    + 'pt; Width: ' + shape.getWidth()
                    + 'pt; Height: ' + shape.getHeight()
                    + 'pt; Rotation: ' + shape.getRotation() + '\u00B0.');

此脚本的预期日志输出如下所示:

Left: 100pt; Top: 200pt; Width: 50pt; Height: 60pt; Rotation: 90°.

大小、位置和旋转设置器可以按任何顺序或组合使用。将上面第三行替换为以下脚本,也会产生相同的结果:

shape.setWidth(55);
shape.setRotation(90).setHeight(60).setLeft(100);
shape.setWidth(50).setTop(200);

扩缩

您可以使用 scaleWidth()scaleHeight() 通过相对缩放比例来拉伸或压缩页面元素,而无需使用上述 setWidth()setHeight() 将形状的大小设置为绝对值。

shape.scaleHeight(0.5).scaleWidth(2);

下图展示了上述代码在旋转 45° 的方形形状上的运作方式。 请注意,在缩放过程中,边界框的左上角保持不变。

幻灯片缩放

沿边缘的反射

scaleWidth()scaleHeight() 中的参数可以为负值,以便用于水平或垂直翻转页面元素。

shape.scaleWidth(-1); // Flip horizontally along the left edge of the bounding box.
shape.scaleHeight(-1); // Flip vertically along the top edge of the bounding box.

下图展示了上述代码在旋转 45° 的形状上的运作方式。请注意,页面元素沿其边界框的某个边缘翻转,而不是沿中心翻转。

幻灯片反思

线条旋转

与其他页面元素一样,线条的旋转角度不是线条的垂直角度,而是其边界框的旋转角度。创建具有指定起点和终点的线条时,其旋转角度始终为 0°。在 Google 幻灯片界面中拖动线条的端点会更改其垂直角度以及边界框的大小和位置,但不会更改其旋转角度。使用 setRotation() 会旋转线条的边界框,从而有效地更改其垂直角度。因此,两条线条可以具有相同的视觉垂直角度,但边界框不同,因此尺寸、位置和旋转值也不同。

限制

某些尺寸调整和定位方法与某些类型的页面元素不兼容。下表汇总了与某些类型的页面元素不兼容的方法。

方法 形状 视频
getHeight(), getWidth() 否(返回 null)
setHeight(), setWidth()
setRotation()
scaleHeight(), scaleWidth()

如果页面元素发生剪裁,所有大小调整和定位方法都可能会产生意外结果。所有限制都可能会发生变化。如需了解最新信息,请参阅参考文档。

使用仿射转换

如需实现高级控制,您还可以通过页面元素固有(原生)大小和仿射转换来计算和调整页面元素的大小和位置。

Google Apps 脚本提供与 Google 幻灯片 API 类似的接口来使用仿射转换。

  • 如需了解详情,请参阅这篇文章,其中介绍了仿射转换的概念,以及如何根据页面元素的内在(原生)大小和转换推断出呈现大小。在 Apps 脚本中,使用以下代码:
    • getInherentWidth()getInherentHeight()(适用于页面元素的原生大小);
    • getTransform(),用于页面元素的仿射转换。
  • 如需编写,请参阅这篇文章,了解如何使用仿射转换调整页面元素的大小和位置,以实现缩放、旋转、反射等操作。在 Apps Script 中,请使用
    • setTransform() 用于设置页面元素的仿射转换(类似于 ABSOLUTE 模式);
    • preconcatenateTransform() 将仿射转换预连接到页面元素的当前转换(类似于 RELATIVE 模式)。

以下脚本会创建一个形状、设置其转换、读取其固有大小,以及读取其仿射转换。

var slide = SlidesApp.getActivePresentation().getSlides()[0];
var shape = slide.insertShape(SlidesApp.ShapeType.RECTANGLE);
shape.setTransform(SlidesApp.newAffineTransformBuilder()
                   .setScaleX(2)
                   .setScaleY(1)
                   .setTranslateX(100)
                   .setTranslateY(200)
                   .build());
Logger.log('Inherent width: ' + shape.getInherentWidth()
                              + 'pt; Inherent height: '
                              + shape.getInherentHeight() + 'pt.');

此脚本的预期日志输出如下所示:

Inherent width: 236.2pt; Inherent height: 236.2pt.

生成的形状将具有以下转换,以及呈现的大小和位置:

AffineTransform{scaleX=2.0, scaleY=1.0, shearX=0.0, shearY=0.0, translateX=100.0, translateY=200.0}
Left: 100pt; Top: 200pt; Width: 472.4pt; Height: 236.2pt; Rotation: 0°.