Symbian S60 - Scorrimento del testo in un CEikLabel
Domanda
Nella mia applicazione ho una sola riga CEikLabel che deve scorrere il testo.
La semplice soluzione che viene in mente (ma forse ingenua) sarebbe qualcosa come ..
[begin pseduo code]
on timer.fire {
set slightly shifted text in label
redraw label
}
start timer
[end pseudo code]
Utilizzo di una classe CPeriodic come timer ed etichetta.DrawDeferred () su ogni aggiornamento.
Pensi che sia il modo migliore, potrebbe essere piuttosto inefficiente ridisegnare l'etichetta due o tre volte al secondo .. ma c'è un altro modo?
Grazie :)
Soluzione
Ho visto la soluzione basata sul timer utilizzata per scorrere i nomi degli elementi nelle caselle di riepilogo.
Un paio di cose a cui fare attenzione sono che potrebbe sfarfallare un po 'durante lo scorrimento e che devi assicurarti che il testo che inserisci sull'etichetta non sia troppo lungo, altrimenti taglierà automaticamente la stringa e aggiungerà un puntino di sospensione (...)
Usa TextUtils :: ClipToFit
per ottenere una stringa che si adatta all'etichetta e rimuovere i puntini di sospensione che aggiunge prima di mettere il testo sull'etichetta (cerca KTextUtilClipEndChar
nel tuo stringa ritagliata). Dovrai capire quanti caratteri saltare all'inizio della stringa prima di passarla alla funzione clip.
Altri suggerimenti
Non so se esiste un altro modo di farlo e non posso dire se l'approccio che hai in mente sarà inefficiente. Tuttavia, potresti voler dare un'occhiata a questa discussione che discute praticamente della stessa domanda della tua e cita brevemente anche la stessa soluzione di quella che hai concepito.
L'ho fatto in questo modo
TTimeIntervalMicroSeconds32 scrolltime(70000);
iPeriodicScroll = CPeriodic::NewL(CActive::EPriorityIdle);
iPeriodicScroll->Start(scrolltime, scrolltime, TCallBack(CVisTagContainerView::ScrollTextL, this));
e quindi nella funzione ripetuta
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();
Quindi il testo si sposta da destra a sinistra e, quando tutto è finito, l'etichetta viene ripopolata da DownloadMoreTextL