Вопрос

В моем приложении есть одна строка 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top