Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Noviembre 23, 2011, 11:00:17 pm
-
Esta inquietud la tiene (tuvo en el futuro) mi amigo eligioalmuedo y la verdad yo tambien tengo la misma inquietud y por ello y con su permiso republico su post aquí:
"Buenas. ¿Alguien ha intentado emular el deslizamiento que se hacen ahora en casi todos los dispositivos moviles?. Me refiero concretamente al arrastre que se hace en los listados y que crea un efecto similar a arrastre real de una lista sobre rodamientos. (Espero sepais de que os hablo)
¿Que algoritmo se usa para el calculo de la posicion, velocidad y frenado?"
-
HOLA!!!
Te puedo ayudar, en el MouseDown se guarda Top y Timer o GetTickCount como prefieras.
Luego en MouseUp Se Guarda NewTop y Timer o GetTickCount como prefieras.
Luego se toma el intervalo de tiempo y el segmento de altura.
Se divide para que de DeltaTop/DecimaDeSegundo.
(delta = modificacion)
Se hace un bucle que scrollea al principio en la velocidad y luego se le resta una constante por cada giro(vuelta del bucle) a la velocidad (DeltaTop +/- const) / DecimaDeSegundo. Hasta que llegue a 0 DeltaTop.
Nota si delta Top es negativo habra que sumar en vez de restar la constante.
GRACIAS POR LEER!!!
-
Mira, si lo que buscas es que se pueda hacer tipo como si pasaras el dedo hacia arriba, con el mouse es incomodo x'D
Puedes buscar "smooth scroll" o deslizamiento suave (firefox y chrome lo tienen integrado, aunque lo tenian desactivado por defecto, opera lo tenia activado)
Si ves el código fuente de jQuery (o tambien scrip.taculo.us) tiene funciones que son para "deslizar" la pantalla, podrías darle un vistazo y traspasar ese código :P
-
HOLA!!!
Te puedo ayudar, en el MouseDown se guarda Top y Timer o GetTickCount como prefieras.
Luego en MouseUp Se Guarda NewTop y Timer o GetTickCount como prefieras.
Luego se toma el intervalo de tiempo y el segmento de altura.
Se divide para que de DeltaTop/DecimaDeSegundo.
(delta = modificacion)
Se hace un bucle que scrollea al principio en la velocidad y luego se le resta una constante por cada giro(vuelta del bucle) a la velocidad (DeltaTop +/- const) / DecimaDeSegundo. Hasta que llegue a 0 DeltaTop.
Nota si delta Top es negativo habra que sumar en vez de restar la constante.
GRACIAS POR LEER!!!
Gracias por el apunte, pero no es lo que busco, ya que ese calculo genera una delta constante, que produce una deceleracion constante hasta llegar a cero, no produciendose el efecto de frenado del que hablo, si no de uno contante y "lineal". Hablando matematicamente la deceleracion es parabolica y no lineal. Hay reside su complejidad. Pero vuelvo a repetirte que gracias.
Juntando Mensajes
He activado el deslizamiento suave y desactivado el automatico (esta en el apartado "avanzado"), pero no veo que produzca cambios ningunos en el deslizamiento. Igual solo sirve en pantallas tactiles. No se.....
En cuanto al codigo jQuery lo buscare y lo mirare a ver que hay. Muchas gracias.
-
HOLA!!!
El calculo no genera un Delta Top Constante, lo que hace es hacer un deltaTop = X y lo divide por decima de segundo para obtener asi la aceleracion inicial...
En cuanto a la desaceleracion, la desaceleracion es constante siempre y cuando el rozamiento no cambie, por ende es constante. Si vos lo que queres hacer es que cuanto mas lento vaya mas desacelere, que no seria adecuado a la fisica, le restas una variable a la velocidad, quedando la formula final asi:
(DeltaTop +/- (const+DeltaTopINI - (DeltaTopINI - DeltaTop)) / DecimaDeSegundo
Con la anterior formula logras el efecto que deseas.
GRACIAS POR LEER!!!
-
en firefox, apreta la rueda del mouse y te aparece la flecha, move el mouse arriba y abajo eso queres ?
-
Capas que el quiere algo como esto :P
[youtube]http://www.youtube.com/watch?v=wDkdE-qUBP0[/youtube]
-
No Sebas, y un saludo. Lo de Firefox es un scroll suave en funcion a lo separado que dejas el mouse de la doble-flecha que generas al usar el boton central. No es eso de lo que hablo. Lo que trato de emular es el deslizamiento de listados que se hace tactilmente en los moviles de ultima generacion (Android, IOs, etc). Cuando tienes un listado de contactos por ejemplo y pulsas con el dedo el listado y lo "lanzas" hacia abajo, se produce un scroll muy real con desaceleracion. Eso es lo que trato de llevar a codigo, que como bien dice Raul338, esto usado con el mouse es incomo y poco practico, mas aun existiendo la rueda del scroll en los mouse. Pero esto seria para aplicarlo en dispositivos con pantalla tactil, en los cuales lo que prima es la rapidez.
No estoy trabajando en un software tipo restauracion, pero el otro dia desayunando en un bar, cuando me fije en el camarero que estaba en la caja registradora elaborando un arqueo, me sorprendio que para moverse por el listado de movimientos de la caja, pulsaba la pantalla con el dedo un segundo o dos, y salia una barra de deslizamiento con unas dimensiones enormes pero comodas para que fuera pulsada por el dedo. Una vez pulsado con el dedo en esta barra de deslizamiento tipo Vscroll de VB, subia y bajaba el dedo para moverse por el listado, que a poco que fuese muy extenso, le da poca presicion. Fue cuando me pregunté porque un software dedicado a la restauracion y con pantalla tactil, no tenia esta implementacion tan util que vemos a diario en los moviles.
He tomado a la ligera la ecuacion de 79137913, y creo que es lo que busco. Una vez calculada la aceleracion inicial, solo tengo que calcular que contante de rozamiento "k" quiero aplicar para dar el efecto de frenado suave que busco. En cuanto tenga algo en codigo lo posteo para que podamos probarlo y mejorarlo, y si luego algun gurú de este foro es capaz de crear un dll o ocx o control de usuario para poder implementarlo sobre objetos pues mejor.
A todos gracias.
-
Raul338, esto usado con el mouse es incomo y poco practico, mas aun existiendo la rueda del scroll en los mouse. Pero esto seria para aplicarlo en dispositivos con pantalla tactil, en los cuales lo que prima es la rapidez.
Exacto, yo sabia que era para algo tactil :P Aun asi, estaria bueno crear un framework (un conjunto de clases) para que podamos hacer aplicaciones tactiles. Tal vez con la API de Windows 8/7 se pueda hacer :)
-
Bueno. Tengo algo hecho muy por encima, pero para ver el efecto es mas que sobrado. Solo hay que picar en el command1 y lanzarlo a derecha o izquierda. Si el lanzamiento es debil podeis ver el efecto de frenado. A ver como lo veis.
File name: Deslizador.rar File size: 1.73 KB (http://www.fileserve.com/file/YV9cA56/Deslizador.rar)
-
En codeproject encontre esto:
Implementing a smoothly animated ListBox
http://www.codeproject.com/KB/list/SmoothListBox.aspx (http://www.codeproject.com/KB/list/SmoothListBox.aspx)
¿Y viste el ListBoxEx de Leandro?, el implementa un scroll con aceleracion
http://leandroascierto.com/blog/listboxex/ (http://leandroascierto.com/blog/listboxex/)
A este control se le puede agregar un freno al scroll, solo hay que cambiar el PicScroll_MouseMove
me quedo algo trucha la implementacion, pero se puede mejorar ;D
Private Sub PicScroll_MouseMove(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim PT As POINTAPI
Dim ScrollVelociti As Long
Static IsIn As Boolean
If Not IsIn Then
IsIn = True
DrawArrow index, True
Select Case mCount
Case Is < 20
ScrollVelociti = 300
Case Is < 40
ScrollVelociti = 250
Case Is < 100
ScrollVelociti = 100
Case Else
ScrollVelociti = 50
End Select
GetCursorPos PT
Do While WindowFromPoint(PT.X, PT.Y) = PicScroll(index).hWnd
DoEvents
Sleep ScrollVelociti
If ScrollVelociti > 1 Then ScrollVelociti = ScrollVelociti - 1
If index = 0 Then
mScrollPos = mScrollPos - 1
Else
mScrollPos = mScrollPos + 1
End If
Me.Refresh
GetCursorPos PT
Loop
DrawArrow index
IsIn = False
BrakeScroll index '<--- aqui freno del scroll
End If
End Sub
Private Sub BrakeScroll(index As Integer)
Dim ScrollVelociti As Long
ScrollVelociti = 1
Do While ScrollVelociti < 100
DoEvents
Sleep ScrollVelociti
ScrollVelociti = ScrollVelociti + 4
Debug.Print ScrollVelociti
If index = 0 Then
mScrollPos = mScrollPos - 1
Else
mScrollPos = mScrollPos + 1
End If
Me.Refresh
Loop
End Sub
-
HOLA!!!
Me baje el proyecto que hiciste, te salio genial!!!
Me encanto el efecto, FELICITACIONES!
GRACIAS POR LEER!!!
-
Muchas gracias compañero
-
No lo puedo bajar, ... se me ve mal la pagina.. alguien lo podria subir a otro servidor? Gracias :D
-
HOLA!!!
http://www.mediafire.com/?i4c7ng3c13o1892
GRACIAS POR LEER!!!
-
Con el mouse se podría aplicar el algoritmo solo a la rueda de scroll? Al girar mas fuerte que la lista corra mas y vaya frenando. :(
-
Seria bastante distinto a como lo he diseñado. Yo lo que he hecho es con los timers, es ir memorizando con una cadencia rapida (5 ms) es la posicion del mouse de tal manera que una vez que se suelta el boton del mouse, hace el calculo de la velocidad de salida en funcion a la distancia entre la posicion memorizada y la posicion cuando sueltas el boton. Por eso a mayor distancia mayor velocidad. El resto es aplicar la velocidad con un frenado suave hasta llegar a cero.
Hacer lo que pides seria interceptando los tikcs del scrollmouse, y guardando la diferencia de tiempos entre ticks, lo cual nos proporciona una medida de tiempo que supongo que tambien se puede aplicar al calculo de la velocidad de inicio.
Vere si puedo hecharle un vistazo (cuando tenga un buen hueco) y lo vemos para aplicarlo tal como dices al scroll. Un saludo.
-
hola, podrian volver a subir el ejemplo porfavor gracias.