Spanish Scroll automático en scrollview

ivanguerr

Banned
Hola a todos, es mi primer post así que voy de estreno :D

Llevo unos días con mi primer programa y tengo un problemilla con el scroll automático de un scrollview.

En la pantalla tengo un scrollview y dentro una label. Cuando escribo en un EditText y pulso enter simplemente se copia el contenido de texto a la etiqueta. El problema que tengo es que si voy escribiendo líneas llega un momento en que la etiqueta se encuentra llena y no aparecen las últimas líneas añadidas.

He puesto scrollview.fullscroll(true) pero no hay manera.

Cuando fullscroll lo tengo a False, scrollposition siempre tiene el valor de 0 (obviamente)
Cuando fullscroll lo tengo a True, scrollposition comienza en 0, luego pasa a 50 y ya está, por muchas líneas que añada el valor no cambia de 50 (y encima no hace scroll)

Procedimiento que copia la línea a la etiqueta

Sub cargar_frase(strLINEA As String)
'Se muestra la frase
lbl1.Text = lbl1.Text & CRLF & strLINEA
scrollview1.FullScroll(True)
Log("posicion " & scrollview1.ScrollPosition)
End Sub

Si no me funciona el scroll automático, un forma sería ajusta el valor scrollview1.scrollposition... pero no sé cual es el valor de la última posición

Saludos.
 

Serinter

Member
Licensed User
Longtime User
Hola. Este también es mi primer post, así que de primerizo a primerizo (en postear):

A mi me pasaba lo mismo, pero añadí un DoEvents despues de Scrollview1.FullScroll(True) y... magia!. A mi me funciona así... Ya me dirás. Suerte.

Enviado desde mi LG-P970 usando Tapatalk 2

Enviado desde mi LG-P970 usando Tapatalk 2
 

jota

Active Member
Licensed User
Longtime User
Te he montado un ejemplo a ver si te ayuda. Saludos

Sub Activity_Create(FirstTime As Boolean)
Dim SV As ScrollView
Dim lbl As Label
Dim bucle As Int
Dim altoLbl As Float

lbl.Initialize("")
SV.Initialize(1000)

Activity.AddView(SV,0,0,100%x,50%y)
SV.Panel.AddView(lbl,0,0,100%x,50%y)

lbl.Typeface = Typeface.DEFAULT
lbl.TextSize = 20dip

lbl.Text = "INICIO LABEL"
For bucle = 0 To 100 'Puedes cambiar el numero de lineas sin problemas
lbl.Text = lbl.Text & CRLF & "ini XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX fin"
Next
lbl.Text = lbl.Text & CRLF & "FIN LABEL"


'Calcula el tamaño con la libreria StringUtils
'http://www.b4x.com/forum/additional-libraries-classes-official-updates/9721-stringutils-v1-02-support-measuring-required-height-multiline-labels.html#post53869
Dim su As StringUtils
altoLbl = su.MeasureMultilineTextHeight(lbl,lbl.Text)


'Importante cambiar el alto de la etiqueta y el panel de scroll view
lbl.Height = altoLbl
SV.Panel.Height = lbl.Height

'Ejemplo para ver el uso de scrollPosition
SV.ScrollPosition = 0
Dim a,b,c As Int
a = 0
b = SV.Panel.Height
c = 1
Do While c<10
For bucle = a To b Step c
SV.ScrollPosition = bucle
SV.Invalidate
DoEvents 'Provoca una pausa
Next

If c = 1 Then
a = SV.Panel.Height
b = 0
c=-1
Else
a= 0
b = SV.Panel.Height
c= 1
End If
Loop
End Sub
 

vampirbcn

Active Member
Licensed User
Longtime User
Otra ayuda

Si lo he entendio y te sirve de ayuda he tocado un poco tu código:
JOTA ya te ha explicado todo y más sobre el tema, pero como ya lo tenia hecho, pues aquí lo tienes por si te sirve.

Sub cargar_frase(strLINEA As String)
'Se muestra la frase
Dim su As StringUtils ' para poder tomar la medida
Dim lbl1 As Label ' Creo el label al vuelo
Dim lblh As Int ' para guardar el alto del label
lbl1.Initialize("") ' inicializo el label
lbl1.Text = strLINEA ' cargo el texto en el label
lbl1.TextSize = 20 ' solo define un tamaño grande de texto para pruebas
ScrollView1.FullScroll(True)
ScrollView1.Panel.AddView(lbl1,0,0,ScrollView1.Width,1) ' añado el label al panel del scrollview1
lblh = su.MeasureMultilineTextHeight(lbl1, lbl1.Text) ' tomo la medida del label
lbl1.Height=lblh ' modifico el tamaño del label
ScrollView1.Panel.Height=lbl1.Height+10 ' modifico el tamaño del panel interno del scrollview (IMPORTANTE EL PANEL)
Log("posicion " & ScrollView1.ScrollPosition)
End Sub

Saludos
 
Last edited:

ivanguerr

Banned
Gracias por las respuestas tan extensas, revisando el código y comparándolo con el que habéis puesto he visto que se me había olvidado redimensionar el panel.

A continuar con el aprendizaje
 
Top