質問

テキストをスクロールする必要があるアプリケーションにCEikLabelという1行があります。

頭に浮かぶシンプルなソリューション(しかし、おそらく素朴)は、次のようなものになります。

[begin pseduo code]

 on timer.fire {
  set slightly shifted text in label
  redraw label
 }
 start timer

[end pseudo code]

CPeriodicクラスをタイマーとして使用し、各更新でlabel.DrawDeferred()を使用します。

これが最良の方法だと思いますか。1秒間に2、3回ラベルを再描画するのは非効率かもしれませんが、他の方法はありますか?

ありがとう:)

役に立ちましたか?

解決

リストボックス内のアイテム名のスクロールに使用されるタイマーベースのソリューションを見てきました。

注意すべき点は、スクロール中に少しちらつく可能性があり、ラベルに付けるテキストが長すぎないことを確認する必要があることです。そうしないと、文字列が自動的にクリップされ、省略記号が追加されます(...)

TextUtils :: ClipToFit を使用して、ラベルに収まる文字列を取得し、ラベルにテキストを配置する前に追加した省略記号を削除します( KTextUtilClipEndChar をクリップされた文字列)。クリップ関数に渡す前に、文字列の先頭でスキップする文字数を計算する必要があります。

他のヒント

別の方法があるかどうかはわかりませんし、あなたの考えているアプローチが非効率になるかどうかも言えません。ただし、このスレッドをご覧ください。あなたとほとんど同じ質問を議論し、あなたが考えたものといくらか同じ解決策を簡潔に言及します。

このようにしました

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