Symbian S60 - rolagem de texto em um CEikLabel
Pergunta
Eu tenho uma única linha CEikLabel no meu aplicativo que precisa de texto de rolagem.
A solução simples que vem à mente (mas possivelmente ingênuo) seria algo como ..
[begin pseduo code]
on timer.fire {
set slightly shifted text in label
redraw label
}
start timer
[end pseudo code]
Usando uma classe CPeriodic como o temporizador e label.DrawDeferred () em cada atualização.
Você acha que esta é a melhor maneira, pode ser bastante ineficiente redesenhar o rótulo duas ou três vezes por segundo .. mas existe alguma outra maneira?
Obrigado:)
Solução
Eu vi a solução temporizador base usada para rolagem nomes de itens em caixas de listagem.
Um par de coisas que atente para são de que ele poderia piscar um pouco durante a rolagem e que você precisa para garantir que o texto que você colocar no rótulo não é muito longo, caso contrário ele irá cortar automaticamente a string e adicione um elipsis (...)
Use TextUtils::ClipToFit
para obter uma cadeia que se encaixa no rótulo e remover o elipsis acrescenta antes de colocar o texto na etiqueta (procurar KTextUtilClipEndChar
na cadeia despontados). Você vai precisar de trabalhar fora quantos caracteres para pular no início da cadeia antes de passá-lo para a função clipe.
Outras dicas
Eu não sei se há outra maneira de fazê-lo e não posso dizer se a abordagem que você tem em sua mente será ineficiente. No entanto, você pode querer dar uma olhada esta discussão que discute praticamente a mesma pergunta que o seu e brevemente também menciona um pouco a mesma solução que o que você ter concebido.
Eu tenho feito isso como este
TTimeIntervalMicroSeconds32 scrolltime(70000);
iPeriodicScroll = CPeriodic::NewL(CActive::EPriorityIdle);
iPeriodicScroll->Start(scrolltime, scrolltime, TCallBack(CVisTagContainerView::ScrollTextL, this));
e, em seguida, na função repetido
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();
Assim movimentos texto da direita para a esquerda, e quando tudo se foi, o rótulo é preenchida por DownloadMoreTextL