Cómo cambiar el tamaño y la posición de los elementos de la página

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

Transforma elementos

La API de Slides te permite cambiar la posición y escalar elementos en una página. Para ello, primero determina qué tipo de transformación se debe aplicar y, luego, aplícala con el método presentations.batchUpdate() que contiene uno o más elementos UpdatePageElementTransformRequest.

Las transformaciones se pueden realizar con un ApplyMode:

  • ABSOLUTE transforma reemplaza la matriz de transformación existente del elemento. Los parámetros que omitas de la solicitud de actualización de transformación se establecerán en cero.

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

$$A' = BA$$

Las transformaciones relativas mueven o escalan el elemento de la página desde donde se encuentra. 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 escalarla para que tenga un ancho específico.

Por lo general, las transformaciones complejas se pueden expresar como una secuencia de transformaciones más simples. El cálculo previo de una transformación (combinación de varias transformaciones con la multiplicación de matrices) a menudo puede reducir la sobrecarga.

Para algunas operaciones, debes saber cuáles son los parámetros de transformación existentes de un elemento. Si no tienes estos valores, puedes recuperarlos con el método presentations.pages.get().

Traducción

El desplazamiento es la acción de mover un elemento de página a una posición nueva 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 traducción básica tiene la forma:

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

Cuando usas un UpdatePageElementTransformRequest para traducir un elemento (sin alterar su tamaño, corte 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'
  }
}

Escala

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

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

Puedes usar este formulario de matriz directamente como una transformación RELATIVE para cambiar el tamaño de un elemento, pero esto también puede afectar el corte y la traducción renderizados del elemento. Para escalar el elemento sin afectar su corte o traducción, cambia al marco de referencia del elemento.

Rotación

Las transformaciones de rotación rotan un elemento de página alrededor de un punto con los parámetros de escalamiento y corte. La matriz de transformación de rotación básica tiene la siguiente forma, en la que el ángulo de rotación (en radianes) se mide desde el eje X y se mueve en sentido contrario a las manecillas del reloj:

$$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 el elemento se rote alrededor del origen de la página. Para rotar el elemento alrededor de su centro o un punto diferente, cambia al marco de referencia de ese elemento.

Comentarios

La reflexión refleja un elemento en una línea o un eje específicos. La matriz básica de transformación de reflexión de los 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 formato de matriz directamente como una transformación RELATIVE para reflejar un elemento, pero esto hace que el elemento también se traduzca. Para reflejar el elemento sin ninguna traducción, cambia a su marco de referencia de elemento.

Marcos de referencia de elementos

Aplicar una transformación básica de escala, rotación o reflexión directamente a un elemento de 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 alrededor del origen de la página (la esquina superior izquierda). Sin embargo, puedes operar en el marco de referencia del elemento, por ejemplo, para rotar un elemento alrededor de su punto central.

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

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

También puedes cambiar a otros sistemas de referencia. Para ello, traduce 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 forma individual como solicitudes de transformación RELATIVE secuenciales. Idealmente, debes precalcular A' arriba con multiplicaciones de matrices y aplicar el resultado como una sola transformación ABSOLUTE. Como alternativa, calcula previamente el producto T2 * B * T1 y aplícalo como una sola transformación RELATIVE. Ambas son más eficientes, en términos de operaciones de la API, que enviar las solicitudes de transformación de forma individual.

Limitaciones

Algunos campos de tamaño y posicionamiento no son compatibles 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**
Cizallamiento 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 generar resultados inesperados si el elemento de página tiene corte. Todas las limitaciones están sujetas a cambios. Para obtener información actualizada, consulta la API de Google Slides.

Valores refactorizados

Cuando creas un elemento de página, puedes especificar un tamaño y una transformación que proporcionan un resultado visual determinado. Sin embargo, la API de Slides podría reemplazar los valores que proporcionaste por otros que tengan la misma apariencia visual. En general, si escribes un tamaño con la API, no se garantiza que se te devuelva el mismo tamaño. Sin embargo, deberías obtener los mismos resultados si tienes en cuenta la transformación.