• No se han encontrado resultados

Gráficos y multimedia

N/A
N/A
Protected

Academic year: 2021

Share "Gráficos y multimedia"

Copied!
29
0
0

Texto completo

(1)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Gráficos y multimedia

(2)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Puntos a tratar

APIs para gráficos

Quartz 2D

Propiedades del contexto

Primitivas geométricas

Imágenes

Texto

Tipos de contexto

CoreAnimation

Propiedades de las capas

Animación de capas

(3)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

APIs para gráficos

OpenGL ES

API multiplataforma

Gráficos 2D y 3D

Alto rendimiento (videojuegos)

APIs de Apple

Quartz 2D / CoreGraphics

CoreAnimation

(4)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Quartz 2D / CoreGraphics

API de las plataformas de Apple para crear composiciones 2D

Por ejemplo gráficas

Todos sus elementos tienen el prefijo CG

No contiene objetos Objective-C, sino estructuras y funciones

Muchos objetos de UIKit pueden transformarse a CoreGraphics

CGColorRef  color  =  [UIColor  redColor].CGColor

(5)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Contexto

Se dibuja en un contexto gráfico CGContextRef

Hace referencia a

Lienzo en el que se va a dibujar (por ejemplo la pantalla)

Atributos sobre la forma de dibujar en el lienzo (color, trazo, etc)

Podemos crear contextos para diferentes lienzos

Vista en pantalla

Imagen en memoria

Documento PDF

(6)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Contexto de las vistas

Podemos obtener el contexto actualmente activo con:

Sobrescribir método drawRect: de las vistas

Dentro de él el contexto activo representa el área de la vista

Solicitar repintado de la vista cuando actualicemos gráficos

CGContextRef  context  =  UIGraphicsGetCurrentContext();

-­‐  (void)drawRect:(CGRect)rect  {

       CGContextRef  context  =  UIGraphicsGetCurrentContext();          

       //  Dibujar  en  el  contexto

       ... }

(7)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Sistema de coordenadas

Opuesto al sistema de UIKit en la coordenada y

Excepto cuando se crear en el contexto de una vista (UIView)

Podemos cambiar esto aplicando una transformación

CGContextTranslateCTM(context,  0.0,  rect.size.height); CGContextScaleCTM(context,  1.0,  -­‐1.0);

(8)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Puntos vs Pixels

El sistema de coordenadas de CoreGraphics está en puntos

Un iPhone siempre tiene 480 x 320 puntos

Un iPad siempre tiene 1024 x 768 puntos

Factor de escala

Indica la conversión entre puntos y pixels

Factor de escala de la pantalla

Es 1.0 en iPhone 3GS y anteriores y iPad 2 y anteriores

Resolución en puntos y en pixeles coinciden

Es 2.0 en dispositivos con pantalla retina (iPhone 4, ¿iPad 3?)

480 x 320 puntos equivalen a 960 x 640 pixels

(9)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Atributos del pincel

Color de trazo y de relleno

Grosor del trazo

UIColor  *colorRojo  =  [UIColor  redColor]; UIColor  *colorAzul  =  [UIColor  blueColor];          

CGContextSetStrokeColorWithColor(context,  colorAzul.CGColor); CGContextSetFillColorWithColor(context,  colorRojo.CGColor);

(10)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Primitivas geométricas

Rectángulos

Trayectorias

CGRect  rectangulo  =  CGRectMake(60,  40,  200,  400);                           CGContextStrokeRect(context,  rectangulo); CGContextFillRect(context,  rectangulo); CGContextMoveToPoint(context,  10,  10); CGContextAddLineToPoint(context,  20,  30); CGContextAddLineToPoint(context,  30,  35);                           CGContextStrokePath(context); (10,10) (20,30) (30,30)

(11)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Imágenes

Podemos dibujarlas directamente con CoreGraphics

O utilizar la propia clase UIImage

Dibuja la imagen en el contexto actualmente activo

CGRect  area  =  CGRectMake(0,  0,  320,  480);

CGImageRef  imagen  =  [UIImage  imageNamed:  @"imagen.png"].CGImage;  

CGContextDrawImage  (contexto,  area,  imagen);

CGRect  area  =  CGRectMake(0,  0,  320,  480);

UIImage  *imagen  =  [UIImage  imageNamed:  @"imagen.png"];  

