Ich erstelle eine Zeitschaltuhr, wo die Zeit durch Ziehen des Uhrzeigers eingestellt werden kann (per Touch-Eingabe oder Maus). Zu diesem Zweck ich ein AnalogClockHand Element definiert haben, wie unten,Wie ein qml Rechteck durch Ziehen drehen?
AnalogClockHand.qml
Rectangle {
id: hand
property alias rotationAngle: handRotation.angle
x: (parent.width/2) - (width/2); y: (parent.height/2) - height; z: 2
width: units.gu(1); height: units.gu(14);
radius: units.gu(1)
color: Constants.coolGrey
antialiasing: true
transform: Rotation {
id: handRotation
origin { x: hand.width/2; y: hand.height }
Behavior on angle {
SpringAnimation { spring: 2; damping: 0.3; modulus: 360 }
}
}
}
Im Haupt qml Datei
gezeigt, benutzte ich dieses Element und eine mouseArea, um es hinzuzufügen, wie unten gezeigt,
Haupt QML Datei
AnalogClockHand {
id: secondHand
z: parent.z - 1;
height: units.gu(17); width: units.gu(0.5)
rotationAngle: seconds * 6;
antialiasing: true;
// Implements touch support
MouseArea {
id: timerbackmousearea
property real truex: mouseX - parent.width/2
property real truey: parent.height/2 - mouseY
property real angle: Math.atan2(truex, truey)
property real strictangle: parseInt(angle * 180/Math.PI)
property real modulo: strictangle % 6
anchors.fill: parent
preventStealing: true
onPositionChanged: if (timerbackmousearea.angle < 0) {
secondHand.rotationAngle = strictangle - modulo + 360;
timerValue = parseInt(secondHand.rotationAngle/6);
seconds = timerValue;
}
else {
secondHand.rotationAngle = strictangle - modulo + 6;
timerValue = parseInt(secondHand.rotationAngle/6);
seconds = timerValue;
}
}
}
Diese Logik ist funktioniert jedoch nicht richtig und ist sehr flockig. Also kann man die Zeit nicht so flüssig einstellen. Am Ende des Tages, ich versuche, etwas zu implementieren, wie im Bild unten gezeigt. Der Benutzer sollte in der Lage sein, den Stunden-, Minuten- oder Sekundenzeiger zu bewegen, um die Zeit einzustellen.
Gibt es eine bessere Code-Logik, die ich implementieren könnte?
Anmerkung 1: ich erkennen, dass der Sekundenzeiger in dem Bild ist sehr klein, aber das sollte früh genug festgelegt werden.