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
}
}
}