(12)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Texto

Establecer fuente y modo de dibujado

Dentro de una vista las coordenadas y están invertidas

El texto aparece al revés

Debemos corregir esto con

Dibujar una cadena con

CGContextSelectFont(context,  "Helvetica-­‐Bold",  12,  kCGEncodingMacRoman); CGContextSetTextDrawingMode(context,  kCGTextFill);

CGAffineTransform  transform  =  CGAffineTransformMakeScale(1,  -­‐1); CGContextSetTextMatrix(context,  transform);

NSString  *cadena  =  @"Texto  de  prueba";          

CGContextShowTextAtPoint(context,  x,  y,  

       [cadena  cStringUsingEncoding:  NSMacOSRomanStringEncoding],          [cadena  length]);

(13)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Métricas del texto

En ocasiones necesitamos saber el tamaño en pixels de una

cadena de texto

Por ejemplo para dibujar un recuadro a su alrededor

Podemos saber dónde se ha terminado de dibujar el texto con:

Podemos también dibujar el texto en modo invisible

CGContextSetTextDrawingMode(context,  kCGTextInvisible); CGContextShowTextAtPoint(context,  0,  0,  

       [cadena  cStringUsingEncoding:  NSMacOSRomanStringEncoding],          [cadena  length]);

CGPoint  ancho  =  CGContextGetTextPosition(context); CGPoint  position  =  CGContextGetTextPosition(context);

(14)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Alternativas para dibujar texto

El método anterior sólo soporta codificación MacOS Roman

Problemas con el símbolo € por ejemplo

No ofrece apenas facilidades para alinear el texto

Es más sencillo dibujar texto directamente con UIString

El método

drawInRect:

pertenece a la categoría

UIStringDrawing

Para tener un mayor control podemos utilizar CoreText

NSString  *cadena  =  @"Texto  de  prueba";

UIFont  *font  =  [UIFont  boldSystemFontOfSize:  12]; CGRect  area  =  CGRectMake(10,  10,  100,  20);

               

[cadena  drawInRect:  area  withFont:font  

                                       lineBreakMode:UILineBreakModeClip                                                  alignment:UITextAlignmentRight];

(15)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Gradientes

La escala de colores del gradiente se mueve de 0 a 1

Podemos definir los colores en determinadas localizaciones

intermedias de dicho rango

El resto de colores se obtendrán por interpolación

size_t  size  =  2;

CGFloat  locations[2]  =  {  0.0,  1.0  };

CGFloat  components[8]  =  {  0.2,  0.2,  0.2,  1.0,      //  Color  inicial  (RGBA)

                                                   0.8,  0.8,  0.8,  1.0  };  //  Color  final      (RGBA)

         

CGColorSpaceRef  space  =  CGColorSpaceCreateDeviceRGB();

CGGradientRef  gradient  =  CGGradientCreateWithColorComponents(space,                                                                                      components,  locations,  size);

(16)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Dibujado del gradiente

Debemos especificar el punto de inicial y final en la pantalla

Todo el contexto se llenará con el degradado especificado en la

dirección desde el punto origen al destino

El punto origen tendrá el color de la localización 0.0, y el destino

tendrá el de la localización 1.0

CGPoint  startPoint  =  CGPointMake(0.0,  0.0); CGPoint  endPoint  =  CGPointMake(0.0,  480.0);  

