CoverFlow en MonoTouch
Un cover flow es un software de
interfaz gráfica en tres dimensiones integrado en iTunes,
Mac OS X, y otros
productos Apple
Inc. Para mover de un tirón a través de imágenes visuales de
los documentos, favoritos web, álbumes o fotografías.(Wikipedia,
http://es.wikipedia.org/wiki/Cover_Flow).
Es un control muy atractivo a la vista
como a la vez util, por lo que tener uno de esos controles en nuestra
aplicacion, le sumaria puntos a favor. Desafortunadamente el control
usado en las aplicaciones de Apple, no esta disponible para ser usado
por terceros, por lo cual vamos a utilizar un control llamado
OpenFlow (https://github.com/thefaj/OpenFlow) que tiene muchas de las
caracteristicas del control de Apple, pero no todas.
Para poder usar el control en
MonoTouch, usaremos un Binding hecho por Miguel de Icaza llamado
OpenFlowSharp (https://github.com/migueldeicaza/OpenFlowSharp).
Nuestro primer paso es obtener la dll
de OpenFlowSharp que la pueden obtener aqui o crearla desde el codigo
fuente.
Nuesro siguiente paso es agregar a
nuestro proyecto la dll como se muestra en la siguiente imagen:
Despues nos dirigiremos al controlador
que deseamos que despliegue el Cover Flow y agregaremos los
siguientes metodos:
private
OpenFlowSharp.OpenFlowView openFlow;
private
AutoResetEvent signal = new
AutoResetEvent (false);
private Queue tasks = new Queue ();
#region
IOpenFlowDataSource Implementation
public
void
RequestImage (OpenFlowView view, int
index)
{
NSAction
task;
task
= delegate
{
var
img = UIImage.FromFile ("images/"
+ index + ".png");
InvokeOnMainThread
(delegate
{
openFlow
[index] = img;
}
);
}
;
lock
(tasks) {
tasks.Enqueue
(task);
}
signal.Set
();
}
public
UIImage GetDefaultImage ()
{
return
UIImage.FromFile ("images/not_available.png");
}
#endregion
Nuestro siguiente paso sera que el
controlador implemente la interfaz IopenFlowDataSource:
public
partial
class
OpenFlowExampleViewController : UIViewController, IOpenFlowDataSource
Luego agregaremos un par de metodos
mas, que nos ayudaran a completar la tarea de cargado de las
imagenes:
#region
Helpers
private
void
LoadAllImages ()
{
//
Load images all at once
for
(int
i = 0; i < 5; i++) {
var
img = UIImage.FromFile ("images/"
+ i + ".png");
openFlow
[i] = img;
}
openFlow.NumberOfImages
= 5;
}
//Async
private
void
Worker ()
{
//
Create the NSAutoreleasePool so that any NSObjects that
//
the ObjC runtime creates are disposed using it, otherwise
//
ObjC just leaks them.
using
(var
releasePool = new
NSAutoreleasePool ()) {
while
(signal.WaitOne ()) {
while
(true)
{
NSAction
task;
lock
(tasks) {
if
(tasks.Count > 0)
task
= tasks.Dequeue ();
else
break;
}
task
();
}
}
}
}
#endregion
Como penultimo paso agregaremos las
siguientes lineas de codigo al contructor de la clase controladora:
openFlow
= new
OpenFlowView (UIScreen.MainScreen.Bounds, this);
this.View
= openFlow;
LoadAllImages
();
Thread
t = new
Thread (Worker);
t.Start
();
signal.Set
();
Y como nuestro ultimo paso agregaremos
imagenes en la carpeta “Images” que debemos de crearla
previamente. Ahora si lanzamos la aplicacion veremos algo asi:
Como aclaracion, les indico que el
cargado de las imagenes se lo hace de forma asincronica, muy util
cuando las imagenes son obtenidas desde internet, pero si deseamos
hacer la carga de manera sincrona simplemente deberemos de comentar
las siguientes lineas de codigo:
//Thread
t = new Thread (Worker);
//t.Start
();
//signal.Set
();
Suerte.
Source: Aquí.
PD. Las imagenes que se encuentran en
el codigo fuente estan ubicadas aqui:
http://www.supercars.net/gallery/132868/861/2.html
Comentarios
Publicar un comentario