【问题标题】:Symbian S60 - Scrolling text in a CEikLabelSymbian S60 - 在 CEikLabel 中滚动文本
【发布时间】:2008-12-02 11:01:13
【问题描述】:

我的应用程序中有一行 CEikLabel 需要滚动文本。

想到的简单解决方案(但可能是幼稚的)类似于......

[begin pseduo code]

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

[end pseudo code]

在每次更新时使用 CPeriodic 类作为计时器和 label.DrawDeferred()。

你认为这是最好的方法吗,每秒重绘标签两到三次可能效率很低..但是还有其他方法吗?

谢谢:)

【问题讨论】:

    标签: scroll symbian s60 ticker ceiklabel


    【解决方案1】:

    我已经看到用于在列表框中滚动项目名称的基于计时器的解决方案。

    需要注意的几件事是它在滚动时可能会闪烁一点,并且您需要确保放置在标签上的文本不会太长,否则它会自动剪切字符串并添加省略号(...)

    使用TextUtils::ClipToFit 获取适合标签的字符串,并在将文本放在标签上之前删除它添加的省略号(在剪切的字符串中搜索KTextUtilClipEndChar)。在将字符串传递给剪辑函数之前,您需要计算出在字符串的开头要跳过多少个字符。

    【讨论】:

      【解决方案2】:

      我不知道是否还有其他方法可以做到,也不能说您脑海中的方法是否会效率低下。但是,您可能想看看this thread,它讨论了与您的问题几乎相同的问题,并且还简要提到了与您构想的解决方案有些相同的解决方案。

      【讨论】:

      • 此线程中的讨论实际上并不适用于将文本插入 CEikLabel 对象
      • @Adam:特别是,是的,它没有。但它通常适用于“ticker”文本,无论您希望文本出现在何处。
      【解决方案3】:

      我是这样做的

      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 重新填充

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        相关资源
        最近更新 更多