网页窗口
from ascript.android.ui import WebWindow
制作用户交互界面
此网页窗口, 使用 WebView 展示 Html页面 ,需要开发者掌握一定 html知识.
开启窗口后,使用 JavaScript 可以和Python语言交互与通信.
方法
创建Web窗口
创建一个WebUI交互窗口,窗口依赖Html
- 函数
WebWindow(html:str, id:int=None)
- 参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| html | str | 是 | html布局路径,请使用 ‘R.res’ 引用资源,也可以传入一个http地址 |
| id | int | 否 | 窗口唯一标识id |
- 返回值
WebWindow 窗口对象
- 示例
#展示一个简单的Html页面
from ascript.android.ui import WebWindow
from ascript.android.system import R
w = WebWindow(R.ui(‘a.html’))
w.show()
窗口模式
可以改变窗口的模式
- 函数
WebWindow(...).mode(mode:int=0)
- 参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| mode | int | 是 | 窗口的模式 m=0 默认,窗口内和窗口外都可以获取点击触摸事件,但窗口外不可以调出键盘 m=1 只有窗口内的点击触摸事件有效 m=2 窗口内的所有点击触摸事件无效,并透传到窗口下 m=3窗口内外都可以点击触摸,但窗口内不可以调起键盘 m = -1 窗口载入进activity中.窗口内长按事件触发为系统原生方式 |
- 返回值
WebWindow 窗口对象
- 示例
# 显示一个 不可触摸的悬浮窗
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.mode(2)
w.show()
消息通道
设置消息通道,接收 JavaScript 中通过 window.airscript.call(key, value) 传递的消息
@tunner 装饰器
使用装饰器接收所有来自 html 的消息
- 函数
@WebWindow(...).tunner()
def callback(key, value):
...
- 示例
from ascript.android.ui import WebWindow
from ascript.android.system import R
w = WebWindow(R.ui("index.html"))
@w.tunner()
def on_msg(key, value):
print(f"收到消息: {key} = {value}")
w.show()
@on 装饰器
针对特定 key 注册独立的处理函数, 无需在一个函数中写 if/elif 判断
- 函数
@WebWindow(...).on(key:str)
def handler(value):
...
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| key | str | 必填 | JavaScript 中 airscript.call(key, value) 传递的 key 值 |
- 示例
from ascript.android.ui import WebWindow
from ascript.android.system import R
w = WebWindow(R.ui("index.html"))
@w.on("btn_start")
def on_start(value):
print("用户点击了开始")
@w.on("btn_stop")
def on_stop(value):
print("用户点击了停止")
w.show()
混合使用
@on 和 @tunner 可以同时使用. @on 注册的 key 会优先处理, 未注册的 key 会回调到 @tunner 中.
完整示例
下面是一个完整的 Html + Python 配合使用的示例
Html 文件 (res/ui/index.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>控制面板</title>
<style>
button { padding: 10px 20px; margin: 10px; font-size: 16px; }
</style>
</head>
<body>
<h3>控制面板</h3>
<button onclick="start()">开始任务</button>
<button onclick="stop()">停止任务</button>
<button onclick="setSpeed()">设置速度</button>
<script>
function start() {
// 向 Python 发送消息, key="btn_start", value="1"
window.airscript.call("btn_start", "1")
}
function stop() {
window.airscript.call("btn_stop", "1")
}
function setSpeed() {
// value 可以传递任意字符串
window.airscript.call("set_speed", "5")
}
</script>
</body>
</html>
Python 文件 (main.py)
使用 @on 为每个按钮注册独立的处理函数:
from ascript.android.ui import WebWindow
from ascript.android.system import R
w = WebWindow(R.ui("index.html"))
@w.on("btn_start")
def on_start(value):
print("任务已启动")
@w.on("btn_stop")
def on_stop(value):
print("任务已停止")
@w.on("set_speed")
def on_speed(value):
print(f"速度设置为: {value}")
w.show(wait=True)
也可以使用 @tunner 在一个函数中统一处理:
from ascript.android.ui import WebWindow
from ascript.android.system import R
w = WebWindow(R.ui("index.html"))
@w.tunner()
def on_msg(key, value):
if key == "btn_start":
print("任务已启动")
elif key == "btn_stop":
print("任务已停止")
elif key == "set_speed":
print(f"速度设置为: {value}")
w.show(wait=True)
尺寸
设置窗口 宽 或 高
- 函数
WebWindow(...).size(self,width=None,height=None)
- 参数
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| width | number 或 string | 否 | 当值为number类型时 width=300 设置窗口宽度为300px 当值为string类型时 .width="80vw" 设置宽度为屏幕宽度的 80% width ="80vh" 设置宽度为屏幕高度的 80% |
| height | number 或 string | 否 | 当值为number类型时 height =300 设置窗口高度为300px 当值为string类型时 height="80vw" 设置高度为屏幕宽度的 80% width ="80vh" 设置高度为屏幕高度的 80% |
- 示例
# 根据像素值 设置窗口宽高
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.size(500,300)
w.show()
# 根据百分比 设置窗口宽高
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.size('50vw','50vh')
w.show()
背景
设置UI背景色, 默认为白色
- 函数
WebWindow(...).background(color:str)
- 参数
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| color | string | 必 填 | argb 颜色值 透明:#00000000 白色:#FFFFFF 黑色:#000000 |
- 示例
# 设置背景色透明
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.background("#00000000")
w.show()
拖拽
UI窗口是否可被用户拖拽,默认为False
- 函数
WebWindow(...).drag(is_drag:bool=False)
- 参数
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| is_drag | boolean | 必填 | 系统默认为False 设置为True 后,在UI顶部出现拖动条,和改变尺寸的按钮 |
- 示例
# 让窗口可以拖动
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.drag(True)
w.show()
遮罩
设置窗口遮罩层透明度,默认为0.5
- 函数
WebWindow(...).dim_amount(dim:float=0.5)
- 参数
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| dim | float | 必填 | 数值在 0-1之间 0 :完全没有遮罩,1:完全黑的遮罩,0.5:半透明遮罩,默认为0.5 |
- 示例
# 取消窗口遮罩
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.dim_amount(0)
w.show()
# 窗口遮罩 为80%黑度
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.dim_amount(0.8)
w.show()
引力与位置
可更改 窗口的引力方向,随着引力方向的改变. 窗口的位置 属性也会随着引力点改变.
- 函数
WebWindow(...).gravity(gravity:int=None,offset_x:int=None,offset_y:int=None)
- 引力方向: 窗口靠左,窗口靠右,还是窗口居中 等.
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| gravity | number | 否 | 此值需传入 android.view.Gravity 中的常量值 |
| offset_x | number | 否 | 距离 引力点 x轴 偏移位置 |
| offset_y | number | 否 | 距离 引力点 y轴 偏移位置 |
- 示 例
# 窗口布局至左上角
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.gravity(3|48)
w.show()
# 窗口布局至左上角,偏移左上角 x:100px,y:200px
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.gravity(3|48,100,200)
w.show()
引力方向
| android.view.Gravity 的常用常量 | 数值 | 备注 |
|---|---|---|
| LEFT | 3 | 窗口居左 |
| TOP | 48 | 窗口居上 |
| RIGHT | 5 | 窗口居右 |
| BOTTOM | 80 | 窗口居底 |
| CENTER_HORIZONTAL | 1 | 水平居中 |
| CENTER_VERTICAL | 16 | 垂直居中 |
| CENTER | 17 | 屏幕居中 |
Android 类的常量使用
可以 通过python 引入使用 from android.view import Gravity
也可以 直接填入常量数值使用
- 窗口的组合引力 应该使用 ‘|’ 连接多个引力值
# 引力的组合写法
# 右上角
WebWindow(...).gravity(48|5)
# 右下角
WebWindow(...).gravity(80|5)
#左上角
WebWindow(...).gravity(48|3)
#左下角
WebWindow(...).gravity(80|3)
#左垂直居中
WebWindow(...).gravity(3|16)
#右垂直居中
WebWindow(...).gravity(5|16)
#上横向居中
WebWindow(...).gravity(48|1)
#下横向居中
WebWindow(...).gravity(80|1)
- 示例
显示
展现UI,启动一个窗口展示html
- 函数
WebWindow(...).show(wait=False)
- 参数
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| wait | boolean | 否 | False:展示窗口后,代码不会阻塞,继续向下执行。 True:阻塞代码,直到窗口关闭。 |
- 示例
# 显示一个窗口
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.show()
关闭
关闭当前WebWindow
- 函数
WebWindow(...).close()
- 示例
# 显示一个窗口,2秒后关闭
from ascript.android.ui import WebWindow
from ascript.android.system import R
import time
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
w.show()
time.sleep(2)
w.close()
页面回退
如果页面可以回退,则回退到上一页面
- 函数
WebWindow(...).go_back()
- 示例
# 显示一个窗口
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
....
w.go_back()
页面前进
如果页面可以前进,则前进到下一个页面
- 函数
WebWindow(...).go_forward()
- 示例
# 显示一个窗口
from ascript.android.ui import WebWindow
from ascript.android.system import R
# 构建一个WebWindow 显示‘/ui/a.html’
w = WebWindow(R.ui('a.html'))
....
w.go_forward()
Python与Html交互
Python 调用 JavaScript 方法
请确定,在html 加载 javascript 代码中 存在将被调用的函数from ascript.android.ui import WebWindow
from ascript.android.system import R
w = WebWindow(R.ui('a.html'))
w.show()
# 调用 javascript 中的 函数 fun1 ,并传入参数 "自在老师",2
w.call('fun1("自在老师",2)')
JavaScript 向 Python 传递数据
在html中,使用javascript 方法调用内置jairscript对象<script>
//这里的 key,value 用户填入自定义的值, 在 python 的 @win.tunner() 或 @win.on(key) 中会回调
window.airscript.call('key',"value")
</script>
JavaScript 中的快捷方法
| 方法 | 备注 |
|---|---|
| airscript.close() | 关闭当前窗口 |
| airscript.get("key") | 获取 Python 中Kv 存储 的数据,仅支持string数据 |
| airscript.save("key","value") | 快速存储数据到本地,和Python Kv函数数据互通,仅支持string数据 |
<script>
//在JS 中直接关闭当前窗口
window.airscript.close()
</script>
<script>
//在JS 中获取 Python代码中 Kv 存储的值
var value = window.airscript.get("key")
</script>
<script>
//在JS 调用 save 将数据存储在本地 只支持存储string 类型的值.
window.airscript.save("key","value")
</script>