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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top