You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KivyMD中如何实现Slider垂直滑动时自动释放触摸捕获

KivyMD Slider垂直滑动触摸不释放问题修复

问题复现场景

  • 预期效果:对Slider控件执行垂直滑动操作时,终端输出out信息,控件自动释放触摸事件
  • 异常表现:右键按住Slider垂直滑动时,触摸始终维持按住状态,无法自动执行Ungrab操作释放事件

问题根因

Slider默认仅响应水平方向的拖拽交互,当检测到滑动方向偏离水平轴转为垂直滑动时,原生逻辑没有主动触发触摸取消抓取的流程,导致触摸事件一直被Slider持有,无法释放。

修复实现

自定义Slider子类重写触摸移动事件逻辑,主动判定滑动方向,触发垂直滑动逻辑时手动释放触摸:

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.slider import MDSlider

KV = '''
MDScreen:
    CustomSlider:
        size_hint_x: 0.8
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        min: 0
        max: 100
        value: 50
'''

class CustomSlider(MDSlider):
    # 垂直滑动判定阈值,单位为像素,可按需调整
    VERTICAL_DRAG_THRESHOLD = 10

    def on_touch_move(self, touch):
        if self.collide_point(*touch.pos):
            dx = abs(touch.dx)
            dy = abs(touch.dy)
            # 判定为垂直滑动:垂直偏移超过阈值,且偏移量大于水平偏移
            if dy > self.VERTICAL_DRAG_THRESHOLD and dy > dx:
                print("out")
                # 主动释放控件对触摸事件的抓取
                self.ungrab(touch)
                # 返回False终止事件向Slider默认拖拽逻辑传播
                return False
        return super().on_touch_move(touch)

class SliderTestApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

if __name__ == "__main__":
    SliderTestApp().run()

关键说明

  • 阈值调整:VERTICAL_DRAG_THRESHOLD参数可根据实际交互手感调整,数值越小越容易触发垂直滑动判定
  • 按键适配:如果仅需要右键触发该逻辑,可在判定条件中增加touch.button == "right"判断即可
  • 状态一致性:主动调用ungrab方法后,Slider会自动恢复到非按压的视觉状态,不会出现一直高亮的按住效果

内容的提问来源于stack exchange,提问作者isaffathir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:06:50