Girar un objecte en un esdeveniment tàctil a kivy
Rotating An Object Touch Event Kivy
Solució:
Podeu vincular l'angle del llenç aNumericProperty, per canviar-la des del vostre codi. Tot el que heu de fer és calcular aquests angles correctament. Després de jugar una mica amb ell, vaig crear el següent codi:
d'aplicació d'importació kivy.app d'importació d'importació kivy.uix.widget Widget d'importació kivy.lang Constructor d'importació kivy.animation Animació d'importació kivy.properties Importació numèrica Propietat matemàtiques kv = '': canvas: Rotació: angle: origen root.angle : self.center Color: rgb: 1, 0, 0 El·lipse: mida: min (self.size), min (self.size) pos: 0,5 * self.size [0] - 0,5 * min (self.size), 0,5 * self.size [1] - 0,5 * min (self.size) Color: rgb: 0, 0, 0 El·lipse: mida: 50, 50 pos: 0,5 * root.size [0] -25, 0,9 * root. size [1] -25 '' 'Builder.load_string (kv) class Dial (Widget): angle = NumericProperty (0) def on_touch_down (self, touch): y = (touch.y - self.center [1]) x = (touch.x - self.center [0]) calc = math.degrees (math.atan2 (y, x)) self.prev_angle = calc si calc> 0 else 360 + calc self.tmp = self.angle def on_touch_move (self, touch): y = (touch.y - self.center [1]) x = (touch.x - self.center [0]) calc = math.degrees (math.atan2 (y, x)) new_angle = calc si calc> 0 else 360 + calc self.angle = self.tmp + (new_angle-self.prev_angle)% 360 def on_ touch_up (self, touch): Animació (angle = 0) .start (self) class DialApp (App): def build (self): return Dial () if __name__ == '__main__': DialApp (). run ()Estic calculant la diferència entre l’angle inicial (després de prémer el ratolí) i l’angle posteriorsobre_tocar_moure. Com que l’angle és una propietat, també el puc modificar mitjançantkivy.animation per fer girar el marcador després de deixar anar el botó del ratolí.
EDITAR
esdeveniment on_touch_down per al cercle infantil:
d'aplicació d'importació kivy.app d'importació d'importació kivy.uix.widget Widget d'importació kivy.uix.floatlayout importació FloatLayout d'importació kivy.lang Constructor d'importació kivy.animation Animació d'importació kivy.properties Importació numèrica Propietat matemàtica kv = '' ': circle_id: circle_id mida: root.size pos: 0, 0 canvas: Gira: angle: self.angle origen: self.center Color: rgb: 1, 0, 0 El·lipse: mida: min (self.size), min (self.size ) pos: 0,5 * self.size [0] - 0,5 * min (self.size), 0,5 * self.size [1] - 0,5 * min (self.size) Cercle: id: circle_id size_hint: 0, 0 size: 50, 50 pos: 0,5 * root.size [0] -25, 0,9 * root.size [1] -25 canvas: Color: rgb: 0, 1, 0 El·lipse: mida: 50, 50 pos: self.pos ' '' Builder.load_string (kv) classe Cercle (Widget): def on_touch_down (self, touch): si self.collide_point (* touch.pos): imprimeix 'cercle petit fet clic' classe Dial (Widget): angle = Propietat numèrica (0) ) def on_touch_down (self, touch): si no self.circle_id.collide_point (* touch.pos): imprimeix 'cercle gran fet clic' y = (touch.y - self.center [1]) x = (touch.x - jo .center [0]) calc = math.degrees (math.atan2 (y, x)) self.prev_angle = calc si calc> 0 else 360 + calc self.tmp = self.angle return super (Dial, self) .on_touch_down (tacte) # despatx d'esdeveniment tàctil posterior def on_touch_move (self, touch): y = (touch.y - self.center [1]) x = (touch.x - self.center [0]) calc = math.degrees ( math.atan2 (y, x)) new_angle = calc si calc> 0 else 360 + calc self.angle = self.tmp + (new_angle-self.prev_angle)% 360 def on_touch_up (self, touch): Animació (angle = 0 ) .start (self) class DialApp (App): def build (self): return Dial () if __name__ == '__main__': DialApp (). run ()
Podeu utilitzar GearTick des del jardí, que és un control lliscant giratori. No és exactament el que necessiteu, però es pot adaptar a les vostres necessitats. 'Per defecte permet la rotació en sentit antihorari, probablement el necessitareu per anar en sentit horari' (Actualització: el giny ara tépropietat d’orientació que es pot configurar a 'en sentit horari' o 'antihorari').
Hauríeu de gestionar la molla cap enrere i aturar-vos a la 'parada del dit'.
L'exemple als extrems gestiona la recuperació de la primavera mitjançant l'animació, tot i que encara heu de gestionar / implementar la funcionalitat de parada de dit.
https://github.com/kivy-garden/garden.geartick
Ús::
Python ::
des de kivy.garden.geartick importació GearTick parent.add_widget (GearTick (interval = (0, 100)))kv ::
BoxLayout: orientation: 'vertical' GearTick: id: gear_tick zoom_factor: 1.1 # descomenta el següent per utilitzar valors no predeterminats #max: 100 #background_image: 'background.png' #overlay_image: 'gear.png' #orientation: 'anti- en sentit horari 'on_release: Animation.stop_all (auto) Animació (valor = 0) .start (auto) Etiqueta: size_hint: 1, None height:' 22dp 'color: 0, 1, 0, 1 text: (' value: {} ') .format (gear_tick.value) 
Instal · lar::
pip instal·lar kivy-garden garden instal·lar geartickExemple de treball que podeu copiar enganxar ::
des de kivy.lang import Builder des de kivy.app import runTouchApp des de kivy.garden.geartick import GearTick runTouchApp (Builder.load_string ('' '#: import Animation kivy.animation.Animation GridLayout: cols: 2 canvas.before: Color: rgba : 1, 1, 1, 1 Rectangle: size: self.size pos: self.pos BoxLayout: orientation: 'vertical' GearTick: id: gear_tick zoom_factor: 1.1 # descomenta el següent per utilitzar valors no predeterminats #max: 100 #background_image : 'background.png' #overlay_image: 'gear.png' #orientation: 'en sentit antihorari' on_release: Animation.stop_all (auto) Animació (valor = 0) .start (auto) Etiqueta: size_hint: 1, Cap alçada: Color '22dp': 0, 1, 0, 1 text: ('valor: {}'). Format (gear_tick.value) '' '))