python控制苹果手机触摸_python – 在kivy中的触摸事件上旋转对象

您可以将画布的角度绑定到NumericProperty,以从代码内部更改它.您需要做的就是正确计算这些角度.在玩了一下之后我创建了以下代码:

from kivy.app import App

from kivy.uix.widget import Widget

from kivy.lang import Builder

from kivy.animation import Animation

from kivy.properties import NumericProperty

import math

kv = '''

:

canvas:

Rotate:

angle: root.angle

origin: self.center

Color:

rgb: 1, 0, 0

Ellipse:

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)

Color:

rgb: 0, 0, 0

Ellipse:

size: 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 if 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 if calc > 0 else 360+calc

self.angle = self.tmp + (new_angle-self.prev_angle)%360

def on_touch_up(self, touch):

Animation(angle=0).start(self)

class DialApp(App):

def build(self):

return Dial()

if __name__ == "__main__":

DialApp().run()

我正在计算on_touch_move中初始(按下鼠标后)和后来角度之间的差异.由于角度是一个属性我也可以使用kivy.animation修改它,以便在释放鼠标按钮后旋转拨号.

编辑

子圈的on_touch_down事件:

from kivy.app import App

from kivy.uix.widget import Widget

from kivy.uix.floatlayout import FloatLayout

from kivy.lang import Builder

from kivy.animation import Animation

from kivy.properties import NumericProperty

import math

kv = '''

:

circle_id: circle_id

size: root.size

pos: 0, 0

canvas:

Rotate:

angle: self.angle

origin: self.center

Color:

rgb: 1, 0, 0

Ellipse:

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)

Circle:

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

Ellipse:

size: 50, 50

pos: self.pos

'''

Builder.load_string(kv)

class Circle(Widget):

def on_touch_down(self, touch):

if self.collide_point(*touch.pos):

print "small circle clicked"

class Dial(Widget):

angle = NumericProperty(0)

def on_touch_down(self, touch):

if not self.circle_id.collide_point(*touch.pos):

print "big circle clicked"

y = (touch.y - self.center[1])

x = (touch.x - self.center[0])

calc = math.degrees(math.atan2(y, x))

self.prev_angle = calc if calc > 0 else 360+calc

self.tmp = self.angle

return super(Dial, self).on_touch_down(touch) # dispatch touch event futher

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 if calc > 0 else 360+calc

self.angle = self.tmp + (new_angle-self.prev_angle)%360

def on_touch_up(self, touch):

Animation(angle=0).start(self)

class DialApp(App):

def build(self):

return Dial()

if __name__ == "__main__":

DialApp().run()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值