Symbian S60 - Прокрутка текста в CEikLabel
Вопрос
В моем приложении есть одна строка CEikLabel, которая должна прокручивать текст.
Простое решение, которое приходит на ум (но, возможно, наивно), будет выглядеть примерно так ...
[begin pseduo code]
on timer.fire {
set slightly shifted text in label
redraw label
}
start timer
[end pseudo code]
Использование класса CPeriodic в качестве таймера и label.DrawDeferred () при каждом обновлении.
Как вы думаете, это лучший способ, может быть довольно неэффективно перерисовывать метку два или три раза в секунду ... но есть ли другой способ?
Спасибо:)
Решение
Я видел решение на основе таймера, используемое для прокрутки имен элементов в списках.
Несколько вещей, на которые следует обратить внимание, это то, что он может немного мерцать при прокрутке, и вам нужно убедиться, что текст, который вы помещаете на ярлык, не слишком длинный, иначе он автоматически обрежет строку и добавит elipsis. (...)
Используйте TextUtils :: ClipToFit
, чтобы получить строку, которая помещается на метке, и удалите элипсис, который он добавляет, прежде чем поместить текст на метку (найдите KTextUtilClipEndChar
в обрезанная строка). Вам нужно будет определить, сколько символов нужно пропустить в начале строки, прежде чем передать ее в функцию clip.
Другие советы
Я не знаю, есть ли другой способ сделать это, и не могу сказать, будет ли подход, который вы используете в своем уме, будет неэффективным. Однако вы можете посмотреть эту ветку . в котором обсуждается почти тот же вопрос, что и у вас, а также вкратце упоминается в некоторой степени то же решение, что и задуманное вами.
Я сделал это так
TTimeIntervalMicroSeconds32 scrolltime(70000);
iPeriodicScroll = CPeriodic::NewL(CActive::EPriorityIdle);
iPeriodicScroll->Start(scrolltime, scrolltime, TCallBack(CVisTagContainerView::ScrollTextL, this));
а затем в повторной функции
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();
Таким образом, текст перемещается справа налево, и когда все прошло, метка снова заполняется DownloadMoreTextL