Qt QML连续无限移动文本

Qt QML连续无限移动文本,qt,qml,Qt,Qml,我需要实现无限移动文本,但在它环绕之前,应该在末尾显示相同的文本 问题已经解决了,但我的问题不同了 例如: 我的文本是“一些文本”,我想要这样的动画 Frame I need this Regular NumberAnimation 0 |some text | |some text | 10 |ome text | |ome text | 20 |me text | |me text | 30 |e

我需要实现无限移动文本,但在它环绕之前,应该在末尾显示相同的文本

问题已经解决了,但我的问题不同了

例如:

我的文本是“一些文本”,我想要这样的动画

Frame    I need this     Regular NumberAnimation
0        |some text |    |some text |
10       |ome text  |    |ome text  |
20       |me text   |    |me text   |
30       |e text   s|    |e text    |
40       | text   so|    | text     |
50       |text   som|    |text      |
60       |ext   some|    |ext       |
70       |xt   some |    |xt        |
80       |t   some t|    |t         |
90       |   some te|    |          |
100      |  some tex|    |         s|
110      | some text|    |        so|
120      |some text |    |       som|
130      |ome text  |    |      some|
140      |me text   |    |     some |
150      |e text   s|    |    some t|
160      | text   so|    |   some te|
170      |text   som|    |  some tex|
180      |ext   some|    | some text|
190      |xt   some |    |some text |
200      |t   some t|    |ome text  |

在QML中有没有一种简单的方法可以做到这一点?

您可以在没有任何动画的情况下完成,只需在特定步骤剪切源字符串来合成显示字符串:

  Item {
    property string text: "some text"
    property string spacing: "      "
    property string combined: text + spacing
    property string display: combined.substring(step) + combined.substring(0, step)
    property int step: 0

    Timer {
      interval: 200
      running: true
      repeat: true
      onTriggered: parent.step = (parent.step + 1) % parent.combined.length
    }

    Text {
      text: parent.display
    }
  }
这比做位置动画要轻,而且在我看来,它有更“有机”的外观

但是,如果您仍然坚持使用动画,您可以在一行中使用两个文本元素来假装换行。但这将比以前的解决方案更为繁重,因为它将涉及对亚像素动画、两个文本元素以及隐藏“屏幕外”文本所需的图形剪辑进行更多的重新评估:

这两种实现并排进行:


做常规的数字编码,但不是“一些文本”,而是“一些文本一些文本”?dydil我已经纠正了这个问题。我需要无限的活力。您的提案只是在下一份文本后移动了相同的问题。您在
gif
中左侧和右侧显示了哪个实现?左侧是动画,右侧是字符串拆分。您知道文本布局的成本吗?我想我在某个地方读到了这样一句话:“当文本发生变化时,它需要重新发布”。我不知道这在这里是如何应用的,以及成本与剪辑和亚像素动画的成本之间的关系。另外:你觉得着色器怎么样?是的,着色器方法也可以,它基本上是第一个解决方案,但不是拆分和合成文本,而是在一个普通的着色器中拆分和合成像素数据。在我的PC上,1000个动画文本占用了大约5%的CPU,而第一次实现的1000%保持稳定在1%。这样,CPU效率提高了5倍,而且GPU的效率也可能更高,因为更新要少得多:)
  Item {
    id: root
    property alias text: t1.text
    property int spacing: 30
    width: t1.width + spacing
    height: t1.height
    clip: true

    Text {
      id: t1
      text: "some text"
      NumberAnimation on x { running: true; from: 0; to: -root.width; duration: 3000; loops: Animation.Infinite }

      Text {
        x: root.width
        text: t1.text
      }
    }
  }