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 :)

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top