Tamaño y posicionamiento de los elementos de página

En esta guía, se describe cómo ajustar el tamaño y la posición de los elementos de página mediante transformaciones afines. Para obtener una introducción conceptual a las transformaciones afines, consulta la guía de conceptos de Transformaciones.

Transforma elementos

La API de Presentaciones te permite cambiar la posición y el tamaño de los elementos de una página. Para ello, primero determina qué tipo de transformación debe aplicarse y, luego, aplica esa transformación mediante el método presentations.batchUpdate que contiene uno o más elementos UpdatePageElementTransformRequest.

Las transformaciones se pueden realizar en uno de dos applyModes:

  • Las transformaciones ABSOLUTE reemplazan la matriz de transformación existente del elemento. Los parámetros que se omiten en la solicitud de actualización de transformación se establecen en cero.

  • Las transformaciones RELATIVE se multiplican con la matriz de transformación existente del elemento (el orden de multiplicación es importante):

$$A' = BA$$

Las transformaciones relativas mueven o ajustan la escala del elemento de página desde donde se encuentra actualmente; por ejemplo, mover una forma 100 puntos hacia la izquierda o rotarla 40 grados. Las transformaciones absolutas descartan la información de posición y escala existentes. Por ejemplo, mover una forma al centro de la página o ajustarla para que tenga un ancho específico.

Por lo general, las transformaciones complejas pueden expresarse como una secuencia de transformaciones más simples. Por lo general, calcular previamente una transformación (combinando varias transformaciones mediante multiplicación de matrices) puede reducir la sobrecarga.

Para algunas operaciones, debes conocer los parámetros de transformación existentes de un elemento. Si no tienes estos valores, puedes recuperarlos con una solicitud presentations.pages.get.

La traducción

La traducción es simplemente la acción de mover un elemento de página a una nueva posición en la misma página. Las traducciones absolutas mueven el elemento a un punto específico, mientras que las relativas lo mueven una distancia específica.

Una matriz de transformación de traslación básica tiene la siguiente forma:

$$T=\begin{bmatrix} 1 & 0 & translate\_x\\ 0 & 1 & translate\_y\\ 0 & 0 & 1 \end{bmatrix}$$

Cuando usas una UpdatePageElementTransformRequest para traducir un elemento (sin alterar su tamaño, distorsión ni orientación), puedes usar una de las siguientes estructuras de AffineTransform:

// Absolute translation:
{
  'transform': {
    'scaleX':  current scaleX value,
    'scaleY':  current scaleY value,
    'shearX':  current shearX value,
    'shearY':  current shearY value,
    'translateX': X coordinate to move to,
    'translateY': Y coordinate to move to,
    'unit': 'EMU' // or 'PT'
  }
}

// Relative translation (scaling must also be provided to avoid a matrix multiplication error):
{
  'transform': {
    'scaleX':  1,
    'scaleY':  1,
    'translateX': X coordinate to move by,
    'translateY': Y coordinate to move by,
    'unit': 'EMU' // or 'PT'
  }
}

Escalamiento

El escalamiento es la acción de estirar o contraer un elemento a lo largo de la dimensión X o Y para cambiar su tamaño. Una matriz de transformación de ajuste de escala básica tiene la siguiente forma:

$$S=\begin{bmatrix} scale\_x & 0 & 0\\ 0 & scale\_y & 0\\ 0 & 0 & 1 \end{bmatrix}$$

Puedes usar esta forma de matriz directamente como una transformación RELATIVE para cambiar el tamaño de un elemento, pero esto también puede afectar la distorsión y traslación renderizadas del elemento. Para ajustar el tamaño del elemento sin afectar su distorsión o traslación, cambia a su marco de referencia.

Rotación

Las transformaciones de rotación rotan un elemento de página alrededor de un punto mediante los parámetros de escala y distorsión. La matriz básica de transformación de rotación tiene la siguiente forma, en la que el ángulo de rotación (en radianes) se mide desde el eje X, en sentido antihorario:

$$R=\begin{bmatrix} cos(\theta) & sin(\theta) & 0\\ -sin(\theta) & cos(\theta) & 0\\ 0 & 0 & 1 \end{bmatrix}$$

Al igual que con el escalamiento, puedes usar este formato de matriz directamente como una transformación RELATIVE para rotar un elemento, pero esto hace que este rote sobre el origen de la página. Para rotar el elemento sobre su centro o un punto diferente, cambia a ese marco de referencia.

Comentarios

El reflejo refleja un elemento en una línea o un eje específicos. La matriz básica de transformación de reflejo en ejes X e Y tiene las siguientes formas:

$$F_x=\begin{bmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1\\ \end{bmatrix}\qquad\qquad F_y=\begin{bmatrix} -1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{bmatrix}$$

Al igual que con el escalamiento, puedes usar este formulario de matriz directamente como una transformación RELATIVE para reflejar un elemento, pero esto también hace que el elemento se traduzca. Para reflejar el elemento sin traslación, cambia a su marco de referencia.

Marcos de referencia de elementos

Aplicar una transformación básica de escala, reflexión o rotación directamente a un elemento de la página produce una transformación en el marco de referencia de la página. Por ejemplo, una rotación básica rota el elemento sobre el origen de la página (la esquina superior izquierda). Sin embargo, puedes operar en el marco de referencia del elemento en sí; por ejemplo, para rotar un elemento sobre su punto central.

Para transformar un elemento dentro de su propio marco de referencia, enciérralo entre otras dos traducciones: una T1 de traslación anterior que mueve el centro del elemento al origen de la página y una T2 de traslación siguiente que mueve el elemento a su posición original. La operación completa se puede expresar como un producto de matriz:

$$A' = T2 \times B \times T1 \times A$$

Para cambiar a otros marcos de referencia, también puedes trasladar diferentes puntos al origen. Estos puntos se convierten en el centro del nuevo marco de referencia.

Es posible realizar cada una de estas transformaciones de manera individual como solicitudes de transformación RELATIVE secuenciales. Lo ideal sería que calcules con anterioridad el A' con multiplicaciones de matrices y apliques el resultado como una sola transformación ABSOLUTE. Como alternativa, calcula con anterioridad el producto T2 * B * T1 y aplícalo como una sola transformación RELATIVE. Estas dos operaciones son más eficientes en términos de operaciones de API que el envío individual de las solicitudes de transformación.

Limitaciones

Algunos campos de tamaño y posicionamiento son incompatibles con algunos tipos de elementos de página. En la siguiente tabla, se resume la compatibilidad de ciertos elementos de página con los campos de tamaño y posicionamiento.

Campo Forma Video Tabla
Translation
Escala No**
Cizalla No No

** Para actualizar las dimensiones de las filas y columnas de la tabla, usa UpdateTableRowPropertiesRequest y UpdateTableColumnPropertiesRequest.

Todos los campos de tamaño y posicionamiento pueden dar resultados inesperados si el elemento de página presenta distorsión. Todas las limitaciones están sujetas a cambios. Para obtener información actualizada, consulte la API de Google Slides.

La API de Presentaciones podría refactorizar tus valores

Cuando creas un elemento de página, puedes especificar un tamaño y una transformación que proporcionen un resultado visual determinado. Sin embargo, la API puede reemplazar los valores proporcionados por otros que brinden el mismo aspecto visual. En general, si escribes un tamaño mediante la API, no se garantiza que obtendrás el mismo tamaño. Sin embargo, deberías obtener los mismos resultados si tienes en cuenta la transformación.