En este tutorial, tomamos el grabado mecánico Etch Etch un boceto como inspiración e intento de implementar estas características para dispositivos modernos, con tecnologías web. Utilizando el lienzo (con nombre aptamente), primero nos centramos en las tabletas, que son similares en forma del juguete auténtico. Podemos aprovechar los eventos táctiles para controlar los diales y los eventos de movimiento de dispositivos para borrar el contenido. Sin dejar los teléfonos, también exploraremos cómo usar WebSockets para mejorar las posibilidades dividiendo los controles y el área de dibujo.
Este tutorial usará nodo.js. Antes de empezar, vamos a Filesilo , seleccione cosas gratis y contenido gratuito junto al tutorial, aquí puede descargar los activos que necesita para el tutorial. Luego ejecute los comandos a continuación, lo que instalará las dependencias y se iniciará el servidor. Estamos usando un nodo para crear un localhost , y también nos servirá más tarde para websockets.
INSTALACIÓN DE NPM
servidor de nodos / index.js
En main.js , la dibujar() La función será el punto central de nuestra aplicación. Usamos lienzo para dibujar una línea entre dos puntos; El origen (X1, Y1), que es donde dejamos el último dibujo, y el destino (X2, Y2), el nuevo punto que queremos alcanzar. Ahora necesitamos desencadenar esta función para observar cualquier forma de dibujo.
DIBUJO DE FUNCIONES (X1, Y1, X2, Y2) {
// el contexto se establece globalmente en init ()
contexto.beginpath ();
contexto.moveto (x1, y1);
contexto.lineto (x2, y2);
contexto.stroce ();
}
Antes de implementar diales, agreguemos rápidamente un oyente de teclado que pueda activar nuestra función de sorteo. Ya has sido proporcionado con los diferentes códigos clave en el ejemplo, pero necesitará enmendar ligeramente al oyente para activar el dibujar() Función definimos anteriormente. Ahora refresque su navegador y vea lo que puede dibujar con las teclas de flecha.
Document.AddeventListener ('KeyDown', Function (E) {
/ * El interruptor de código de teclado va aquí * /
Dibujar (matemáticas.floor (Prev_horizontal), matemáticas. Floor (Prev_vertical), Matemáticas. Flor (Horizontal), Matemáticas. Plaor (vertical));
previewvertical = vertical;
Prev_horizontal = horizontal;
});
Es posible que haya notado que nuestro elemento de lienzo aún no tiene un tamaño asignado. Para nuestro tablero de dibujo, querremos un espacio más grande, tal vez incluso toda la ventana. El código a continuación se encarga del evento de cambio de tamaño, pero no olvides llamar ajustado () en en eso() también.
Función AjusteFrame () {
// el lienzo se define globalmente en init ()
lienzo.width = ventana.innerwidth;
lienzo.height = ventana.innerheight;
}
ventana.addeventlistener ('tamaño de tamaño', ajustado);
Queremos que la aplicación se vea como el juguete original tanto como sea posible, por lo que queremos agregar un marco alrededor del área de dibujo. Para hacerlo, podemos definir un valor de margen y enmendar el CSS para #bosquejo al margen: 20px Auto; Para centrar el lienzo horizontalmente y mantener un espacio más grande en la parte inferior para los diales.
var framemergingerical = 122;
var framemarginhorizontal = 62;
Función AjustFrame () {
lienzo.width = window.innerwidth - FrameMarginhorizontal;
Canvas.Height = Window.Innerheight - FrameMarginTertical;
}
Ya te hemos dado el CSS para los diales en Public / CSS / Styles.css , así que siéntete libre de echar un vistazo. A continuación, agregue dos & lt; div & gt; Etiquetas bajo el & lt; lienzo & gt; en el archivo HTML, como se describe a continuación. Como convención, usaremos la esfera izquierda para el dibujo horizontal, y la derecha para vertical. También estamos agregando nuevas variables a la en eso() Función para prepararse para eventos táctiles.
& lt; div id = "dialhorizontal" class = "dial" & gt; & lt; / div & gt;
& lt; div id = "dialvertical" class = "dial" & gt; & lt; / div & gt;
var targetleft = document.getelementbyid ('dialhorizontal');
var regionleft = nuevo zingtouch.region (Targetleft);
var tardiTright = document.getelementbyid ('dialvertical');
var regionright = nuevo zingtouch.region (Diario);
ZingTouch es una biblioteca de JavaScript capaz de detectar varios gestos táctiles, y también manejará los eventos del mouse. Se proporciona para ti en el / Público / lib / Carpeta, como lo usamos para controlar nuestros diales. A continuación se muestra la implementación para el control izquierdo; Tendrá que replicarlo y modificarlo por el otro lado.
regionleft.bind (Targetleft, 'rotate', función (e) {
if (e.detail.distancefromlast & lt; 0) {
--horizontal;
} demás {
++ horizontal;
}
anglehorizontal + = e.detail.distancefromlast;
targetleft.style.transform = 'rotate (' + anglehorizontal + 'deg)';
Dibujar (matemáticas.floor (Prev_horizontal), matemáticas.floor (Prev_vertical), matemáticas. Floor (horizontal), matemath.floor (Prev_vertical));
Prev_horizontal = horizontal;
});
Para bloquear las líneas saliendo fuera de la pantalla, usamos el poder dibujar() Función, que devuelve un booleano. Lo pasamos por la dirección, ya sea 'horizontal' o 'vertical', y el valor de la variable horizontal o vertical. Llamamos a esta función en el oyente 'Rotate' de ambos diales, y solo si 'verdadero', incrementamos el ángulo y llamamos al dibujar() función.
Función Candraw (dirección, valor) {
var max = (dirección === 'horizontal')? (Canvas.width) :( Canvas.height);
if (valor & lt; 2 || valor & gt; max - 2) {
falso retorno;
}
devuelve verdadero;
}
Con los límites que acabamos de implementar, existe la posibilidad de que el dial pueda quedarse atascado en un extremo si el valor pasa por encima del límite, incluso por un punto decimal. Para evitar esta situación, deberíamos manejar el caso donde poder dibujar() es falso y restablece el valor a uno previamente válido, como se muestra aquí para el controlador horizontal:
if (Candraw ('horizontal', horizontal)) {
anglehorizontal + = e.detail.distancefromlast;
targetleft.style.transform = 'rotate (' + anglehorizontal + 'deg)';
Dibujar (matemáticas.floor (Prev_horizontal), matemáticas.floor (Prev_vertical), matemáticas. Floor (horizontal), matemath.floor (Prev_vertical));
Prev_horizontal = horizontal;
} demás {
horizontal = prevance_horizontal;
}
Siempre se recomienda probar sus dispositivos específicos lo antes posible. Nuestra aplicación está ahora en buena forma, y puede responder a los eventos táctiles. Siga los pasos para acceder a LocalHost de forma remota para obtener el tablero de dibujo en su tableta.
A continuación, utilizaremos Safari y el menú Desarrollar para inspeccionar la aplicación en un iPad. Para dispositivos Android, use Chrome: // inspeccionar .
Conecte su tableta a su computadora a través de USB e inspeccione la aplicación utilizando las herramientas del desarrollador.
Con el código a continuación en su lugar, debe poder ver los diversos valores de aceleración, a medida que mueve su dispositivo alrededor. Para restablecer el lienzo, hemos decidido considerar una aceleración en el eje X más de 5, y disminuirá lentamente la opacidad ( borrarse ).
var borrado = 1; / * Definir como una variable global * /
ventana.addeventlistener ('devicemotion', función (evento) {
console.log ('aceleración ::', evento.aceleración);
if (event.acceleration.x & gt; 5) {
borrado - = math.abs (event.acceleration.x / 100);
console.log ('borrar ::', borrado);
}
});
Hemos visto en el paso anterior cómo verificar el movimiento y la aceleración. Ahora necesitamos llamar Fadedrawing () cuando se cumple nuestra condición. En este caso, redibujamos una copia exacta del lienzo en una opacidad diferente.
Restablecer el globalalpha a 1 en dibujar() y establecer el globalcompositeopeo De vuelta a la fuente.
Función Fadedrawing () {
Si (ERASERADO & LT; 0) {
contexto.clearrect (0, 0, lienzo.width, lienzo.height);
borrado = 1;
regreso;
}
contexto.globalalpha = borrado;
contexto.globalCompositeOoperation = 'Copy';
context.drawimage (lienzo, 0, 0);
}
Hasta ahora, nuestra aplicación se ve bastante insípida y plana. Para darle algo de profundidad, agregaremos un color de marco, una sombra dentro del marco y un poco de volumen en los diales. La CSS para las sombras de marcación ya está proporcionada, pero deberá agregar esos dos elementos al final del cuerpo.
Complete el CSS para los elementos sugeridos aquí:
& lt; div id = "dialshadowhorizontal" class = "shadow" & gt; & lt; / div & gt;
& lt; div id = "dialshadowvertical" class = "shadow" & gt; / div & gt;
Cuerpo {
Fondo: # 09cbf7;
}
#sketch {
Box-Shadow: 2px 2px 10px RGBA (0, 0, 0, .25) INSET;
}
Al comienzo de este tutorial, mencionamos brevemente utilizando WebSockets a través de nuestro servidor de nodos. Ahora que tiene un almohadilla de dibujo independiente para la tableta, lo veremos, lo que también está disponible para su teléfono. Sin embargo, los teléfonos pueden ser demasiado pequeños para mostrar tanto la pantalla como las controles. Por lo tanto, estamos usando sockets para comunicarse entre el teléfono y la pantalla de la computadora.
En el archivo HTML principal, reemplace main.js con extra.js . Este último contiene todo lo que hemos hecho hasta ahora, con modificaciones para manejar dispositivos y enchufes, que inspeccionaremos en los siguientes pasos. Mira esto Detectdevice () - Este método ahora se llama carga en lugar de en eso() y decidirá qué 'modo' manejar para la aplicación.
A continuación se muestra el caso particular de un teléfono detectado:
if (window.innerwidth & lt; 768) {
Socket = io.connect ();
document.queryselector ('# sketch'). Retirar ();
var dials = document.queryselectorall ('. dial, .shadow');
[] .poreach.call (diales, función (artículo) {
item.classlist.add ('Big');
});
isControls = verdadero;
Framargingerical = 62;
socket.emit ('listo', {'listo': 'controles'});
}
A lo largo de extra.js Notará bits de código como socket.emit () o socket.on () . Estos son los emisores y oyentes para nuestras instancias de controles (teléfono) y pantalla (computadora). Cada evento emitido debe pasar por el servidor a re-distribuirse a todos los sockets conectados. En servidor \ index.js Agregue unos cuantos oyentes más en la función 'Conexión' y reinicie el servidor de nodos.
Socket.on ('DIBUJO', FUNCION (DATOS) {
io.sockets.mit ('dibujo', datos);
});
socket.on ('borrar', función (datos) {
io.sockets.mit ('borrar', datos);
});
socket.on ('ajustframe', función (datos) {
Screenwidth = Data.Screenwidth;
SANEYHEIGHT = DATA.SCREENHEIGHT;
io.sockets.mit ('ajustframe', datos);
});
Visite el LocalHost en su computadora, mientras accede a él de forma remota con su teléfono (como lo hizo anteriormente desde su tableta). Ahora debería ver que se dibuja una línea en su pantalla mientras gira los diales en su teléfono. Sin embargo, notará que los diales no se ajusten correctamente si el teléfono está en modo vertical.
Podemos arreglar esto con algunos CSS:
Pantalla @Media y (Orientación: retrato) {
.dial.big # dialvertical, .shadow.big # dialshadowvertical {
derecha: calc (50% - 75px);
fondo: 20px;
TOP: AUTO;
}
.dial.big # dialhorizontal, .shadow.big # dialshadowhorizontal {
izquierda: calc (50% - 75px);
TOP: 20px;
}
}
Volvamos a nuestra versión de tablet. Lamentablemente, la API de vibración no está disponible en iOS, por lo que no podemos implementar comentarios hápticos cuando se giran los diales. Sin embargo, en el juguete original, podría dejar marcas temporales de huellas dactilares en la pantalla si lo empujas. Podemos agregar un evento táctil en el dispositivo para replicar esta función.
Establecer estos oyentes en en eso() y explore las funciones que llaman:
if (Type === 'all') {
lienzo.addeventlistener ('touchstart', función (e) {
e.preventdefault ();
Drawfingerprint (E.Layerx, E.Layery, VERDADERO);
});
lienzo.addeventlistener ('touchend', función (e) {
hidefingerprint (e.layerx, e.layery);
});
}
En el Drawfingerprint () MÉTODO, ANTES DE QUE HACEMOS CUALQUIER MÁS DE CUALQUIER COPIA DEL ESTADO ACTUAL DEL CANO DE LONES A UN ELEMENTO OCULTADO QUE UTILIZAMOS PARA RESTRAR NUESTRO DIBUJO CON LAS PROPORCIONES DE LA IMPRESIÓN. Eso solo sucede al primer toque, y no en las llamadas posteriores que aumentan el tamaño de la impresión cada 100 ms.
Función Drawfingerprint (XPOS, YPOS, SAVECANVAS) {
/ * Función parcial, consulte Extra.js * /
if (savecanvas) {
hiddencanvas = document.createelement ('lienzo');
var hiddencontext = hiddencanvas.getcontext ('2D');
hiddencanvas.width = lienzo.width;
hiddencanvas.height = lienzo.height;
hiddencontext.drawimage (lienzo, 0, 0);
}
}
Ahora podría hacer que la aplicación esté realmente independiente al guardarla en su tableta como una aplicación de pantalla de inicio. No podremos hacer lo mismo por el teléfono, ya que requiere conexión al servidor. En /público , localiza el archivo nombrado Sketch.appcache y reemplace todas las instancias de 'localhost' por su dirección IP.
Ahora, enmendar el HTML para leer de la siguiente manera:
& lt; html lang = "en" manifiest = "Sketch.appcache" & gt;
Ahora visite la solicitud nuevamente en su tableta y seleccione la opción Añadir a la pantalla de inicio. Un nuevo icono debe aparecer en su escritorio. Abríelo una vez mientras aún está conectado a su localhost de forma remota. El manifiesto de caché que establecimos anteriormente descargará todos los archivos necesarios para uso fuera de línea en el fondo. Apague el wi-Fi y abra la aplicación de nuevo. ¡Voilà!
Este artículo apareció originalmente en Revista Web Designer Número 263. Comprarlo aquí .
Leer más:
[dieciséis] Hay tanto que se pueden lograr de forma nativa en el navegador utilizando CSS3 o API de animaciones web, en JavaScript. La..
[dieciséis] En este tutorial, lo llevaremos a través del proceso de hacer que su aplicación sea accesible y fácil de usar para las ..
[dieciséis] Gouache es más indulgente que la pintura de acuarela, pero las decisiones que hagas temprano todavía pueden afectar el r..
[dieciséis] Página 1 de 2: Diferentes tipos de pruebas frontend (y cuándo usarlas) Dife..
[dieciséis] El html & lt; lienzo & gt; Elemento es una solución poderosa para crear gráficos basados en píxeles en la..
[dieciséis] Ese efecto del portal en Dr Strange fue muy especial. Fue prácticamente el único efecto en la película que no se inclin..
[dieciséis] Cuando se le pidió que hiciera un taller sobre la creación de un entorno de fantasía, pensé que sería divertido pagar..
[dieciséis] Este año pasado ha sido un cambiador de juegos para la industria de los videojuegos y para los artistas de los EE. UU. Lo..