Pracuję nad utworzeniem koła, które obróci się jak duża tarcza. Obecnie mam strzałkę u góry, aby pokazać, w którym kierunku znajduje się tarcza. Chciałbym, aby jego zachowanie było trochę jak stary czasowy telefon obrotowy, tak, że podczas gdy palec/kursor jest w dół, możesz go obracać, ale po powrocie zwolni (powoli) z powrotem do góry.Obracanie obiektu na imprezie dotykowej w kivy
Oto co mój obiekt wygląda tak:
A oto mój kod:
#!/usr/bin/kivy
import kivy
kivy.require('1.7.2')
import math
from random import random
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.graphics import Color, Ellipse, Rectangle
class MinimalApp(App):
title = 'My App'
def build(self):
root = RootLayout()
return(root)
class RootLayout(AnchorLayout):
pass
class Circley(RelativeLayout):
angle = 0
def on_touch_down(self, touch):
ud = touch.ud
ud['group'] = g = str(touch.uid)
return True
def on_touch_move(self, touch):
ud = touch.ud
# print(touch.x, 0)
# print(self.center)
# print(0, touch.y)
# print(touch.x - self.center[0], touch.y - self.center[1])
y = (touch.y - self.center[1])
x = (touch.x - self.center[0])
calc = math.degrees(math.atan2(y,x))
angle = calc if calc > 0 else (360 + calc)
print(angle)
def on_touch_up(self, touch):
touch.ungrab(self)
ud = touch.ud
return True
if __name__ == '__main__':
MinimalApp().run()
I KV:
#:kivy 1.7.2
#:import kivy kivy
<RootLayout>:
anchor_x: 'center' # I think this /is/ centered
anchor_y: 'center'
canvas.before:
Color:
rgba: 0.4, 0.4, 0.4, 1
Rectangle:
pos: self.pos
size: self.size
Circley:
anchor_x: 'center' # this is /not/ centered.
anchor_y: 'center'
canvas.before:
PushMatrix
Color:
rgba: 0.94, 0.94, 0.94, 1
Rotate:
angle: self.angle
axis: 0, 0, 1
origin: self.center
Ellipse:
source: 'arrow.png'
size: 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)
Label:
text: unicode(self.size) # this is /not/ appearing
color: 1,0,0,1
canvas.after:
PopMatrix
Części, które są zapożyczone z demonstracja kivy touchtracer i from this SO question.
Możesz zobaczyć, że mam obliczenia, które poprawnie drukują kąt między początkiem koła a zdarzeniem dotykowym (nie wiesz, jak zareaguje na wiele palców, nie pomyślał o tym zbyt daleko), ale nie pewnie, jak zintegrować to ze zdarzeniem sprzężenia zwrotnego "wirującym" w interfejsie.
Prawdopodobnie jest poza zakresem na to pytanie, ale czy wiesz, jak mogę dodać dotykowy zdarzenia do wąskiego kręgu na górze? Przypisałem to zdarzenie dźwiękowe on_touch tylko po to, aby upewnić się, że wiem, co robię, ale wydaje mi się, że mogę albo mieć rotację/albo/mogę mieć opcję on_touch dla kółka z dzieckiem --- nie mogę mieć obu w tym samym czasie. – Mittenchops
Musisz wysłać zdarzenie 'on_touch_down' dalej używając' super'. Dodałem przykład. – Nykakin
To wydaje się być podwójnym drukowaniem obu wydarzeń? – Mittenchops