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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top