Symbian S60 - Desplazamiento de texto en un CEikLabel
Pregunta
Tengo una sola línea CEikLabel en mi aplicación que necesita desplazar texto.
La solución simple que viene a la mente (pero posiblemente ingenua) sería algo así como ...
[begin pseduo code]
on timer.fire {
set slightly shifted text in label
redraw label
}
start timer
[end pseudo code]
Usando una clase CPeriodic como temporizador y label.DrawDeferred () en cada actualización.
¿Cree que esta es la mejor manera, puede ser bastante ineficaz volver a dibujar la etiqueta dos o tres veces por segundo ... pero hay alguna otra manera?
Gracias :)
Solución
He visto la solución basada en temporizador utilizada para desplazar nombres de elementos en cuadros de lista.
Un par de cosas a tener en cuenta es que podría parpadear un poco mientras se desplaza y que debe asegurarse de que el texto que pone en la etiqueta no sea demasiado largo, de lo contrario, recortará automáticamente la cadena y agregará un elipsis (...)
Use TextUtils :: ClipToFit
para obtener una cadena que se ajuste a la etiqueta y elimine los puntos suspensivos que agrega antes de colocar el texto en la etiqueta (busque KTextUtilClipEndChar
en su cadena recortada). Tendrá que calcular cuántos caracteres omitir al comienzo de la cadena antes de pasarla a la función de recorte.
Otros consejos
No sé si hay otra forma de hacerlo y no puedo decir si el enfoque que tiene en mente será ineficiente. Sin embargo, es posible que desee echar un vistazo a este hilo que analiza casi la misma pregunta que la tuya y también menciona brevemente la misma solución que la que has concebido.
Lo he hecho así
TTimeIntervalMicroSeconds32 scrolltime(70000);
iPeriodicScroll = CPeriodic::NewL(CActive::EPriorityIdle);
iPeriodicScroll->Start(scrolltime, scrolltime, TCallBack(CVisTagContainerView::ScrollTextL, this));
y luego en la función repetida
CEikLabel *label = iContainer->Label();
const TDesC16 *temp = label->Text();
if (temp->Length() <= 0) {
if (iTextState != ETextIdle) { return; }
DownloadMoreTextL();
return;
}
TPtrC16 right = temp->Right(temp->Length()-1);
label->SetTextL(right);
label->DrawDeferred();
Entonces el texto se mueve de derecha a izquierda, y cuando todo desaparece, DownloadMoreTextL vuelve a llenar la etiqueta