Diseño visual y layouts en React Native • Lesson • Lenny.com
Diseño visual y layouts en React Native Una presentación exhaustiva sobre el uso de componentes de imagen, fondos y diseño responsivo en React Native.
NR Norman René Trujillo Zapata
React Native Visual Design Slides
Presentación profesional en español sobre React Native para estudiantes de 9no/10mo grado. Cubre componentes de imagen, fondos, interactividad y diseño responsivo usando Flex y Dimensions, siguiendo las especificaciones de diseño y contenido solicitadas.
React Native Final Slides
Presentación exhaustiva de 60 diapositivas sobre React Native (Imágenes, Fondos y Layouts) para 9no/10mo grado. Incluye todos los ejercicios, quizzes y ejemplos del documento guía con un diseño profesional en fondo negro y tipografía de alta legibilidad.
React Native Final Slides Final Version
Presentación exhaustiva de 60 diapositivas sobre React Native (Imágenes, Fondos y Layouts) para 9no/10mo grado. Incluye todos los ejercicios, quizzes y ejemplos del documento guía con un diseño profesional en fondo negro y tipografía de alta legibilidad, cumpliendo estrictamente con las normas de puntuación y capitalización solicitadas.
React Native Visual Study Guide
Guía de autoestudio imprimible en español para estudiantes de 9no/10mo grado sobre React Native. Incluye ejercicios prácticos, espacios para explicaciones de código, análisis de layouts (Snapchat, Scorekeeper) y quices de repaso sobre Flex y Dimensions.
React Native Study Guide Answer Key
Clave de respuestas detallada para la guía de autoestudio sobre React Native. Contiene soluciones técnicas, explicaciones de código y respuestas a los problemas matemáticos de layout y diseño responsivo para uso del docente.
React Native Final Study Guide Final Version
Guía de autoestudio imprimible en español para estudiantes de 9no/10mo grado sobre React Native. Incluye ejercicios prácticos, espacios para explicaciones de código, análisis de layouts (Snapchat, Scorekeeper) y quices de repaso sobre Flex y Dimensions, cumpliendo con las normas de puntuación y capitalización solicitadas.
React Native Final Answer Key Final Version
Clave de respuestas detallada y final para la guía de autoestudio sobre React Native. Contiene soluciones técnicas, explicaciones de código y respuestas a los problemas de diseño responsivo para uso docente, cumpliendo estrictamente con las normas de puntuación y capitalización.
Diseño visual y layouts en React Native Una presentación exhaustiva sobre el uso de componentes de imagen, fondos y diseño responsivo en React Native.
NR Norman René Trujillo Zapata
React Native Visual Design Slides Principles of computer science
Mobile App: Desarrollo con React Native
Tema: Componentes visuales y layouts avanzados
Docente: Mr. Norman Trujillo
ntrujillo@csa.edu.ni
Introducción de la lección
En esta sesión, los estudiantes explorarán cómo transformar una aplicación simple en una experiencia visual atractiva y profesional.
Aprenderemos a integrar imágenes, gestionar fondos y crear interfaces interactivas que respondan a diferentes tamaños de pantalla.
Objetivos de aprendizaje
Dominio de componentes
Comprender el uso de Image, ImageBackground y TouchableHighlight para crear UI dinámicas.
Estructura y layout
Aplicar conceptos avanzados de Flex Layout para organizar elementos de forma eficiente.
Diseño responsivo
Utilizar la API de Dimensions para adaptar la aplicación a cualquier dispositivo móvil.
Implementación práctica
Desarrollar ejercicios reales basados en interfaces populares como Snapchat y Google.
El componente Image
El componente Image permite mostrar diferentes tipos de imágenes en la aplicación. Para usarlo, debemos importarlo desde la librería react-native.
<Image source={{ uri: 'URL_DE_LA_IMAGEN' }} style={{ height: 100, width: 100 }} />
Importante: A diferencia del componente View, las imágenes requieren dimensiones obligatorias (height y width) para visualizarse correctamente.
Desafío rápido: Visualización
¿Se mostrará el siguiente componente Image en la pantalla?
<Image
source={{ uri: 'https://static.codehs.com/img/courses/introkarel/1.png ' }}
style={{ width: 200 }}
/>
Falso
Verdadero
Respuesta: Falso. Sin un valor de altura (height), la imagen no se mostrará.
Formatos válidos
¿Cuál de las siguientes es una URI de imagen válida para el componente Image en React Native?
A) .../reactnative/2.mp4
B) .../reactnative/2
C) .../reactnative/2.png
D) .../reactnative/2.img
Nota: .png es un tipo de archivo estándar que puede usarse dentro de una URI de imagen.
Estructura base del código
Todos los proyectos en CodeHS deben iniciar con esta estructura estándar:
import React, { Component } from 'react';
import { AppRegistry, Text, View, StyleSheet } from 'react-native';
import Constants from 'expo-constants';
export default class App extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.paragraph}>
¡Cambia el código y observa el cambio!
</Text>
</View>
);
}
}
Ejemplo: Múltiples componentes Image
Podemos añadir múltiples imágenes dentro de un mismo contenedor View para crear galerías o interfaces complejas.
<View style={styles.container}>
<Image source={{ uri: '...' }} style={{ height: 150, width: 150 }} />
<Image source={{ uri: '...' }} style={{ height: 150, width: 150 }} />
<Image source={{ uri: '...' }} style={{ height: 150, width: 150 }} />
</View>
Combinando Image y Text
Es posible posicionar componentes de texto por encima o por debajo de las imágenes para añadir contexto.
<Image source={{ uri: '...' }} style={{ height: 200, width: 200 }} />
<Text style={styles.caption}>
{'\n'}Gato bailarín
</Text>
Gato bailarín
Ejercicio: Snapchat Login
Reto: Añade la imagen del fantasma al centro del bloque amarillo de tu aplicación.
Requerimientos:
Implementación: Snapchat Render
render() {
return (
<View style={styles.container}>
<View style={styles.amarillo}>
<Image
source={{uri: 'https://codehs.com/uploads/c799accde67e1fd3bbd699119b4e1c83'}}
style={{ width: 100, height: 100 }}
/>
</View>
<!-- Otros componentes aquí -->
</View>
);
}
Implementación: Estilos
amarillo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'yellow',
width: '100%',
height: '70%',
},
rojo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'red',
width: '100%',
height: '15%',
},
El uso de porcentajes asegura que el bloque amarillo ocupe la mayor parte de la pantalla.
Reproductor de música móvil
En este ejercicio, los estudiantes construirán una interfaz completa para una aplicación de música.
Elementos clave:
• Portada del álbum (275px x 275px)
• Título de la lista y canción
• Nombre del artista
• Tiempos de duración
• Controles de navegación (Rewind, Play/Pause, Forward)
Your Top Songs 2018
This is the Song Name
Artist
Código: Estructura del reproductor
<View style={styles.container}>
<Text style={styles.topText}>Your Top Songs 2018</Text>
<Image
source={{ uri: 'URL\_ALBUM\_COVER' }}
style={{ height: 275, width: 275 }}
/>
<Text style={styles.song}>This is the Song Name</Text>
<Text style={styles.artist}>Artist</Text>
{/\* Contenedores de tiempo y controles a continuación \*/}
</View>
Activos visuales: Controles
Para los botones de control, utilizaremos las siguientes URIs proporcionadas por CodeHS:
Rewind
Pause
Forward
Nota: Todos estos componentes se agrupan en un contenedor con flexDirection: 'row'.
Estilos: Flex y Tipografía
song: {
fontFamily: 'Roboto',
fontSize: 26,
color: 'white',
marginTop: 20,
},
playerControlsContainer: {
flexDirection: 'row',
marginTop: 20,
},
line: {
borderBottomWidth: 1,
borderBottomColor: 'white',
width: 200,
},
pause: {
height: 70,
width: 70,
},
Google Search: Imágenes reales
En este reto, los estudiantes actualizan su ejercicio previo de Google para usar activos gráficos reales.
Activos requeridos:
• Logo de Google: 250 x 100
• Ícono de búsqueda (Lupa): 30 x 30
Pista: Puedes redondear las esquinas de un contenedor usando borderRadius o propiedades específicas como borderTopLeftRadius.
Buscar en Google...
Google: Manejo de entrada de datos
state = {
searchText: '',
}
<TextInput
style={styles.searchBar}
onChangeText={(searchText) => this.setState({searchText})}
value={this.state.searchText}
/>
Utilizamos el estado (state) para almacenar y actualizar lo que los estudiantes escriben en la barra de búsqueda en tiempo real.
ImageBackground
A diferencia del componente Image simple, ImageBackground permite anidar otros componentes dentro de él.
Esto es ideal para crear pantallas con fondos fotográficos y texto o botones encima.
Regla de oro:
Cualquier componente que desees ver "sobre" el fondo debe estar dentro de las etiquetas de apertura y cierre de <ImageBackground>.
Texto sobre fondo
Quiz: Ajuste de dimensiones
Si tenemos una pantalla de 400 píxeles de alto, ¿cuál de estos NO llenará toda la altura?
A) <ImageBackground style={{ height: 600 }} ... />
✓ Excede la altura, llenará el espacio.
B) <ImageBackground style={{ height: 400, width: 200 }} ... />
✓ Exactamente 400px.
C) <ImageBackground style={{ height: 200 }} ... />
✗ Solo cubrirá la mitad (200px de 400px).
Ejemplo: Hello, Universe!
<ImageBackground
style={styles.background}
source={{ uri: '...' }}
>
<View style={styles.textContainer}>
<Text style={styles.paragraph}>
Hello, Universe!
</Text>
</View>
</ImageBackground>
"Anidamiento exitoso"
Ejercicio: Phone Background
Diseña la pantalla de inicio de tu teléfono móvil.
Requisitos:
Usar una imagen como fondo que cubra el 100%.
Añadir la hora y la fecha.
Utilizar tipografías legibles (Helvetica o Roboto).
5:41
Monday, July 15
Estilos del teléfono
time: {
textAlign: 'center',
fontSize: 70,
fontFamily: 'Helvetica',
color: 'white',
},
date: {
textAlign: 'center',
fontSize: 20,
fontFamily: 'Helvetica',
color: 'white',
marginTop: 20,
},
back: {
height: '100%',
width: '100%',
},
Interactividad: TouchableHighlight
¿Cómo hacemos que una imagen sea "clickeable"? En React Native, usamos el componente <TouchableHighlight>.
Este componente envuelve a otros elementos para detectar pulsaciones (taps) y disparar funciones.
<TouchableHighlight onPress={() => alert('¡Hola!')}>
<Image ... />
</TouchableHighlight>
Desafío: Sintaxis de interactividad
¿Cuál es la forma correcta de envolver una imagen para que sea interactiva?
<TouchableHighlight onPress={...}>
<Image source={...} style={...} />
</TouchableHighlight>
Regla:
Solo los componentes envueltos dentro de TouchableHighlight responderán al evento onPress.
Ejercicio: Citas interactivas
Crea una aplicación que muestre el nombre de una figura célebre y su imagen.
Cuando el estudiante presione la imagen, debe aparecer una alerta con una cita famosa de esa persona.
Ejemplo: Ada Lovelace
"Un barco en el puerto está seguro, pero no es para eso que están hechos los barcos. Sal al mar y haz cosas nuevas."
Ada Lovelace
Implementación: OnPress Alerta
<TouchableHighlight
onPress={() => {
alert('"Un barco en el puerto está seguro..."');
}}
>
<Image
source={{ uri: 'URL_ADA' }}
style={{ height: 450, width: 375 }}
/>
</TouchableHighlight>
Flex Layouts: Conceptos Básicos
El sistema Flex permite que los componentes se expandan para llenar el espacio disponible de manera proporcional.
Propiedad flex: 1 significa "toma todo el espacio que puedas de tu padre".
Proporciones:
Si un componente tiene flex: 2 y otro flex: 1, el primero ocupará el doble de espacio que el segundo.
flex: 1 (25%)
flex: 3 (75%)
Quiz: Análisis de Flex
Si quieres que 3 componentes hijos llenen un contenedor por igual, ¿cuál de estos fallará?
Hijo 1 {flex: 3}, Hijo 2 {flex: 3}, Hijo 3 {flex: 3}
Hijo 1 {flex: 0.5}, Hijo 2 {flex: 0.5}, Hijo 3 {flex: 0.5}
Hijo 1 {flex: 1}, Hijo 2 {flex: 2}, Hijo 3 {flex: 3}
Respuesta: El tercer caso fallará porque asigna proporciones diferentes (1:2:3), no iguales.
Visualizando proporciones reales
top: { flex: 1 }
middle: { flex: 2 }
bottom: { flex: 7 }
1/10
2/10
7/10
flexDirection
Column (Por defecto)
Row
Ejercicio: Rainbow Background
Crea un fondo colorido usando 7 bloques (Views) de igual altura que se estiren por todo el ancho.
Colores:
Red, Orange, Yellow, Green, Blue, Indigo, Violet.
Estudio de caso: Bandera de Sierra Leona
Implementación usando flex: 1 en cada sección y flexDirection: 'column'.
Diseño avanzado: Bandera de Suecia
Para diseños complejos como la bandera sueca, necesitamos anidar contenedores con diferentes direcciones.
Estrategia:
1. Contenedor principal: flexDirection: 'row'
2. Columna Izquierda (Side)
3. Columna Central (Cruz)
4. Columna Derecha (Side)
Snapchat Login: Refactorización con Flex
Ahora ajustaremos el diseño de Snapchat para usar proporciones exactas. La pantalla debe dividirse en 7 partes totales.
• Bloque amarillo: flex: 5 (Cubre 5/7 de la pantalla).
• Botón Log In: flex: 1.
• Botón Sign Up: flex: 1.
Este método es más preciso que usar porcentajes fijos.
LOG IN
SIGN UP
La API Dimensions
¿Cómo sabemos el tamaño real de la pantalla del usuario? React Native nos provee la API Dimensions.
Esto permite obtener el ancho y alto exacto en píxeles de cualquier dispositivo.
let deviceHeight = Dimensions.get('window').height;
let deviceWidth = Dimensions.get('window').width;
iPhone SE
iPhone 15 Pro Max
Quiz: Uso de variables Dimensions
¿Cómo le decimos a un contenedor que ocupe toda la pantalla usando estas variables?
container: {
deviceHeight,
deviceWidth,
}
container: {
height: deviceHeight,
width: deviceWidth,
}
Correcto: Debemos asignar las variables a las propiedades de estilo correspondientes.
Quiz: Reparto equitativo
Si quieres 3 Views que llenen la altura de la pantalla por igual usando Dimensions, ¿qué altura debería tener cada una?
A) height: deviceHeight / 3
B) height: deviceHeight - 3
C) height: 3 / deviceHeight
Texto responsivo con Dimensions
Dimensions no solo sirve para contenedores. Podemos usarlo para que el tamaño de la fuente sea proporcional a la pantalla.
title: {
fontSize: deviceHeight / 10,
}
De esta manera, en una pantalla de 800px de alto, la fuente será de 80px, mientras que en una de 400px será de 40px.
Pantalla Pequeña
TEXTO ADAPTADO
Pantalla Grande
TEXTO ADAPTADO
Imágenes proporcionales
Podemos asegurar que una imagen siempre ocupe un tercio de la pantalla (como un cuadrado perfecto) calculando su tamaño dinámicamente.
<Image
source={{ uri: 'cat.jpg' }}
style={{
height: deviceHeight / 3,
width: deviceHeight / 3
}}
/>
1/3 Height
Ejercicio: Rainbow v2 (Dimensions)
En lugar de usar flex, calcula el alto de cada franja usando la altura del dispositivo dividida entre 7.
red: {
height: deviceHeight / 7,
backgroundColor: 'red',
},
¿Cuál es la diferencia? En este caso, cada View tiene una altura explícita en píxeles calculada al vuelo.
Snapchat: El toque final
Nuevas reglas de diseño:
• Fuente: 1/30 del alto de la pantalla.
• Imagen: Debe caber en un cuadrado de 1/10 del alto del dispositivo.
• Fondo: Negro (#000000) para resaltar los bloques.
label: {
fontSize: deviceHeight / 30,
color: 'white',
fontWeight: 'bold',
},
image: {
height: deviceHeight / 10,
width: deviceHeight / 10,
}
Proyecto: Scorekeeper Pro
Añade imágenes a tus botones y un fondo profesional para darle personalidad a tu marcador.
Mejoras requeridas:
• Imagen de fondo de estadio o campo deportivo.
• Íconos para los botones de "Touchdown" y "Field Goal".
• Diseño totalmente responsivo para tablets y teléfonos.
Scorekeeper: ImageBackground Implementation
render() {
return (
<View style={styles.container}>
<ImageBackground
style={{ height: deviceHeight, width: deviceWidth }}
source={{ uri: 'URL_STADIUM' }}
>
<View style={styles.container}>
<Text style={styles.title}>FOOTBALL</Text>
{/* Resto de la interfaz */}
</View>
</ImageBackground>
</View>
);
}
Scorekeeper: Botones de anotación
<TouchableHighlight
style={styles.button}
onPress={() => { alert('Add +7 to ' + this.state.team1) }}
>
<Text style={styles.buttonText}>
{this.state.team1} TOUCHDOWN!
</Text>
</TouchableHighlight>
Los botones deben destacar. Usamos un fondo verde oscuro y bordes blancos para simular un ambiente deportivo.
button: {
backgroundColor: 'green',
borderColor: 'white',
borderWidth: 2,
}
Repaso final: ¿Qué hemos aprendido?
1. ¿Por qué usamos flex: 1 en el contenedor principal?
Para obligar al contenedor a ocupar todo el espacio disponible de la pantalla.
2. ¿Qué componente NO puede tener hijos?
El componente Image (debe ser ImageBackground para anidar).
3. ¿Qué define el Aspect Ratio?
La relación proporcional entre el ancho y el alto de una imagen.
4. ¿Cómo escalamos una imagen al 100%?
Usando Dimensions para obtener la altura y anchura del dispositivo.
Escalado de imágenes
Si una imagen mide 250x250 y le das dimensiones de 100x250...
Resultado:
La imagen se encogerá para caber en el espacio, pero se verá distorsionada.
Siempre intenta mantener el Aspect Ratio original para evitar que las imágenes se vean estiradas o aplastadas.
Original
Distorsionada
Flex: Ratios en profundidad
Si un contenedor tiene 3 hijos con los siguientes valores de flex:
A: 1
B: 2
C: 1
¿Qué porcentaje de la pantalla ocupa el bloque B?
Respuesta: 50% (2 de un total de 4 partes)
Cuándo usar flexDirection: 'row'
Barras de navegación
Listas con íconos
Botones de acción lateral
Maquetación compleja
Las aplicaciones reales rara vez usan una sola dirección. Combinamos filas y columnas para crear rejillas.
Un View principal en columna puede contener múltiples Views que usen flexDirection: 'row' para sus hijos.
El papel de AppRegistry
Aunque CodeHS lo maneja automáticamente en su previsualización, es vital recordar que AppRegistry es quien registra nuestra aplicación con el sistema nativo.
AppRegistry.registerComponent('App', () => App);
Punto de entrada
Sin este registro, el dispositivo no sabría qué componente renderizar al iniciar la aplicación.
¿Listos para programar?
Hemos cubierto los pilares visuales de React Native. Ahora es tu turno de aplicar estos conocimientos en los laboratorios de CodeHS.
1
Explorar
2
Construir
3
Iterar
¡Gracias!
"Programar no es solo escribir código, es diseñar experiencias."
Mr. Norman Trujillo
ntrujillo@csa.edu.ni
React Native Final Slides Principles of computer science
Desarrollo de Aplicaciones Móviles
Tema: Diseño visual y layouts avanzados en React Native
Docente: Mr. Norman Trujillo
ntrujillo@csa.edu.ni
Contenido de la sesión
01
Componentes de imagen
Uso de Image y gestión de recursos visuales.
02
Fondos dinámicos
Implementación de ImageBackground y anidamiento.
03
Interactividad
Botones visuales con TouchableHighlight.
04
Layouts y dimensiones
Diseño responsivo con Flex y Dimensions.
El componente Image
El componente Image es la herramienta fundamental para mostrar gráficos en nuestra aplicación. Es necesario importarlo desde la librería react-native para utilizarlo.
<Image source={{ uri: 'URL' }} />
A diferencia de otros contenedores, las imágenes requieren dimensiones explícitas para ser visibles.
Quiz 4.1.2: Visibilidad
¿Se mostrará el siguiente componente en la pantalla?
<Image
source={{ uri: 'https://static.codehs.com/img/courses/introkarel/1.png ' }}
style={{ width: 200 }}
/>
Verdadero
Falso
Sin un valor de altura (height), la imagen no tendrá espacio para renderizarse.
Quiz 4.1.2: URIs válidas
¿Cuál de estas es una extensión de archivo válida para una URI en React Native?
A) .mp4
B) .mov
C) .png
D) .img
Los archivos .png son formatos de imagen estándar que el motor de renderizado interpreta correctamente.
Estructura base en CodeHS
Es fundamental iniciar cada práctica con este código para asegurar la compatibilidad con el emulador.
import React, { Component } from 'react';
import { AppRegistry, Text, View, StyleSheet } from 'react-native';
import Constants from 'expo-constants';
export default class App extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.paragraph}>
Cambia el código y observa el cambio en tu teléfono.
</Text>
</View>
);
}
}
<View style={styles.container}>
<Image
source={{ uri: 'https://...bird...' }}
style={{ height: 150, width: 150 }}
/>
<Image
source={{ uri: 'https://...lego...' }}
style={{ height: 150, width: 150 }}
/>
</View>
<View style={styles.playerControlsContainer}>
<Image
source={{ uri: '...rewind...' }}
style={styles.arrows}
/>
<Image
source={{ uri: '...pause...' }}
style={styles.pause}
/>
<Image
source={{ uri: '...forward...' }}
style={styles.arrows}
/>
</View>
<ImageBackground source={...}>
<Text>Encima</Text>
</ImageBackground>
<TouchableHighlight onPress={...}>
<Image ... />
</TouchableHighlight>
<View style={styles.container}>
<View style={styles.yellowBox}>
<Image
source={{ uri: '...ghost...' }}
style={{ height: deviceHeight / 10, width: deviceHeight / 10 }}
/>
</View>
<TouchableHighlight
style={styles.redBox}
onPress={() => alert('Sesión iniciada')}
>
<Text style={styles.label}>LOG IN</Text>
</TouchableHighlight>
</View>
<View style={styles.container}>
<View style={styles.yellowStripe} />
<View style={styles.yellowStripe} />
<View style={styles.orangeStripe} />
</View>
<View style={styles.redStripe}>
<View style={styles.orangeBox}>
<Image source={...star...} style={{ height: 100, width: 100 }} />
</View>
</View>
<View style={styles.orangeStripe}>
<Image ...star... />
<Image ...star... />
<Image ...star... />
</View>
React Native Final Slides Final Version Principles of computer science
Desarrollo de Aplicaciones Móviles
Tema: Diseño visual y layouts avanzados en React Native
Docente: Mr. Norman Trujillo
ntrujillo@csa.edu.ni
Contenido de la sesión
01
Componentes de imagen
Uso de Image y gestión de recursos visuales.
02
Fondos dinámicos
Implementación de ImageBackground y anidamiento.
03
Interactividad
Botones visuales con TouchableHighlight.
04
Layouts y dimensiones
Diseño responsivo con Flex y Dimensions.
El componente Image
El componente Image es la herramienta fundamental para mostrar gráficos en nuestra aplicación. Es necesario importarlo desde la librería react-native para utilizarlo en el desarrollo.
<Image source={{ uri: 'URL' }} />
A diferencia de otros contenedores, las imágenes requieren dimensiones explícitas para visualizarse en pantalla.
Quiz 4.1.2: Visibilidad
¿Se mostrará el siguiente componente en la pantalla?
<Image
source={{ uri: 'https://static.codehs.com/img/courses/introkarel/1.png ' }}
style={{ width: 200 }}
/>
Verdadero
Falso
Sin un valor de altura definido, la imagen no tendrá espacio para renderizarse.
Quiz 4.1.2: URIs válidas
¿Cuál de estas es una extensión de archivo válida para una URI en React Native?
A) .mp4
B) .mov
C) .png
D) .img
Los archivos .png son formatos de imagen estándar que el motor de renderizado interpreta correctamente en dispositivos móviles.
Estructura base en CodeHS
Es fundamental iniciar cada práctica con este código para asegurar la compatibilidad con el emulador y las herramientas de aprendizaje.
import React, { Component } from 'react';
import { AppRegistry, Text, View, StyleSheet } from 'react-native';
import Constants from 'expo-constants';
export default class App extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.paragraph}>
Cambia el código y observa el cambio en tu teléfono móvil.
</Text>
</View>
);
}
}
<View style={styles.container}>
<Image
source={{ uri: 'https://...bird...' }}
style={{ height: 150, width: 150 }}
/>
<Image
source={{ uri: 'https://...lego...' }}
style={{ height: 150, width: 150 }}
/>
</View>
<View style={styles.playerControlsContainer}>
<Image
source={{ uri: '...rewind...' }}
style={styles.arrows}
/>
<Image
source={{ uri: '...pause...' }}
style={styles.pause}
/>
<Image
source={{ uri: '...forward...' }}
style={styles.arrows}
/>
</View>
<ImageBackground source={...}>
<Text>Contenido Encima</Text>
</ImageBackground>
<TouchableHighlight onPress={...}>
<Image ... />
</TouchableHighlight>
<View style={styles.container}>
<View style={styles.yellowBox}>
<Image
source={{ uri: '...ghost...' }}
style={{ height: deviceHeight / 10, width: deviceHeight / 10 }}
/>
</View>
<TouchableHighlight
style={styles.redBox}
onPress={() => alert('Sesión iniciada con éxito')}
>
<Text style={styles.label}>LOG IN</Text>
</TouchableHighlight>
</View>
<View style={styles.container}>
<View style={styles.yellowStripe} />
<View style={styles.yellowStripe} />
<View style={styles.orangeStripe} />
</View>
<View style={styles.redStripe}>
<View style={styles.orangeBox}>
<Image source={...star...} style={{ height: 100, width: 100 }} />
</View>
</View>
<View style={styles.orangeStripe}>
<Image ...star... />
<Image ...star... />
<Image ...star... />
</View>
React Native Visual Study Guide Guía de autoestudio: Diseño visual y layouts
Principles of computer science (Mobile App)
Estudiante: __________________________________________________
Fecha: _______________________________________________________
Docente: Mr. Norman Trujillo
Correo: ntrujillo@csa.edu.ni
0. Configuración inicial de CodeHS
Para todos los ejercicios de esta guía, utiliza el siguiente código base proporcionado por el emulador de CodeHS. Asegúrate siempre de importar la librería AppRegistry para el correcto funcionamiento de tu aplicación.
import React, { Component } from 'react';
import { AppRegistry, Text, View, StyleSheet } from 'react-native';
import Constants from 'expo-constants';
export default class App extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.paragraph}>
¡Cambia el código y observa el cambio en tu teléfono!
</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
},
paragraph: {
margin: 24,
fontSize: 18,
fontWeight: 'bold',
textAlign: 'center',
color: '#34495e',
},
});
1. Fundamentos del componente Image
1.1 Análisis de visibilidad
Pregunta: ¿Se mostrará el siguiente componente en pantalla? Justifica tu respuesta.
<Image
source={{ uri: 'https://static.codehs.com/img/courses/introkarel/1.png ' }}
style={{ width: 200 }}
/>
1.2 Práctica: Gato bailarín
Utilizando la estructura de anidamiento, crea una aplicación que muestre una imagen animada y un pie de foto centrado. El docente explicará cómo gestionar el margen superior.
URI: https://media.tenor.com/6yMqezH9zcIAAAAM/cat-dance-dance-cat.gif
Dimensiones: 200 x 200
Texto: “Gato bailarín” (Negrita, tamaño 24)
Dibuja aquí el esquema visual esperado de los componentes anidados.
2. Estructura de bloques: Snapchat Login Pt 1
React Native Study Guide Answer Key Clave de respuestas: Diseño visual y layouts
Principles of computer science (Mobile App)
Docente: Mr. Norman Trujillo
1. Fundamentos del componente Image
1.1 Análisis de visibilidad:
No, la imagen no se mostrará. En React Native, los componentes Image requieren obligatoriamente tanto la anchura (width) como la altura (height) para que el motor de renderizado asigne el espacio necesario en el layout.
1.2 Práctica: Gato bailarín (Esquema):
El esquema debe mostrar un View contenedor con un Image arriba (con bordes redondeados según el ejercicio) y un componente Text justo debajo con la propiedad fontWeight: 'bold'.
2. Estructura de bloques: Snapchat Login
Objeto de estilo para el bloque amarillo:
amarillo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'yellow',
width: '100%',
height: '70%',
},
Código JSX para el componente Image:
<Image
source={{uri: 'https://codehs.com/uploads/c799accde67e1fd3bbd699119b4e1c83'}}
style={{ width: 100, height: 100 }}
/>
3. Fondos dinámicos
3.1 Phone Background (Orden de renderizado):
La imagen de fondo (definida en el source de ImageBackground) se dibuja primero. Luego, los componentes hijos (hora y fecha) se dibujan en una capa superior. Si hubiera un View envolviendo a los hijos, este se sitúa sobre la imagen pero debajo de los textos si no tienen fondo propio.
3.2 Perfil de Julia Carson:
La propiedad borderWidth: 10 se utiliza para crear un marco grueso alrededor de la fotografía, lo que le otorga un estilo de tarjeta de presentación o marco de foto físico, mejorando el diseño visual.
4. Interactividad
Completar la función onPress:
onPress={ () => alert('“Un barco en el puerto está seguro, pero no es para eso que están hechos los barcos.”') }
Explicación de la función anónima:
Es una función de flecha (arrow function) que define un bloque de código que se ejecutará únicamente cuando ocurra el evento de presión. Permite encapsular la lógica sin ejecutarla inmediatamente al cargar la aplicación.
5. Flex Layout y Direcciones
Organización de la Bandera de Suecia:
Se requiere un View principal con flexDirection: 'row'. Dentro, tres columnas: 1) View azul con flex: 2 (contiene franjas azules y amarilla horizontal), 2) View amarilla con flex: 1 (franja vertical), 3) View azul con flex: 5 (contiene franjas azules y amarilla horizontal).
React Native Final Study Guide Final Version Guía de autoestudio: Diseño visual y layouts
Principles of computer science (Mobile App)
Estudiante: __________________________________________________
Fecha: _______________________________________________________
Docente: Mr. Norman Trujillo
Correo: ntrujillo@csa.edu.ni
0. Configuración inicial de CodeHS
Para todos los ejercicios de esta guía, utiliza el siguiente código base proporcionado por el emulador de CodeHS. Asegúrate siempre de importar la librería AppRegistry para el correcto funcionamiento de tu aplicación móvil.
import React, { Component } from 'react';
import { AppRegistry, Text, View, StyleSheet } from 'react-native';
import Constants from 'expo-constants';
export default class App extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.paragraph}>
¡Cambia el código y observa el cambio en tu teléfono!
</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
},
paragraph: {
margin: 24,
fontSize: 18,
fontWeight: 'bold',
textAlign: 'center',
color: '#34495e',
},
});
AppRegistry.registerComponent('App', () => App);
1. Fundamentos del componente Image
1.1 Análisis de visibilidad
Pregunta: ¿Se mostrará el siguiente componente en pantalla? Justifica tu respuesta técnica.
<Image
source={{ uri: 'https://static.codehs.com/img/courses/introkarel/1.png ' }}
style={{ width: 200 }}
/>
1.2 Práctica guiada: Gato bailarín
Utilizando la estructura de anidamiento, crea una aplicación que muestre una imagen animada y un pie de foto centrado. El docente explicará cómo gestionar el margen superior.
Uri: https://media.tenor.com/6yMqezH9zcIAAAAM/cat-dance-dance-cat.gif
Dimensiones: 200 x 200
Texto: “Gato bailarín” (Negrita, tamaño 24)
Dibuja aquí el esquema visual esperado de los componentes anidados según la explicación del docente.
React Native Final Answer Key Final Version Clave de respuestas: Diseño visual y layouts
Principles of computer science (Mobile App)
Docente: Mr. Norman Trujillo
1. Fundamentos del componente Image
1.1 Análisis de visibilidad:
No, la imagen no se visualizará en pantalla. En el desarrollo con React Native, los componentes Image demandan obligatoriamente tanto la anchura (width) como la altura (height) para que el motor de renderizado asigne el espacio necesario en el diseño visual de la aplicación móvil.
1.2 Práctica guiada: Gato bailarín (Esquema):
El esquema debe representar un contenedor View con un Image en la parte superior (con bordes redondeados según el ejercicio práctico) y un componente Text situado inmediatamente debajo con la propiedad de estilo fontWeight establecida en ‘bold’.
2. Estructura de bloques: Snapchat Login
Objeto de estilo para el bloque amarillo:
amarillo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'yellow',
width: '100%',
height: '70%',
},
Código JSX para el componente Image:
<Image
source={{uri: 'https://codehs.com/uploads/c799accde67e1fd3bbd699119b4e1c83'}}
style={{ width: 100, height: 100 }}
/>
3. Fondos dinámicos
3.1 Phone Background (Orden de renderizado):
La imagen de fondo (declarada en la propiedad source del componente ImageBackground) se renderiza primero. Posteriormente, los componentes hijos (como la hora y la fecha) se dibujan en una capa superior. Si existiera un View envolviendo a los hijos, este se posiciona sobre la imagen pero debajo de los textos si no poseen un fondo propio.
3.2 Perfil profesional de Julia Carson:
La propiedad borderWidth establecida en 10 se emplea para generar un marco robusto alrededor de la fotografía. Esto otorga una estética de tarjeta de presentación o marco fotográfico físico, optimizando la presentación visual del perfil.
4. Interactividad
Completar la función onPress:
onPress={ () => alert('“Un barco en el puerto está seguro, pero no es para eso que están hechos los barcos.”') }
Explicación de la función anónima:
Representa una función de flecha (arrow function) que establece un bloque de código el cual se ejecutará únicamente en el momento en que se registre el evento de presión del estudiante. Esto permite encapsular la lógica de interacción sin que se dispare automáticamente al cargar la aplicación móvil.
5. Flex Layout y Direcciones
Estructura de la Bandera de Suecia:
El papel de AppRegistry Aunque CodeHS lo oculta en ocasiones para simplificar la interfaz, AppRegistry es el punto de entrada que registra el componente raíz de tu aplicación.
Sin este registro, el sistema operativo móvil no sabría qué parte de tu código de JavaScript debe cargar al iniciar.
AppRegistry.registerComponent('App', () => App);
Siempre incluiremos la importación de AppRegistry en nuestros ejercicios desarrollados.
Múltiples componentes Image Podemos organizar varios componentes visuales dentro de un mismo View para crear interfaces ricas.
Combinando Image y Text Es común añadir descripciones o subtítulos a nuestras imágenes. Los componentes se renderizan en el orden en que aparecen en el código.
<Image ... />
<Text style={styles.caption}>
Gato bailarín
</Text>
Snapchat Login Page En este ejercicio práctico, los estudiantes aprenderán a posicionar elementos complejos y utilizar recursos externos.
Objetivo: Añadir la imagen icónica del fantasma de Snapchat al centro del bloque amarillo de tu interfaz.
Snapchat: Implementación del Render
Snapchat: Estilos de la aplicación amarillo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'yellow',
width: '100%',
height: '70%',
},
rojo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'red',
width: '100%',
height: '15%',
},
azul: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#279FF5',
width: '100%',
height: '15%',
},
Reproductor de música móvil En este reto avanzado, los estudiantes construirán una interfaz completa para un reproductor multimedia.
• Portada del álbum (275x275)
• Información de la pista
• Barra de tiempo
• Controles de navegación
Reproductor: Código de controles
Reproductor: Estilos avanzados arrows: {
margin: 25,
height: 20,
width: 30,
},
pause: {
height: 70,
width: 70,
},
playerControlsContainer: {
flexDirection: 'row',
marginTop: 20,
},
Google Search con imágenes En este ejercicio, los estudiantes actualizan su interfaz de Google para utilizar activos gráficos reales en lugar de solo colores.
Puedes redondear las esquinas de un campo de texto utilizando borderTopLeftRadius y borderBottomLeftRadius.
Google: Manejo de entrada y alertas state = { searchText: '', }
<TextInput
style={styles.searchBar}
onChangeText={(searchText) => this.setState({searchText})}
value={this.state.searchText}
/>
<TouchableHighlight
style={styles.button}
onPress={() => { alert('Buscando: ' + this.state.searchText) }}
>
<Image source={{ uri: '...lupa...' }} style={{ height: 30, width: 30 }} />
</TouchableHighlight>
ImageBackground ¿Qué sucede si queremos colocar texto sobre una imagen? El componente Image normal no permite tener "hijos".
Para esto utilizamos ImageBackground. Funciona como un contenedor que dibuja una imagen debajo de todo lo que pongas dentro.
Quiz 4.2.2: Control de altura Si la pantalla tiene 400 píxeles de alto, ¿cuál de estos NO cubrirá toda la altura?
Respuesta: C. Solo cubrirá la mitad de la pantalla disponible.
Ejemplo: Hello, Universe! <ImageBackground
style={styles.background}
source={{ uri: '...universo...' }}
>
<View style={styles.textContainer}>
<Text style={styles.paragraph}>
¡Hola, Universo!
</Text>
</View>
</ImageBackground>
Ejercicio: Phone Background Diseña la pantalla de inicio de tu propio dispositivo móvil utilizando componentes anidados.
• Usa una imagen de fondo al 100%.
• Añade la hora actual.
• Añade la fecha con un estilo elegante.
Estilos del Phone Background time: {
textAlign: 'center',
fontSize: 70,
fontFamily: 'Helvetica',
color: 'white',
},
date: {
textAlign: 'center',
fontSize: 20,
fontFamily: 'Helvetica',
color: 'white',
marginTop: 20,
},
back: {
height: '100%',
width: '100%',
},
Interactividad móvil Para que nuestras imágenes funcionen como botones reales, utilizamos el componente TouchableHighlight.
Este componente "envuelve" a cualquier elemento y detecta cuando el estudiante lo presiona en la pantalla.
Quiz 4.3.2: Estructura interactiva ¿Cuál de estos códigos permite que la imagen de Karel sea clickeable?
A) <Image source={...} onPress={...} />
B) <TouchableHighlight onPress={...}>
<Image source={...} />
</TouchableHighlight>
Las imágenes en React Native no tienen la propiedad onPress por sí mismas.
Ejercicio: Citas interactivas Crea una aplicación que muestre una imagen de una figura inspiradora.
Al presionar la imagen, debe aparecer un cuadro de alerta con una cita famosa de esa persona.
"Un barco en el puerto está seguro, pero no es para eso que están hechos los barcos."
Citas: Implementación del Alerta <TouchableHighlight
onPress={() => { alert('"Un barco en el puerto..."'); }}
>
<Image
source={{ uri: 'URL_ADA' }}
style={{ height: 450, width: 375 }}
/>
</TouchableHighlight>
Flex Layouts El sistema Flex permite que los componentes se expandan para llenar el espacio disponible de manera inteligente.
La propiedad flex: 1 indica que un componente debe ocupar todo el espacio que su contenedor padre le ofrezca.
Si tienes dos elementos con flex: 1, se repartirán el espacio 50% y 50%.
Quiz 4.4.2: Proporciones Flex Si un contenedor tiene flex: 1, ¿qué significa para su componente hijo?
A) El componente siempre llenará el 100% del contenedor padre.
✓ El componente llenará cualquier espacio en blanco de su contenedor padre.
Flex permite que la interfaz sea elástica y se adapte al tamaño de la pantalla.
Dirección del Layout
Column (Por defecto)
Row
Ejercicio: Rainbow Background Crea un fondo de arcoíris utilizando 7 franjas de colores proporcionales.
Usa flex: 1 en cada una de las 7 Views hijas para que se repartan el alto de la pantalla de forma equitativa.
Layout de Banderas Utiliza relaciones de flex para replicar la bandera de Sierra Leona.
• Padre: flexDirection: 'row'
• Azul: flex: 1
• Blanco: flex: 1
• Verde: flex: 1
Diseño avanzado: Bandera de Suecia Para diseños complejos, necesitamos anidar contenedores con diferentes direcciones.
container: { flexDirection: 'row' },
side: { flex: 2 },
center: { flex: 1, backgroundColor: '#F8CC46' }
Este diseño requiere 3 columnas principales donde la central es la franja vertical de la cruz.
Snapchat: Flex y Espaciado Refactoriza el diseño previo para que el bloque amarillo ocupe 5 de las 7 partes totales de la pantalla.
Utiliza flex: 5 para el bloque amarillo y flex: 1 para cada botón.
Dimensions API ¿Cómo adaptamos nuestra app a diferentes tamaños de pantalla reales? Usamos la API Dimensions.
Esto nos permite obtener el ancho y alto exacto del dispositivo del estudiante en tiempo de ejecución.
let deviceHeight = Dimensions.get('window').height;
let deviceWidth = Dimensions.get('window').width;
Quiz 4.5.2: Lógica de dimensiones ¿Cuál es la forma correcta de asignar el ancho completo del dispositivo?
container: { deviceWidth, }
✓ container: { width: deviceWidth, }
Siempre debemos emparejar la propiedad de estilo con el valor de la variable obtenida.
Quiz 4.5.2: Matemáticas de layout Si quieres que 3 componentes hijos llenen la altura total usando Dimensions...
Este método nos da un control preciso sobre el tamaño en píxeles, a diferencia de flex que usa proporciones relativas.
Quiz 4.5.2: Fuentes proporcionales ¿Qué valor permitiría que el tamaño de fuente sea siempre 1/10 de la altura de la pantalla?
A) fontSize: deviceHeight * 10
✓ B) fontSize: deviceHeight / 10
C) fontSize: deviceHeight
Ejemplo: Cuadrícula con Dimensions container: {
height: deviceHeight,
width: deviceWidth,
},
top: {
height: deviceHeight / 2,
flexDirection: 'row',
},
topLeft: {
width: deviceWidth / 2,
backgroundColor: 'blue',
}
Ejercicio: Rainbow v2 (Dimensions) Refactoriza el arcoíris anterior para usar la altura explícita calculada con Dimensions en lugar de flex.
red: {
height: deviceHeight / 7,
backgroundColor: 'red',
}
Snapchat: Layout Responsivo Final
Notas de diseño:
• Pantalla dividida en 7 partes (Bloque amarillo: 5/7).
• Fuente: 1/30 de la altura de la pantalla.
• Imagen: Cuadrado de 1/10 de la altura del dispositivo.
label: {
fontSize: deviceHeight / 30,
color: 'white',
fontWeight: 'bold',
},
image: {
height: deviceHeight / 10,
width: deviceHeight / 10,
}
Snapchat: Código final responsivo
Scorekeeper v3 Pro Lleva tu marcador deportivo al siguiente nivel integrando fondos reales y botones visuales.
• Fondo de estadio con ImageBackground.
• Íconos de equipo en la cabecera.
• Botones de acción con estilo deportivo.
Scorekeeper: Fondo y Registro render() {
return (
<View style={styles.container}>
<ImageBackground
style={{ height: deviceHeight, width: deviceWidth }}
source={{ uri: 'https://...estadio ...' }}
>
<View style={styles.container}>
<!-- Los componentes del marcador aquí -->
</View>
</ImageBackground>
</View>
);
}
Scorekeeper: Estilos de los botones button: {
height: deviceHeight / 8,
width: deviceWidth / 2.5,
backgroundColor: 'green',
borderColor: 'white',
borderWidth: 2,
alignItems: 'center',
justifyContent: 'center',
margin: 10,
},
buttonText: {
color: 'white',
fontSize: deviceHeight / 40,
textAlign: 'center',
},
Quiz Avanzado 4.7.1: Importancia de Flex En todas nuestras aplicaciones, siempre tenemos un componente View que actúa como contenedor. ¿Por qué es importante establecer su flex en 1?
Respuesta: Porque dar a la View principal un valor de flex: 1 obliga a la View a ocupar todo el espacio disponible en la pantalla.
Quiz Avanzado 4.7.1: Contenedores ¿Cuál de los siguientes componentes NO puede contener componentes hijos?
B) ImageBackground component
D) TouchableHighlight component
Quiz 4.7.1: Dimensiones forzadas Supongamos que una imagen mide 250x250 píxeles. Si le das las dimensiones de 100x250 píxeles, ¿qué sucederá con la imagen renderizada?
La imagen se encogerá al tamaño especificado (manteniendo toda la imagen, pero más pequeña en el eje horizontal).
Nota: No puedes especificar dimensiones que sean diferentes del tamaño real de la imagen sin que esta se escale.
Quiz 4.7.1: Aspect Ratio ¿Qué define el Aspect Ratio de una imagen?
La relación entre el ancho y el alto de una imagen.
Quiz 4.7.1: Análisis de salida de código container: { flex: 1 },
yellowStripe: { flex: 1, backgroundColor: 'yellow' },
orangeStripe: { flex: 2, backgroundColor: 'orange' }
Quiz 4.7.1: Composición visual redStripe: { flex: 4, backgroundColor: 'red', alignItems: 'center' },
orangeBox: { height: 200, width: 200, backgroundColor: 'orange' }
Quiz 4.7.1: Ajuste de escala ¿Cómo aumentaríamos el tamaño de la imagen de la estrella dentro del bloque naranja?
Aumentar el ancho (width) y el alto (height) en la etiqueta de la imagen.
Cambiar el tamaño del contenedor naranja no afectará el tamaño de la imagen interior si esta tiene dimensiones fijas.
Quiz 4.7.1: Mantenimiento del Aspect Ratio Si una imagen tiene una altura de 100 píxeles y un ancho de 200 píxeles, y aumentamos la altura a 300 píxeles, ¿qué ancho debemos establecer para mantener la proporción?
Cálculo: (300 / 100) * 200 = 600. La imagen creció 3 veces en altura, por lo que debe crecer 3 veces en ancho.
Quiz 4.7.1: Alineación horizontal orangeStripe: { flex: 4, backgroundColor: 'orange', flexDirection: 'row' }
Al usar flexDirection: 'row', las estrellas se alinean de izquierda a derecha.
Quiz 4.7.1: Flex en interfaces reales ¿Qué valores de flex podrían controlar este layout?
Cualquier conjunto de valores que mantenga la relación de tamaño (1:1:2:2:4) funcionará correctamente.
Quiz 4.7.1: Análisis de Bandera con Dimensions top: { height: deviceHeight/5, flexDirection: 'row' },
bottom: { height: 4*(deviceHeight/5), flexDirection: 'row' },
topLeft: { width: 2*(deviceWidth/3), backgroundColor: 'red' },
topRight: { width: deviceWidth/3, backgroundColor: 'blue' }
Quiz 4.7.1: Atributos de layout Para crear una bandera con franjas verticales, ¿qué atributo es estrictamente necesario?
Sin este atributo, las franjas se apilarían una encima de otra en lugar de ir de lado a lado.
Quiz 4.7.1: Diferencias fundamentales ¿En qué se diferencian ImageBackground e Image?
I. ImageBackground puede contener otros componentes, Image no.
II. Ambos requieren atributos de altura y anchura para renderizarse correctamente.
Respuesta: I y II son correctas.
Quiz 4.7.1: Reto matemático final Si la pantalla mide 300 x 600 y establecemos una imagen con height: deviceHeight / 3 y width: deviceHeight / 3, ¿cuál será su tamaño?
Cálculo: 600 (alto) / 3 = 200. Tanto el alto como el ancho serán 200.
Conclusiones
Visibilidad Las imágenes requieren siempre dimensiones para existir en el layout móvil.
Capas Usa ImageBackground únicamente cuando necesites colocar elementos sobre una imagen.
Flujo TouchableHighlight es el estándar para añadir interactividad a cualquier componente visual.
Adaptabilidad Combina Flex y Dimensions para asegurar que tu diseño se vea bien en cualquier teléfono.
FIN
AppRegistry.registerComponent('App', () => App);
El papel de AppRegistry Aunque CodeHS lo oculta en ocasiones para simplificar la interfaz, AppRegistry es el punto de entrada que registra el componente raíz de tu aplicación.
Sin este registro, el sistema operativo móvil no sabría qué parte de tu código de JavaScript debe cargar al iniciar la ejecución.
AppRegistry.registerComponent('App', () => App);
Siempre incluiremos la importación de AppRegistry en nuestros ejercicios desarrollados por docentes.
Múltiples componentes Image Podemos organizar varios componentes visuales dentro de un mismo contenedor View para crear interfaces ricas.
Combinando Image y Text Es común añadir descripciones o subtítulos a nuestras imágenes. Los componentes se renderizan en el orden secuencial en que aparecen en el código.
<Image ... />
<Text style={styles.caption}>
Gato bailarín
</Text>
Snapchat Login Page En este ejercicio práctico, los estudiantes aprenderán a posicionar elementos complejos y utilizar recursos externos de diseño.
Objetivo: Añadir la imagen icónica del fantasma de Snapchat al centro del bloque amarillo de tu interfaz de usuario.
Snapchat: Implementación del Render
Snapchat: Estilos de la aplicación amarillo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'yellow',
width: '100%',
height: '70%',
},
rojo: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'red',
width: '100%',
height: '15%',
},
azul: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#279FF5',
width: '100%',
height: '15%',
},
Reproductor de música móvil En este reto avanzado, los estudiantes construirán una interfaz completa para un reproductor multimedia de música.
• Portada del álbum (275 píxeles x 275 píxeles)
• Información detallada de la pista
• Barra de tiempo de reproducción
• Controles de navegación responsivos
Reproductor: Código de controles
Reproductor: Estilos avanzados arrows: {
margin: 25,
height: 20,
width: 30,
},
pause: {
height: 70,
width: 70,
},
playerControlsContainer: {
flexDirection: 'row',
marginTop: 20,
},
Google Search con imágenes En este ejercicio, los estudiantes actualizan su interfaz de Google para utilizar activos gráficos reales en lugar de implementar simplemente colores planos.
Puedes redondear las esquinas de un campo de texto utilizando las propiedades borderTopLeftRadius y borderBottomLeftRadius.
Buscar en la web ahora...
Google: Manejo de entrada y alertas state = { searchText: '', }
<TextInput
style={styles.searchBar}
onChangeText={(searchText) => this.setState({searchText})}
value={this.state.searchText}
/>
<TouchableHighlight
style={styles.button}
onPress={() => { alert('Buscando el término: ' + this.state.searchText) }}
>
<Image source={{ uri: '...lupa...' }} style={{ height: 30, width: 30 }} />
</TouchableHighlight>
ImageBackground ¿Qué sucede si queremos colocar texto sobre una imagen de fondo? El componente Image estándar no permite tener elementos "hijos" en su estructura.
Para esto utilizamos ImageBackground. Funciona como un contenedor que dibuja una imagen debajo de todo lo que sitúes dentro.
Quiz 4.2.2: Control de altura Si la pantalla tiene 400 píxeles de alto, ¿cuál de estos ejemplos NO cubrirá toda la altura disponible?
Respuesta: Opción C. Únicamente cubrirá la mitad de la altura total de la pantalla.
Ejemplo: Hello, Universe! <ImageBackground
style={styles.background}
source={{ uri: '...universo...' }}
>
<View style={styles.textContainer}>
<Text style={styles.paragraph}>
¡Hola, Universo!
</Text>
</View>
</ImageBackground>
Ejercicio: Phone Background Diseña la pantalla de inicio de tu propio dispositivo móvil utilizando componentes de fondo anidados.
• Usa una imagen de fondo que cubra el 100%.
• Añade la hora actual en formato grande.
• Añade la fecha con un estilo minimalista.
Estilos del Phone Background time: {
textAlign: 'center',
fontSize: 70,
fontFamily: 'Helvetica',
color: 'white',
},
date: {
textAlign: 'center',
fontSize: 20,
fontFamily: 'Helvetica',
color: 'white',
marginTop: 20,
},
back: {
height: '100%',
width: '100%',
},
Interactividad móvil avanzada Para que nuestras imágenes funcionen como botones interactivos, utilizamos el componente TouchableHighlight.
Este componente envuelve a cualquier elemento gráfico y detecta las pulsaciones que realizan los estudiantes en la pantalla táctil.
Quiz 4.3.2: Estructura interactiva ¿Cuál de estos códigos permite que la imagen de Karel sea interactiva?
A) <Image source={...} onPress={...} />
✓ B) <TouchableHighlight onPress={...}>
<Image source={...} />
</TouchableHighlight>
Dato: Las imágenes en React Native no poseen la propiedad onPress de forma nativa.
Ejercicio: Citas interactivas Crea una aplicación que muestre una imagen de una figura histórica inspiradora.
Al presionar la imagen, se debe disparar un cuadro de alerta con una cita célebre de esa persona.
"Un barco en el puerto está seguro, pero no es para eso que están hechos los barcos."
Citas: Implementación del Alerta <TouchableHighlight
onPress={() => { alert('"Un barco en el puerto está seguro..."'); }}
>
<Image
source={{ uri: 'URL_ADA' }}
style={{ height: 450, width: 375 }}
/>
</TouchableHighlight>
Flex Layouts Eficientes El sistema Flex permite que los componentes se expandan para llenar el espacio disponible de forma dinámica.
La propiedad flex: 1 indica que un componente debe tomar todo el espacio que su contenedor padre le ceda.
Si tienes dos elementos con flex: 1, se dividirán el espacio al 50% cada uno.
Quiz 4.4.2: Proporciones Flex ¿Qué significa el valor flex: 1 para un componente hijo?
A) El componente siempre ocupará exactamente el 100% de la pantalla.
✓ El componente llenará cualquier espacio vacío de su contenedor padre.
Flex permite que la interfaz sea adaptable a cualquier tamaño de dispositivo.
Dirección de los Ejes
Column (Vertical)
Row (Horizontal)
Ejercicio: Rainbow Background Crea un fondo de arcoíris utilizando siete franjas de colores proporcionales.
Aplica flex: 1 en cada una de las siete Views para que se distribuyan el alto total de la pantalla de forma equitativa.
Diseño de Banderas Implementa relaciones de flex para replicar el diseño de la bandera de Sierra Leona.
Configuración del estilo:
• Contenedor: flexDirection: 'row'
• Color Azul: flex: 1
• Color Blanco: flex: 1
• Color Verde: flex: 1
Layout Avanzado: Suecia Para construir diseños de mayor complejidad, es imperativo anidar contenedores con diferentes orientaciones.
container: { flexDirection: 'row' },
side: { flex: 2 },
center: { flex: 1, backgroundColor: '#F8CC46' }
Este diseño emplea tres columnas principales donde la central actúa como la franja vertical de la cruz.
Snapchat: Flex y Espaciado Proporcional Refactoriza el diseño previo de tal manera que el bloque amarillo ocupe exactamente 5 de las 7 partes totales de la pantalla móvil.
Implementa flex: 5 para el bloque principal y flex: 1 para cada uno de los botones inferiores.
Dimensions API ¿Cómo logramos que nuestra aplicación sea totalmente adaptable? Empleamos la API Dimensions.
Esto nos otorga la capacidad de obtener el ancho y alto precisos del dispositivo del estudiante en tiempo real.
let deviceHeight = Dimensions.get('window').height;
let deviceWidth = Dimensions.get('window').width;
Quiz 4.5.2: Lógica de dimensiones ¿Cuál es el método adecuado para asignar el ancho completo del dispositivo?
container: { deviceWidth, }
✓ container: { width: deviceWidth, }
Es imperativo emparejar siempre la propiedad de estilo con el valor de la variable obtenida.
Quiz 4.5.2: Matemáticas Aplicadas Si necesitas que tres componentes llenen la altura total mediante Dimensions...
Este procedimiento nos otorga una precisión absoluta sobre el tamaño en píxeles de la interfaz móvil.
Quiz 4.5.2: Fuentes Adaptables ¿Qué expresión permite que el tamaño de la fuente sea siempre una décima parte de la altura total?
A) fontSize: deviceHeight * 10
✓ B) fontSize: deviceHeight / 10
C) fontSize: deviceHeight
Ejemplo: Cuadrícula con Dimensions container: {
height: deviceHeight,
width: deviceWidth,
},
top: {
height: deviceHeight / 2,
flexDirection: 'row',
},
topLeft: {
width: deviceWidth / 2,
backgroundColor: 'blue',
}
Ejercicio: Rainbow v2 (Dimensions) Refactoriza el arcoíris anterior para implementar la altura exacta calculada con Dimensions en lugar de usar flex.
red: {
height: deviceHeight / 7,
backgroundColor: 'red',
}
Snapchat: Layout Responsivo Final
Especificaciones:
• División de pantalla en siete secciones iguales.
• Tamaño de fuente: 1/30 del alto total disponible.
• Dimensiones de imagen: Cuadrado perfecto de 1/10.
label: {
fontSize: deviceHeight / 30,
color: 'white',
fontWeight: 'bold',
},
image: {
height: deviceHeight / 10,
width: deviceHeight / 10,
}
Snapchat: Código final responsivo
Scorekeeper v3 Pro Eleva la calidad de tu marcador deportivo integrando fondos inmersivos y componentes visuales interactivos.
• Fondo fotográfico mediante ImageBackground.
• Representación de equipos con íconos específicos.
• Botonera optimizada con estilo de campo de juego.
Scorekeeper: Fondo y Contenedor render() {
return (
<View style={styles.container}>
<ImageBackground
style={{ height: deviceHeight, width: deviceWidth }}
source={{ uri: 'https://...estadio ...' }}
>
<View style={styles.container}>
{/* Los elementos del marcador se anidan aquí */}
</View>
</ImageBackground>
</View>
);
}
Scorekeeper: Estética de los botones button: {
height: deviceHeight / 8,
width: deviceWidth / 2.5,
backgroundColor: 'green',
borderColor: 'white',
borderWidth: 2,
alignItems: 'center',
justifyContent: 'center',
margin: 10,
},
buttonText: {
color: 'white',
fontSize: deviceHeight / 40,
textAlign: 'center',
},
Quiz Avanzado 4.7.1: Importancia de Flex ¿Por qué es imperativo que el componente View que actúa como contenedor principal posea un valor de flex igual a 1?
Respuesta: Debido a que asignar a la View raíz un valor de flex: 1 garantiza que el contenedor ocupe la totalidad del espacio disponible en el dispositivo móvil.
Quiz Avanzado 4.7.1: Contenedores ¿Cuál de los siguientes componentes carece de la capacidad de albergar componentes hijos?
B) ImageBackground component
D) TouchableHighlight component
Quiz 4.7.1: Dimensiones forzadas Considerando una imagen de 250x250 píxeles, si defines dimensiones de 100x250 píxeles, ¿cuál será el resultado visual?
La imagen se contraerá al tamaño especificado (preservando el gráfico completo, pero comprimido en el eje horizontal).
Aclaración: No es posible declarar dimensiones que difieran del tamaño nativo sin que se produzca un escalado.
Quiz 4.7.1: Aspect Ratio ¿Qué concepto define el Aspect Ratio?
La relación proporcional entre la anchura y la altura de un elemento visual.
Quiz 4.7.1: Análisis de salida container: { flex: 1 },
yellowStripe: { flex: 1, backgroundColor: 'yellow' },
orangeStripe: { flex: 2, backgroundColor: 'orange' }
Quiz 4.7.1: Composición de elementos redStripe: { flex: 4, backgroundColor: 'red', alignItems: 'center' },
orangeBox: { height: 200, width: 200, backgroundColor: 'orange' }
Quiz 4.7.1: Ajuste de Dimensiones ¿Cuál es el procedimiento para incrementar el tamaño de la estrella dentro del bloque naranja?
Incrementar explícitamente el ancho (width) y el alto (height) en el componente de imagen.
Modificar únicamente el contenedor no alterará las dimensiones de la imagen si esta posee valores fijos.
Quiz 4.7.1: Preservación Proporcional Ante una imagen de 100 píxeles de alto y 200 de ancho, si elevas la altura a 300 píxeles, ¿qué anchura se requiere para mantener la proporción?
Procedimiento: (300 / 100) * 200 = 600. La imagen se ha triplicado en altura, por lo que debe triplicarse en anchura.
Quiz 4.7.1: Alineación de Elementos orangeStripe: { flex: 4, backgroundColor: 'orange', flexDirection: 'row' }
Al implementar la propiedad flexDirection: 'row', los elementos gráficos se alinean de forma horizontal.
Quiz 4.7.1: Flex en Diseño Real ¿Qué conjunto de valores de flex posibilitan el control de esta interfaz de usuario?
Cualquier conjunto numérico que respete la relación proporcional de tamaño (1:1:2:2:4) ejecutará el layout satisfactoriamente.
Quiz 4.7.1: Bandera Mediante Dimensions top: { height: deviceHeight/5, flexDirection: 'row' },
bottom: { height: 4*(deviceHeight/5), flexDirection: 'row' },
topLeft: { width: 2*(deviceWidth/3), backgroundColor: 'red' },
topRight: { width: deviceWidth/3, backgroundColor: 'blue' }
Quiz 4.7.1: Atributos del Layout Para desarrollar una bandera con franjas verticales, ¿qué atributo resulta estrictamente indispensable?
Sin esta propiedad, las secciones de color se apilarían de forma vertical en lugar de lateral.
Quiz 4.7.1: Diferencias Estructurales ¿En qué divergen los componentes ImageBackground e Image?
I. El componente ImageBackground admite componentes hijos; el componente Image no.
II. Ambos componentes exigen declarar atributos de altura y anchura para ser renderizados.
Las afirmaciones I y II son correctas.
Quiz 4.7.1: Desafío de Cálculo Final En una pantalla de 300 x 600, si defines una imagen con height: deviceHeight / 3 y width: deviceHeight / 3, ¿cuál será su magnitud final?
Razonamiento: 600 (alto total) / 3 = 200. Consecuentemente, tanto el alto como el ancho equivaldrán a 200 píxeles.
Conclusiones de la Sesión
Existencia Visual Las imágenes demandan siempre dimensiones explícitas para manifestarse en el layout de la aplicación móvil.
Jerarquía de Capas Emplea ImageBackground únicamente ante la necesidad de situar componentes adicionales sobre una imagen.
Flujo de Interacción TouchableHighlight representa el estándar de la industria para otorgar interactividad a cualquier elemento gráfico.
Diseño Responsivo Integra Flex y Dimensions para garantizar que tu diseño sea consistente en cualquier terminal móvil.
FIN Debes replicar la interfaz de Snapchat añadiendo la imagen del fantasma sobre un bloque amarillo. Sigue las especificaciones del docente para los botones inferiores.
Bloque Amarillo: 70% de altura, centrado absoluto.
Botones: Rojo (15%) y Azul (15%) con texto en blanco y negrita.
Escribe el objeto de estilo para el bloque amarillo:
Escribe el código JSX para el componente Image dentro del bloque:
3. Fondos dinámicos: ImageBackground A diferencia de Image, ImageBackground nos permite colocar componentes hijos sobre la imagen. Analiza el ejercicio del fondo del teléfono.
Ejercicio 3.1: Phone Background
Dibuja una línea de tiempo del renderizado de los componentes hijos dentro del fondo. ¿Qué componente se dibuja primero y cuál se ve al frente?
Ejercicio 3.2: Perfil de Julia Carson
Analiza el código de ejemplo del perfil. ¿Para qué sirve la propiedad borderWidth: 10 en el contenedor de la imagen?
4. Interactividad: TouchableHighlight Para capturar clics o toques del estudiante, envolvemos nuestros elementos en un TouchableHighlight.
Cuando el estudiante presione la imagen de Ada Lovelace, se debe mostrar un alerta. Completa la función onPress:
<TouchableHighlight
onPress={ () => __________________________________________________ }
>
<Image source={{ uri: '...' }} style={{ height: 450, width: 375 }} />
</TouchableHighlight>
Explica con tus palabras qué hace la función anónima () => { ... }:
5. Flex Layout y Direcciones El sistema Flex gestiona proporciones. Si el padre tiene tres hijos con flex: 1, cada uno ocupa 1/3 de la pantalla.
Ejercicio: Bandera de Suecia
Este diseño requiere anidamiento complejo. Describe cómo organizarías las Views para crear la cruz amarilla sobre el fondo azul.
Ejercicio: Fondo Arcoíris
Enumera los 7 colores requeridos en orden y especifica qué propiedad de estilo utilizarías para que las franjas sean horizontales:
6. Diseño Responsivo: API Dimensions La API de Dimensions nos otorga el tamaño exacto en píxeles de cualquier teléfono móvil.
Si una pantalla mide 800 píxeles de alto y queremos una imagen que ocupe exactamente un cuarto de la altura, ¿qué valor de Dimensions aplicarías?
¿Cómo calcularías un fontSize que sea siempre la trigésima parte de la altura del dispositivo?
7. Proyecto: Scorekeeper Pt 3 En este ejercicio integrador, los estudiantes deben aplicar todos los conceptos: Imágenes, TouchableHighlight, Flex y Dimensions. Responde basándote en tu diseño propuesto:
1. ¿Qué imagen de fondo seleccionaste para el estadio y por qué utilizas ImageBackground en lugar de Image?
2. Explica la lógica utilizada para que tus botones verdes de puntuación tengan bordes blancos definidos:
8. Quiz final de conceptos Responde brevemente a las siguientes preguntas técnicas:
A. ¿Qué sucede si das a una imagen de 200x200 dimensiones de 100x200?
B. ¿Por qué usamos AppRegistry.registerComponent al final de nuestro archivo principal?
C. Define con tus palabras qué es el “Aspect Ratio” y por qué es importante para los estudiantes de diseño visual.
Este material es de uso exclusivo para estudiantes de Principles of computer science.
Todos los derechos reservados. Docente responsable: Mr. Norman Trujillo.
Propiedad para franjas horizontales en el Arcoíris:
La propiedad es flexDirection: 'column' (que es la dirección por defecto en React Native). Cada hijo con flex: 1 se apilará verticalmente creando franjas horizontales.
6. Diseño Responsivo Problema matemático (Cuarto de altura):
height: deviceHeight / 4. En una pantalla de 800px, el componente medirá exactamente 200px.
fontSize: deviceHeight / 30.
8. Quiz final de conceptos A. La imagen se verá distorsionada. Al forzar una anchura menor (100) pero mantener la altura original (200), la imagen aparecerá "aplastada" lateralmente.
B. Porque es la instrucción que comunica a la plataforma nativa (iOS/Android) qué componente de JavaScript debe cargarse como raíz al iniciar la ejecución del paquete.
C. El Aspect Ratio es la relación proporcional entre el ancho y el alto de una imagen. Es vital porque permite redimensionar gráficos sin que pierdan su integridad visual o se deformen.
Documento confidencial para uso docente. Prohibida su reproducción sin autorización de Mr. Norman Trujillo.
2. Estructura de bloques: Snapchat Login Pt 1 Debes replicar la interfaz de usuario de Snapchat añadiendo la imagen del fantasma sobre un bloque amarillo. Sigue las especificaciones del docente para los botones inferiores de navegación.
Bloque Amarillo: 70% de altura, centrado absoluto.
Botones: Rojo (15%) y Azul (15%) con texto en blanco y negrita.
Escribe el objeto de estilo para el bloque amarillo:
Escribe el código JSX para el componente Image dentro del bloque:
3. Fondos dinámicos: ImageBackground A diferencia de Image, el componente ImageBackground permite colocar componentes hijos sobre la imagen. Analiza el ejercicio del fondo del teléfono.
Ejercicio 3.1: Phone Background
Dibuja una línea de tiempo del renderizado de los componentes hijos dentro del fondo. ¿Qué componente se dibuja primero y cuál se visualiza al frente?
Ejercicio 3.2: Perfil de Julia Carson
Analiza el código de ejemplo del perfil profesional. ¿Cuál es el propósito técnico de la propiedad borderWidth: 10 en el contenedor de la imagen?
4. Interactividad: TouchableHighlight Para capturar toques del estudiante en la pantalla, envolvemos nuestros elementos en un TouchableHighlight.
Cuando el estudiante presione la imagen de Ada Lovelace, se debe mostrar un alerta. Completa la función onPress:
<TouchableHighlight
onPress={ () => __________________________________________________ }
>
<Image source={{ uri: '...' }} style={{ height: 450, width: 375 }} />
</TouchableHighlight>
Explica con tus palabras qué hace la función anónima () => { ... } en este contexto:
5. Flex Layout y Direcciones El sistema Flex gestiona las proporciones de la interfaz. Si el padre posee tres hijos con flex: 1, cada uno ocupa la tercera parte de la pantalla móvil.
Ejercicio: Bandera de Suecia
Este diseño requiere un anidamiento complejo de contenedores. Describe cómo organizarías las Views para crear la cruz amarilla sobre el fondo azul.
Ejercicio: Fondo Arcoíris
Enumera los siete colores requeridos en orden y especifica qué propiedad de estilo utilizarías para que las franjas se orienten de forma horizontal:
6. Diseño Responsivo: API Dimensions La API de Dimensions nos otorga el tamaño exacto en píxeles de cualquier teléfono móvil en tiempo real.
Si una pantalla mide 800 píxeles de alto y queremos una imagen que ocupe exactamente un cuarto de la altura, ¿qué valor de Dimensions aplicarías?
¿Cómo calcularías un fontSize que sea siempre la trigésima parte de la altura del dispositivo?
7. Proyecto: Scorekeeper Pt 3 En este ejercicio integrador, los estudiantes deben aplicar todos los conceptos: Imágenes, TouchableHighlight, Flex y Dimensions. Responde basándote en tu propuesta de diseño:
1. ¿Qué imagen de fondo seleccionaste para el estadio y por qué utilizas el componente ImageBackground en lugar de un Image simple?
2. Explica la lógica utilizada para que tus botones verdes de puntuación tengan bordes blancos definidos y visibles:
8. Quiz final de conceptos técnicos Responde brevemente a las siguientes preguntas teóricas:
A. ¿Qué sucede con la estética si das a una imagen de 200 x 200 dimensiones de 100 x 200?
B. ¿Por qué es vital usar AppRegistry.registerComponent al final de nuestro archivo principal?
C. Define con tus palabras qué es el ‘Aspect Ratio’ y por qué resulta importante para los estudiantes de diseño de aplicaciones móviles.
Este material es de uso exclusivo para estudiantes de la clase de Principles of computer science.
Todos los derechos reservados. Docente responsable del curso: Mr. Norman Trujillo.
Se demanda un View raíz con la propiedad flexDirection establecida en ‘row’. Internamente, se organizan tres columnas principales: 1) View azul con flex: 2 (que contiene secciones azules y una franja amarilla horizontal), 2) View amarilla con flex: 1 (que forma la franja vertical de la cruz), 3) View azul con flex: 5 (que repite la estructura de franjas azules y amarilla horizontal).
Propiedad para franjas horizontales en el arcoíris:
La propiedad técnica es flexDirection: ‘column’ (la orientación predeterminada en el desarrollo con React Native). Cada componente hijo con flex: 1 se apilará de forma vertical, logrando así la creación de franjas horizontales que ocupan el ancho completo de la pantalla.
6. Diseño Responsivo Problema matemático (Cuarto de altura):
Se debe implementar height: deviceHeight / 4. En un terminal móvil con pantalla de 800 píxeles, el componente gráfico medirá exactamente 200 píxeles.
Ajuste técnico de fuentes:
La expresión correcta es fontSize: deviceHeight / 30.
8. Quiz final de conceptos técnicos A. La imagen presentará una distorsión visual evidente. Al imponer una anchura inferior (100) mientras se conserva la altura nativa (200), el gráfico se mostrará ‘aplastado’ de forma lateral.
B. Porque representa la instrucción fundamental que informa a la plataforma nativa (ya sea iOS o Android) cuál es el componente de JavaScript que debe actuar como raíz al momento de iniciar la ejecución del paquete de la aplicación móvil.
C. El Aspect Ratio es la relación proporcional constante entre el ancho y el alto de un elemento gráfico. Resulta vital porque faculta el redimensionamiento de las imágenes sin que estas pierdan su integridad estructural o sufran deformaciones antiestéticas.
Documento técnico confidencial para uso exclusivo de docentes. Prohibida su reproducción parcial o total sin el consentimiento de Mr. Norman Trujillo.