我正在製作一個可以旋轉像大表盤一樣的圓。目前,我在頂部有一個箭頭來顯示撥號盤朝向哪個方向。我希望它的行爲類似於一個老式的旋轉式手機,這樣,當你的手指/光標停下時,你可以旋轉它,但它會緩慢地在你放開之後再次上移。在kivy的一個觸摸事件上旋轉一個對象
這裏是我的對象是什麼樣子:
這裏是我的代碼:
#!/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()
而且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
零件從借用kivy touchtracer演示,以及from this SO question。
你可以看到我有一個正確的打印圓的原點和觸摸事件之間的角度的計算(不知道這將如何響應多個手指,沒有想到這麼遠),但沒有確定如何將其整合到界面中的「旋轉」反饋事件中。
這可能是超出範圍對於這個問題,但你知道我怎麼能觸摸事件添加到小圈在頂部?我爲它分配了一個on_touch聲音事件,以確保我知道我在做什麼,但似乎我可以有旋轉/或/我可以有兒童圈的on_touch ---我似乎無法同時擁有與此同時。 – Mittenchops
您必須使用'super'進一步調度'on_touch_down'事件。我添加了這個例子。 – Nykakin
這似乎是雙重打印這兩個事件? – Mittenchops