S60 - Scrolling Text in einem CEikLabel
Frage
Ich habe nur eine einzige Zeile CEikLabel in meiner Anwendung, den Text muss blättern.
Die einfache Lösung, die den Sinn kommt (aber möglicherweise naiv) wäre so etwas wie ..
[begin pseduo code]
on timer.fire {
set slightly shifted text in label
redraw label
}
start timer
[end pseudo code]
Mit einer CPeriodic Klasse, die als Timer und label.DrawDeferred () auf jedes Update.
Glauben Sie, dass dies der beste Weg ist, kann es ziemlich ineffizient sein Nachziehen das Etikett zwei oder drei Mal pro Sekunde .. aber ist es eine andere Möglichkeit?
Danke:)
Lösung
Ich habe die Timer-basierte Lösung für das Scrollen Elementnamen in Listboxen verwendet gesehen.
Ein paar Dinge zu achten gilt, dass es ein wenig flackern könnte beim Scrollen und dass Sie vornehmen müssen, dass der Text, den Sie auf dem Etikett setzen ist nicht zu lange, sonst wird es automatisch die String-Clip und eine Elipsis hinzufügen (...)
Verwenden Sie TextUtils::ClipToFit
eine Zeichenfolge zu erhalten, die auf dem Etikett passt und entfernen Sie die Elipsis es hinzufügt, bevor Sie den Text auf dem Etikett setzen (für KTextUtilClipEndChar
in Ihrem abgeschnitten Zeichenfolge suchen). Sie werden, wie viele Zeichen arbeiten müssen aus am Anfang des Strings zu überspringen, bevor es auf die Clip-Funktion übergeben.
Andere Tipps
Ich weiß nicht, ob es einen anderen Weg, es zu tun ist, und kann nicht sagen, ob der Ansatz, den Sie in Ihrem Geist ineffizient sein wird. Sie können jedoch einen Blick auf diesen Thread nehmen wollen die so ziemlich die gleiche Frage wie bei Ihnen diskutiert und auch kurz erwähnt etwas die gleiche Lösung wie die, die Sie erdacht haben.
Ich habe es so gemacht
TTimeIntervalMicroSeconds32 scrolltime(70000);
iPeriodicScroll = CPeriodic::NewL(CActive::EPriorityIdle);
iPeriodicScroll->Start(scrolltime, scrolltime, TCallBack(CVisTagContainerView::ScrollTextL, this));
und dann in der wiederholten Funktion
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();
So Text bewegt sich von rechts nach links, und wenn alles weg, das Etikett von DownloadMoreTextL neu besiedelt wird