1

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

頭に浮かぶ単純な解決策(しかしおそらく素朴な)は、次のようなものです..

[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 回再描画するのはかなり非効率的かもしれません..しかし、他の方法はありますか?

ありがとう :)

4

3 に答える 3

1

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

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

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

于 2008-12-02T11:47:59.110 に答える
1

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

于 2008-12-02T11:10:22.430 に答える
1

私はこのようにしました

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 によってラベルが再設定されます。

于 2008-12-04T09:45:24.753 に答える