CGContextDrawLinearGradient(context,  gradient,  

(17)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Capas

Nos permiten crear una composición y repetirla en diferentes

lugares de la pantalla

La composición se guarda sólo una vez en la memoria de vídeo

Creamos un capa y obtenemos un contexto para dibujar en ella

Una vez dibujada la capa, volcamos al contexto principal

CGLayerRef  layer  =  CGLayerCreateWithContext  (context,  

                                                                     CGRectMake(0,  0,  50,  50),  NULL); CGContextRef  layerContext  =  CGLayerGetContext  (layer);

(18)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Contexto de imagen

Nos permite crear imágenes con CoreGraphics

Establecemos contexto de imagen con

Obtenemos contexto actual y dibujamos

Obtenemos la imagen resultante

UIGraphicsBeginImageContextWithOptions(CGSizeMake(320,240),  NO,  1.0);

//  Dibujar  en  el  contexto      

CGContextRef  context  =  UIGraphicsGetCurrentContext(); ...

UIImage  *imagen  =  UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();

(19)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Contexto de PDF

Podemos generar un documento PDF con CoreGraphics

Abrimos contexto para generar un fichero PDF

Comenzamos página y obtenemos su contexto

Podemos repetir esto para cada página del documento

Cerramos el contexto, y el PDF se habrá generado

UIGraphicsBeginPDFContextToFile(@"fichero.pdf",  CGRectZero,  nil);

UIGraphicsBeginPDFPage();          

//  Dibujar  en  el  contexto      

CGContextRef  context  =  UIGraphicsGetCurrentContext(); ...

(20)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

CoreAnimation

Nos permite animar los elementos de la interfaz eficientemente

Su elemento principal es CALayer

No confundir con CGLayer

CGLayer sirve para crear una composición 2D, una vez creada las

capas no se pueden manipular de forma independiente

CALayer define elementos que componen la interfaz y que

podemos mover de forma independiente

Toda vista (UIView) contiene un CALayer

(21)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Gráficos y multimedia © 2011-2012 Depto. Ciencia de la Computación e IA Gráficos y animación en iOS

Propiedades de las capas

Podemos decorarlas con distintos atributos

21

otras. Cuanto mayor sea la coordenada z, más cerca estará la capa del usuario, y tapará a

las capas con valores de z inferiores.

Es especialmente interesante en este caso la propiedad

transform

, ya que nos permite

incluso aplicar transformaciones 3D a las capas. En el caso de las vistas, la propiedad

transform

tomaba un dato de tipo

CGAffineTransform

, con el que se podía especificar

una transformación afín 2D (traslación, rotación, escalado o desencaje), mediante una

matriz de transformación 3x3. En el caso de las capas, la transformación es de tipo

CATransform3D

, que se especifica mediante una matriz de transformación 4x4 que nos

permite realizar transformaciones en 3D. Tendremos una serie de funciones para crear

distintas transformaciones de forma sencilla, como

CATransform3DMakeTranslation

,

CATransform3DMakeRotation

, y

CATransform3DMakeScale

. También podemos aplicar

transformaciones sobre una transformación ya creada, pudiendo así combinarlas y crear

transformaciones complejas, con

CATransform3DTranslate

,

CATransform3DRotate

, y

CATransform3DScale

.

Además de las propiedades anteriores, la capa ofrece una gran cantidad de propiedades

adicionales que nos van a permitir decorarla y tener un gran control sobre la forma en la

que aparece en pantalla. A continuación destacamos algunas de estas propiedades:

Propiedad Descripción

backgroundColor Color de fondo de la capa.

cornerRadius Podemos hacer que las esquinas aparezcan redondeadas con esta propiedad.

shadowOffset, shadowColor, shadowRadius, shadowOpacity

Permiten añadir una sombra a la capa, y controlar las propiedades de dicha sombra

borderWidth, borderColor Establecen el color y el grosor del borde de la capa.

doubleSided Las capas pueden animarse para que den la vuelta. Esta propiedad nos indica si al darle la vuelta la capa debe mostrarse también por la cara de atrás.

contents,

contentsGravity

Nos permite especificar el contenido de la capa como una imagen de tipo CGImageRef. Especificando la gravedad podemos indicar si queremos que la imagen se escale al tamaño de la capa, o que se mantenga su tamaño inicial y se alinee con alguno de los bordes.

Como hemos comentado anteriormente, las capas se organizan de forma jerárquica, al

igual que ocurría con las vistas. Podemos añadir una subcapa con el método

addLayer:

CALayer *nuevaCapa = [CALayer layer;]

[self.view.layer addSublayer: nuevaCapa];

En la sección anterior vimos cómo dibujar en una vista utilizando Core Graphics. Si

(22)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Posicionamiento de capas

En vistas (UIView) tenemos la propiedad

center

Posición del centro de las vistas

En capas (CALayer) tenemos propiedades

position y anchorPoint

anchorPoint indica el punto de la capa

que se utilizará como referencia para

posicionarla. Se mueve en coordenas

relativas a la capa (de 0 a 1). El anchor

point (0.5, 0.5) equivale al centro de la

capa, con este punto se comportaría como

las vistas.

position indica la posición en pantalla del

(23)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Definir nuevas capas

Siempre deben estar contenidas en un UIView

Podemos agregar subcapas a la capa principal

Podemos dibujar en el contexto de dichas capas

Definir delegado para dibujar en la capa

Implementar método que dibuje en ella con CoreGraphics

CALayer  *nuevaCapa  =  [CALayer  layer;]

[self.view.layer  addSublayer:  nuevaCapa];

nuevaCapa.delegate  =  self;

-­‐  (void)drawLayer:(CALayer  *)layer  inContext:(CGContextRef)context  {        //  Codigo  Core  Graphics

       ...   }

(24)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Animación implícita de capas

Podemos animar una capa simplemente cambiando cualquiera

de sus propiedades

La propiedad cambiará gradualmente al nuevo valor

Esto sólo funciona con capas instanciadas por nosotros, no por

las que crea UIView

Para controlar las propiedades de la animación, o animar capas

de vistas, deberemos utilizar animación explícita

(25)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Animación explícita de capas

Podemos definir animaciones básicas con CABasicAnimation

Indicamos la propiedad a animar como cadena KVC

Indicamos el valor inicial y final de la propiedad

Indicamos duración y otras propiedades de la animación

Añadimos la animación a la capa para reproducirla

CABasicAnimation  *theAnimation=

       [CABasicAnimation  animationWithKeyPath:@"position.x"];

theAnimation.fromValue=[NSNumber  numberWithFloat:100.0]; theAnimation.toValue=[NSNumber  numberWithFloat:300.0];

theAnimation.duration=5.0; theAnimation.repeatCount=2; theAnimation.autoreverses=YES;

(26)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Transiciones

Nos permite animar la entrada y salida de capas de la pantalla

Definimos una animación de transición

Aplicamos la animación sobre la capa padre

Al agregar o eliminar hijos de dicha capa padre, entrarán o

saldrán de pantalla con la animación especificada

CATransition  *transition  =  [CATransition  animation]; transition.duration  =  0.5;

 

transition.type  =  kCATransitionMoveIn;

(27)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Animación de vistas

Podemos animar directamente las vistas (UIView) sin tener que

bajar a CoreAnimation

Las animaciones se definen mediante bloques, donde

indicamos el valor final que queremos que tengas las

propiedades

Podemos modificar propiedades de distintas vistas

[UIView  animateWithDuration:0.5                                  animations:^{

                                                               vista1.frame  =  CGRectMake(100,100,50,50);                                                                vista2.frame  =  CGRectMake(200,100,50,50);                                                          }];

(28)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Transiciones de vistas

Nos permite reemplazar una vista por otra mediante una

animación

Debemos especificar la vista que entra y la vista que sale

vistaOrigen será eliminada de su supervista, y en su lugar se

añadirá vistaDestino

Podemos especificar diferente duración y tipos de animación

[UIView  transitionFromView:  vistaOrigen                                        toView:  vistaDestino                                    duration:  0.5

                                     options:  UIViewAnimationOptionTransitionFlipFromLeft                                completion:  nil];

(29)

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Referencias

Documento similar

En otros casos, Pírela (entrevista personal 2007) plantea que estos elementos van acompañados de imágenes con la combinación de gráficos. “La idea de los gráficos es situar

Uno de los primeros temores que hay que vencer para su uso en el aula, y que puede suponer un freno para muchos docentes, es explicar el funcionamiento detallado de esta

Por ejemplo, con este tipo de controles se podrá validar la información introducida por el usuario en un campo, de tal forma que esta se corresponda con un determinado formato

res con equipos audio=visuales y gráficos, o sea hacia el denominado "multimedia", y hacia interconexión de ordenadores entre si mediante redes locales (Novell,

- El proyecto Azahar, desarrollado por el grupo de Autismo y Dificul- tades del Aprendizaje del Instituto de Robótica de la Universidad de Valencia y subvencionado por la

En este proyecto se ha unificado el desarrollo de aplicaciones para dispositivos móviles S40 de Nokia con la tecnología NFC, dando como resultado la aplicación “Smart-Info UPCT”,

Por otro lado, en la actualidad existe la posibilidad de crear aplicaciones software para dispositivos móviles inteligentes que funcionan gracias a sistemas

Cuando haga clic en Diseño y seleccione un tema nuevo, cambiarán las imágenes, gráficos y gráficos SmartArt para que coincidan.. con el