QML Flickable Проблемы
Мне нужен горизонтальный контроллер, состоящий из фона и движущегося джойстика. Это требует следующего поведения:
- Изначально по центру джойстик может перемещаться влево или вправо в пределах фона.
- Когда перетаскивание отпущено, джойстик перецентрируется.
- При касании части фона джойстик переходит на ощупь.
- Если касание отпущено, ручка большого пальца перецентрируется.
- Если перетаскивание выполняется после касания, ручка для большого пальца будет перетаскиваться из позиции, которой коснулись.
Проблемы:
При касании джойстик переходит к TouchPoint по мере необходимости. Однако, если перетаскивание сразу же следует за касанием, джойстик возвращается в положение, в котором он находился до касания, до начала перетаскивания.
Если джойстик перетащить вправо и отпустить, он сразу же переместится обратно в центр по мере необходимости. Если он перетаскивается на левую границу, происходит задержка, прежде чем он возвращается к центру.
Выполнение приведенного ниже кода иллюстрирует работу контроллера и проблемы:
import QtQuick 2.0
Item {
id: horizontalController
width: 300
height: 100
Rectangle {
id: controllerBackground
width: (parent.width / 3) * 2
height: parent.height
anchors.centerIn: parent
color: "white"
}
Flickable
{
id: controllerFlick
width: parent.width / 3 * 2
height: parent.height
anchors.centerIn: parent
contentX: width / 4
contentWidth: bounds.width
contentHeight: bounds.height
boundsBehavior: Flickable.StopAtBounds
onMovementEnded: {
contentX = width / 4
}
MultiPointTouchArea{
id: controllerTouchArea
enabled: true
anchors.fill: bounds
touchPoints: TouchPoint {id: controllerTouchPoint }
onPressed: {
controllerFlick.contentX = Math.min(Math.max(controllerBackground.width - controllerTouchPoint.x,0),controllerBackground.width / 2)
}
onReleased: {
controllerFlick.contentX = controllerFlick.width / 4
}
}
Item{
id: bounds
width: controllerFlick.width * 1.5
height: controllerFlick.height
Rectangle {
id: image
width: parent.width / 3
height: parent.height
anchors.centerIn: parent
color: "red"
}
}
}
}