【问题标题】:Properly resize main kivy window when soft keyboard appears on android当软键盘出现在android上时正确调整主kivy窗口的大小
【发布时间】:2016-04-21 12:44:18
【问题描述】:

我正在尝试使用 Window.softinput_mode 在出现软键盘时调整窗口内容的大小:

softinput_mode = 'resize'

在此模式下,窗口会调整大小(即,窗口高度减少了键盘高度),但键盘仍然与内容重叠,因为看起来,调整后的窗口 y 坐标减少了键盘高度。

当软键盘出现时如何垂直对齐窗口内容?

“pan”和“below_target”模式也没有帮助,因为使用它们,窗口沿 y 轴(+keyboard_height)移动,因此窗口内容的顶部是不可见的。

编辑: 一个最小的代码(取自一个 kivy git-issue 并改编自),它说明了在 Android 上运行时所描述的行为: http://pastebin.com/EzKCRMj7

【问题讨论】:

  • 请提供您的布局xml。
  • @JonasKöritz 这个问题与python kivy框架有关。我已经包含了一个最小的例子。
  • 您的 GridLayout 的高度是固定的,这可能是个问题。

标签: android python resize kivy soft-keyboard


【解决方案1】:

问题解决了

    if smode == 'resize':
        y += kheight

在函数 Window.update_viewport() 中,我将下一个代码添加到我的应用程序以进行锻炼。不必直接更改 KIVY 库

def update_viewport(self=Window):
    from kivy.graphics.opengl import glViewport
    from kivy.graphics.transformation import Matrix
    from math import radians

    w, h = self.system_size
    if self._density != 1:
        w, h = self.size

    smode = self.softinput_mode
    target = self._system_keyboard.target
    targettop = max(0, target.to_window(0, target.y)[1]) if target else 0
    kheight = self.keyboard_height

    w2, h2 = w / 2., h / 2.
    r = radians(self.rotation)

    x, y = 0, 0
    _h = h
    if smode == 'pan':
        y = kheight
    elif smode == 'below_target':
        y = 0 if kheight < targettop else (kheight - targettop)
    if smode == 'scale':
        _h -= kheight
    if smode == 'resize':
        y += kheight
    # prepare the viewport
    glViewport(x, y, w, _h)

    # do projection matrix
    projection_mat = Matrix()
    projection_mat.view_clip(0.0, w, 0.0, h, -1.0, 1.0, 0)
    self.render_context['projection_mat'] = projection_mat

    # do modelview matrix
    modelview_mat = Matrix().translate(w2, h2, 0)
    modelview_mat = modelview_mat.multiply(Matrix().rotate(r, 0, 0, 1))

    w, h = self.size
    w2, h2 = w / 2., h / 2.
    modelview_mat = modelview_mat.multiply(Matrix().translate(-w2, -h2, 0))
    self.render_context['modelview_mat'] = modelview_mat
    frag_modelview_mat = Matrix()
    frag_modelview_mat.set(flat=modelview_mat.get())
    self.render_context['frag_modelview_mat'] = frag_modelview_mat

    # redraw canvas
    self.canvas.ask_update()

    # and update childs
    self.update_childsize()


if __name__ == '__main__':
    app = MainApp()
    Window.update_viewport = update_viewport
    Window.softinput_mode = 'resize'
    app.run()

计算 Window 的导入,根据 kivy 版本 kheight 变量可能有不同名字。

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2015-07-24
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2011-07-15
    • 2019-02-22
    相关资源
    最近更新 更多