跳到主要内容

JS与UI交互

说明

  • 本章节主要讲述JS与UI元素进行交互
  • 和UI交互的的js模块对象统一以 ui开头,例如 ui.toast("msg")

如何使用

  • 在工程的layout文件夹下新建一个ui.js文件,内容为
function main() {
ui.toast("我是JS控制的UI");
}

main();
  • 加载layout的main.xml文件并展示出来,内容为
function main() {
ui.toast("我是JS控制的UI");
ui.layout("标签1", "main.xml");
}

main();
  • 以上的操作即可完成一个简单的展示main.xml布局的操作

高级操作

  • 编写一个ui.js
/**
* 该文件由EasyClick开发工具自动创建
*/
function main() {
ui.toast("我是ui的Toast函数");
var set = ui.layout("参数设置", "main.xml");
ui.layout("其他说明", "main2.xml");
ui.logd("设置UI结果: " + set);

//Switch 开关按钮的用法
var auto_env = ui.getViewValue(ui.auto_env);
ui.logd("tag为 auto_env 的值: " + auto_env);
//开关按钮的事件
ui.setEvent(ui.auto_env, "checkedChange", function (view, isChecked) {
ui.logd("tag为 auto_env isChecked " + isChecked);
if (isChecked) {
startAutoEnv();
}
});
if (ui.isServiceOk()) {
ui.auto_env.setChecked(true);
} else {
ui.auto_env.setChecked(false);
}

//EditText 编辑框的用法
var name = ui.getViewValue(ui.name);
ui.logd("tag为name的值: " + name);
ui.name.setText("我是name的值");
//Spinner 下拉选择框用法
var sex = ui.getViewValue(ui.sex);
ui.logd("tag为 sex 的值: " + sex);
//下拉选择框的事件
ui.setEvent(ui.sex, "itemSelected", function (position, value) {
ui.logd("tag为 sex itemSelected " + value);
});

//RadioButton 单选框用法
var three = ui.getViewValue(ui.three);
ui.logd("tag为 three 的值: " + three);
//单选框的事件
ui.setEvent(ui.three, "checkedChange", function (view, isChecked) {
ui.logd("tag为 three isChecked " + isChecked);
});
//CheckBox 复选框用法
var dance = ui.getViewValue(ui.dance);
ui.logd("tag为 dance 的值: " + dance);
//复选框的事件
ui.setEvent(ui.dance, "checkedChange", function (view, isChecked) {
ui.logd("tag为 dance isChecked " + isChecked);
});

//saveAllBtn 保存参数事件
ui.setEvent(ui.saveAllBtn, "click", function (view) {
var s = ui.saveAllConfig();
ui.logd("保存所有参数结果 " + s)
});

//系统设置按钮
ui.setEvent(ui.systemSetting, "click", function (view) {
ui.openECSystemSetting();

});
//启动脚本按钮
ui.setEvent(ui.startBtn, "click", function (view) {
ui.start();
});
//启动环境按钮
ui.setEvent(ui.envBtn, "click", function (view) {
//异步启动环境,如果成功了就设置auto_env 按钮的状态
startAutoEnv();
});
//获取所有的UI参数
ui.logd("获取所有的UI参数:" + ui.getConfigJSON());
//设置值的用法,这里先注释掉
// ui.setViewValue(ui.name, "我是设置的");
// ui.setViewValue(ui.auto_env, false);
// ui.setViewValue(ui.sex, "男生|女生");
// ui.setViewValue(ui.three, true);
// ui.setViewValue(ui.dance, false)
//内存临时存储变量和数据
ui.putShareData("nameVar", ui.name);
ui.putShareData("value", "我是value");


}

function startAutoEnv() {
ui.startEnvAsync(function (r) {
ui.logd("启动环境结果: " + r);
ui.auto_env.setChecked(r);
});
}

main();

脚本如何与JS交互

  • 以下代码是在js/main.js中运行的

function main() {
//脚本获取UI中的对象,肯定是要先有界面才行
//这里可以直接引用UI对象
//假设在xml中,我们配置一个一个tag=name 的输入框,EditText
//获取UI模块设置的变量和数据
logd(ui.getShareData("nameVar"))
logd(ui.getShareData("value"))


//第一种方式,变量引用
//重置JS变量
ui.resetUIVar()
//打印一下UI中的name变量
logd("ui.name " + ui.name)
if (ui.name) {
//UI主线程中处理
getHandler().post(function () {
ui.name.setText("Fsdafsadfsa")
ui.logd("输入框内容为 : " + ui.name.getEditableText());
});

}
sleep(2000);
//第二种方式, findViewByTag
var name = ui.findViewByTag("name");
if (name) {
//UI主线程中处理
getHandler().post(function () {
name.setText("懵逼了")
ui.logd("输入框内容为 : " + name.getEditableText());
});

}


sleep(5000);

}

main();

消息类

消息函数 toast

  • 显示Toast信息
  • @param msg 信息
function main() {
ui.toast("我是JS控制的UI");
}

main();

日志函数 logd

  • 调试日志打印
  • @param msg 打印的消息
function main() {
ui.logd("我是消息");
}

main();

布局UI类

设置布局 layout

  • 创建一个布局并设置到当前的页面中
  • @param name tab标签的名称
  • @param content 可以是layout文件夹中的文件名称,也可以直接是xml文件的内容
  • @return 布尔型 true代表成功, false代表失败
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
ui.logd("参数说明创建结果: " + u1);
ui.logd("其他说明创建结果: " + u2);
}

main();

解析布局 parseView

  • 解析布局并返回
  • @param content 可以是layout文件夹中的文件名称,也可以直接是xml文件的内容
  • @return View android的View对象,解析有问题就是null
function main() {
// xml文件在layout文件夹下
var u1 = ui.parseView("main.xml");
ui.logd("创建结果: " + u1);
}

main();

查找视图 resetUIVar

  • 将所有的tag转换成UI的属性直接调用
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
ui.resetUIVar();
}

main();

查找视图 findViewByTag

  • 通过tag查找到一个视图
  • @param tag 标签值
  • @return View android原生的View对象
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
//查找tag=name的视图
var nameView = ui.findViewByTag("name");
ui.logd("name view is:" + nameView);
}

main();

保存数据到存储区 putShareData

  • 存储数据到存储区中,脚本可以使用,可用于存储变量和数据
  • @param key 键
  • @param value 值
  • @return 布尔型 true成功 false失败
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
//保存到存储区
ui.putShareData("name", "我是临时数据");
}

main();

从存储区读取数据 getShareData

  • 从存储区获取在UI模块存储的数据
  • @param key 键
  • @return 存储的数据
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
//从存储区读取数据
var d = ui.getShareData("name");
logd("d =" + d)
}

main();

从存储区清空数据 clearAllShareData

  • 清理所有存储区的数据
  • @return true 或者 false
function main() {
ui.clearAllShareData();
}

main();

设置事件 setEvent

  • 设置事件
  • @param view 要设置事件的视图,可以是事件的tag值
  • @param eventType 时间类型: click:点击,checkedChange:单选和多选按钮的选中状态改变事件,itemClick:列表的项目点击,itemSelected:列表的项目选中
  • @param eventCallback 事件回调函数
  • @return 布尔型 true代表设置成功, false代表设置失败
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
//下拉选择框的事件
ui.setEvent(ui.sex, "itemSelected", function (position, value) {
ui.logd("tag为 sex itemSelected " + value);
});
ui.setEvent(ui.dance, "checkedChange", function (view, isChecked) {
ui.logd("tag为 dance isChecked " + isChecked);
});
ui.setEvent(ui.startBtn, "click", function (view) {
ui.start();
});

}

main();

获取根视图 getRootView

  • 取得当前的根视图对象,因为有可能是多标签的页面,返回的有可能是个集合
  • @return View 对象列表
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
//下拉选择框的事件
var views = ui.getRootView();
ui.logd("views " + views)
for (var i = 0; i < views.length; i++) {
var value = views[i];
ui.logd("view-" + value)
}
}

main();

设置视图值 setViewValue

  • 设置视图的值
  • @param tagOrView 视图的tag或者视图对象
  • @param value 值,字符串或者是布尔型
  • @return 布尔型 true代表成功 false代表失败
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
//ui.name 是值xml中tag=name的视图对象
ui.setViewValue(ui.name, "我是设置的名称")

}

main();

获取视图值 getViewValue

  • 取得视图的值
  • @param tagOrView 视图的tag或者视图对象
  • @return 字符串或者布尔型
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");
//ui.name 是值xml中tag=name的视图对象
ui.setViewValue(ui.name, "我是设置的名称");
var v = ui.getViewValue(ui.name);

ui.logd("获取name的值为: " + v);

}

main();

取得UI配置值 getConfigJSON

  • 取得所有UI配置
  • @return JSON字符串
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");

ui.setViewValue(ui.name, "我是name");
//保存所有的值
ui.saveAllConfig();

var data = ui.getConfigJSON();
ui.logd("data " + data);

data = JSON.parse(data);
//打印name的值,如果没有值要先保存一下
ui.logd(data.name);


}

main();

取得单个UI值 getConfig

  • 取得单个UI配置项
  • @param key 配置的key
  • @return 字符串
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");

ui.setViewValue(ui.name, "我是name");
//保存所有的值
ui.saveAllConfig();

//单独保存某些值
ui.saveConfig("sex", "女同学");
ui.saveConfig("music", true);

var data = ui.getConfigJSON();
ui.logd("data " + data);

data = JSON.parse(data);
//打印name的值,如果没有值要先保存一下
ui.logd(data.name);
//获取单个值
ui.logd(ui.getConfig("name"));
}

main();

保存所有UI值 saveAllConfig

  • 根据设置的tag,保存所有配置
  • @return 布尔型 true 保存成功,false 保存失败
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");

ui.setViewValue(ui.name, "我是name");
//保存所有的值
ui.saveAllConfig();

//单独保存某些值
ui.saveConfig("sex", "女同学");
ui.saveConfig("music", true);

var data = ui.getConfigJSON();
ui.logd("data " + data);

data = JSON.parse(data);
//打印name的值,如果没有值要先保存一下
ui.logd(data.name);
}

main();

保存单个UI值 saveConfig

  • 保存UI参数值
  • @param key UI的key
  • @param value UI的值
  • @return 布尔型 true代表成功 false代表失败
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");

ui.setViewValue(ui.name, "我是name");
//保存所有的值
ui.saveAllConfig();

//单独保存某些值
ui.saveConfig("sex", "女同学");
ui.saveConfig("music", true);

var data = ui.getConfigJSON();
ui.logd("data " + data);

data = JSON.parse(data);
//打印name的值,如果没有值要先保存一下
ui.logd(data.name);
}

main();

移出所有配置选项 removeAllUIConfig

  • 移出所有配置选项
  • @return 布尔型 true代表成功 false代表失败
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");

ui.setViewValue(ui.name, "我是name");
//移出所有配置选项
ui.removeAllUIConfig();

//单独保存某些值
ui.saveConfig("sex", "女同学");
ui.saveConfig("music", true);

var data = ui.getConfigJSON();
ui.logd("data " + data);

data = JSON.parse(data);
//打印name的值,如果没有值要先保存一下
ui.logd(data.name);
}

main();

读取图像资源 resResAsDrawable

  • 读取IEC包中的res文件夹某个文件资源,并变成android的Drawable对象返回
  • @param path res文件夹中的资源文件路径
  • @return Drawable 图像对象或者null
function main() {
// xml文件在layout文件夹下
var u1 = ui.layout("参数说明", "main.xml");
var u2 = ui.layout("其他说明", "main2.xml");

//checkbox.png 存放在res文件夹下
var bg = ui.resResAsDrawable("checkbox.png");
//设置动态背景色
ui.music.setBackgroundDrawable(bg);
//设置按钮的背景
ui.music.setButtonDrawable(bg);

}

main();

对话框

alert

  • alert,弹窗
  • @param map 例如 {"title":""} ,key的固定只有
  • title 标题
  • msg: 消息
  • cancelText: 取消按钮文字
  • okText: 确定按钮文字
  • cancelable: 是否可取消
  • @param okBtnCallback 点击确认按钮的回调
  • @param cancelBtnCallback 点击取消按钮的回调
  • @param dismissListener 对话框消失的回调
  • @return 布尔型 true 代表成功,false 代表失败

function main() {
var p = {
"title": "沙雕确认",
"msg": "你是沙雕吗?",
"cancelable": true,
"cancelText": "不是",
"okText": "我是"
};
ui.alert(p,
function (dialog, v) {
logd("ok btn click : ")
//让对话消失掉
dialog.doDismiss();
return true;
},
function (dialog, v) {
logd("cancel btn click ")
//让对话消失掉
dialog.doDismiss();
return true;
},
function () {
logd("mission btn click ")
return true;
});

}

main();

inputDialog

  • inputDialog 输入框弹窗
  • @param map 例如 {"title":""},key的固定只有
  • title 标题
  • msg: 消息
  • cancelText: 取消按钮文字
  • okText: 确定按钮文字
  • cancelable: 是否可取消
  • @param okBtnCallback 点击确认按钮的回调
  • @param cancelBtnCallback 点击取消按钮的回调
  • @param dismissListener 对话框消失的回调
  • @return 布尔型 true 代表成功,false 代表失败

function main() {
var p = {
"title": "沙雕确认",
"msg": "你是沙雕吗?",
"cancelable": true,
"cancelText": "不是",
"okText": "我是"
};
ui.inputDialog(p,
function (dialog, v, text) {
//text 是输入的文字
logd("ok btn click : " + text)
//让对话消失掉
dialog.doDismiss();
return true;
},
function (dialog, v, text) {
logd("cancel btn click " + text)
//让对话消失掉
dialog.doDismiss();
return true;
},
function () {
logd("mission btn click ")
return true;
});

}

main();

customDialog

  • 自定义对话框
  • @param params 例如 {"cancelable":""},key的固定只有
  • fullScreen 是否全屏
  • cancelable: 是否可取消
  • @param view 原生的视图
  • @param onViewBind 视图绑定时候回调函数
  • @param dismissListener 对话框消失的回调
  • @return 布尔型 true 代表成功,false 代表失败

function main() {
//用安卓原生的控件
importPackage(android.widget)
var textView = new TextView(ui.getContext());
textView.setText("sdfasfsad");
// 使用xml解析出来的控件
var textView = ui.parseView("main2.xml");
ui.customDialog({
"fullScreen": true,
"cancelable": true
},
textView,
function (dialog, v) {
//这里面可以拿到视图对象,然后进行设置各种事件
}, function () {
logd("dsssss")
})

}

main();

浮窗类

浮窗权限 hasFloatViewPermission

  • 是否有浮窗权限
  • @return 布尔型 true代表有权限 false代表无权限

function main() {
var r = ui.hasFloatViewPermission();
if (!r) {
var req = ui.requestFloatViewPermission(10000);
ui.logd("申请浮窗权限: " + req);
}
r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限: " + r);

}

main();

请求浮窗权限 requestFloatViewPermissionAsync

  • 异步请求浮窗权限
  • @param timeout 超时时间
  • @param callback 回调函数
  • @return 布尔型 true代表有权限 false代表无权限
function main() {
var r = ui.hasFloatViewPermission();
if (!r) {
ui.requestFloatViewPermissionAsync(20000, function (r) {
ui.logd("申请浮窗权限: " + r);
});

}
r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限: " + r);

}

main();

展示控制浮窗 showCtrlWindow

  • 展示控制浮窗
  • @return 布尔型 true代表成功,false代表失败
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限:" + r)
if (!r) {
return
}
//展示浮窗
ui.showCtrlWindow();
ui.logd("显示消息")
//3秒后在UI线程消失掉
ui.getHandler().postDelayed(function () {
ui.closeCtrlWindow();
}, 3000);
}

main();

关闭控制浮窗 closeCtrlWindow

  • 关闭控制浮窗
  • @return 布尔型 true代表成功,false代表失败
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限:" + r)
if (!r) {
return
}
//展示浮窗
ui.showCtrlWindow();
ui.logd("显示消息")
//3秒后在UI线程消失掉
ui.getHandler().postDelayed(function () {
ui.closeCtrlWindow();
}, 3000);
}

main();

启停浮窗新增按钮 addCtrlView

  • 新增启停浮窗按钮
  • 适用版本(EC 6.0.0+)
  • @param tag 按钮的标签
  • @param icon 按钮的图标路径,工程中的res/文件下的图片,例如填写 res/a.png
  • @param width 按钮的宽度,单位是dp,系统按钮是36
  • @param height 按钮的高度,单位是dp,系统按钮是36
  • @param index 按钮的加入索引,-1代表往后添加,0代表的是加入到第一位
  • @param onClickListener 按钮的点击回调
  • @return 布尔型 true代表成功,false代表失败
  function main() {
ui.toast("我是ui的Toast函数");
var set = ui.layout("参数设置", "main.xml");
ui.layout("其他说明", "main2.xml");
ui.logd("设置UI结果: " + set);
ui.showCtrlWindow()
// 这里最好用延时,因为showCtrlWindow是异步的,防止没效果
ui.run(1000, function () {
//移出对应的视图
//关闭悬浮框按钮
ui.removeCtrlView("log_close_ctrl")
//回主页按钮
ui.removeCtrlView("main_page_ctrl")
//脚本启停按钮
ui.removeCtrlView("script_status_ctrl")
//日志框按钮
ui.removeCtrlView("log_window_ctrl")
//退出脚本按钮
ui.removeCtrlView("system_power_ctrl")
//加入新的按钮
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
//启动脚本
ui.start();
})
})
ui.run(3000, function () {
//移出所有控制视图
ui.removeAllCtrlView()
})
ui.run(5000, function () {
//重置
ui.resetDefaultCtrlView()
})
}

main();

启停浮窗更新按钮 updateCtrlView

  • 更新启停浮窗按钮
  • 适用版本(EC 6.6.0+)
  • @param tag 按钮的标签
  • @param icon 按钮的图标路径,工程中的res/文件下的图片,例如填写 res/a.png
  • @param onClickListener 按钮的点击回调
  • @return 布尔型 true代表成功,false代表失败
function main() {
ui.toast("我是ui的Toast函数");
var set = ui.layout("参数设置", "main.xml");
ui.layout("其他说明", "main2.xml");
ui.logd("设置UI结果: " + set);
ui.showCtrlWindow()
// 这里最好用延时,因为showCtrlWindow是异步的,防止没效果
ui.run(1000, function () {
//移出对应的视图
//关闭悬浮框按钮
ui.removeCtrlView("log_close_ctrl")
//回主页按钮
ui.removeCtrlView("main_page_ctrl")
//脚本启停按钮
ui.removeCtrlView("script_status_ctrl")
//日志框按钮
ui.removeCtrlView("log_window_ctrl")
//退出脚本按钮
ui.removeCtrlView("system_power_ctrl")
//加入新的按钮
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
//启动脚本
ui.start();
})
})
ui.run(3000, function () {
//更新按钮动作
ui.updateCtrlView("tag", "res/ab.png", function (v) {
logd("aaaa");

})
})

}

main();

删除启停浮窗按钮 removeCtrlView

  • 删除启停浮窗按钮
  • 适用版本(EC 6.0.0+)
  • @param tag 按钮的标签
  • @return 布尔型 true代表成功,false代表失败
  function main() {
ui.toast("我是ui的Toast函数");
var set = ui.layout("参数设置", "main.xml");
ui.layout("其他说明", "main2.xml");
ui.logd("设置UI结果: " + set);
ui.showCtrlWindow()
// 这里最好用延时,因为showCtrlWindow是异步的,防止没效果
ui.run(1000, function () {
//移出对应的视图
//关闭悬浮框按钮
ui.removeCtrlView("log_close_ctrl")
//回主页按钮
ui.removeCtrlView("main_page_ctrl")
//脚本启停按钮
ui.removeCtrlView("script_status_ctrl")
//日志框按钮
ui.removeCtrlView("log_window_ctrl")
//退出脚本按钮
ui.removeCtrlView("system_power_ctrl")
//加入新的按钮
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
//启动脚本
ui.start();
})
})
ui.run(3000, function () {
//移出所有控制视图
ui.removeAllCtrlView()
})
ui.run(5000, function () {
//重置
ui.resetDefaultCtrlView()
})
}

main();

删除所有启停浮窗按钮 removeAllCtrlView

  • 删除所有启停浮窗按钮
  • 适用版本(EC 6.0.0+)
  • @return 布尔型 true代表成功,false代表失败
  function main() {
ui.toast("我是ui的Toast函数");
var set = ui.layout("参数设置", "main.xml");
ui.layout("其他说明", "main2.xml");
ui.logd("设置UI结果: " + set);
ui.showCtrlWindow()
// 这里最好用延时,因为showCtrlWindow是异步的,防止没效果
ui.run(1000, function () {
//移出对应的视图
//关闭悬浮框按钮
ui.removeCtrlView("log_close_ctrl")
//回主页按钮
ui.removeCtrlView("main_page_ctrl")
//脚本启停按钮
ui.removeCtrlView("script_status_ctrl")
//日志框按钮
ui.removeCtrlView("log_window_ctrl")
//退出脚本按钮
ui.removeCtrlView("system_power_ctrl")
//加入新的按钮
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
//启动脚本
ui.start();
})
})
ui.run(3000, function () {
//移出所有控制视图
ui.removeAllCtrlView()
})
ui.run(5000, function () {
//重置
ui.resetDefaultCtrlView()
})
}

main();

重置启停浮窗按钮 resetDefaultCtrlView

  • 重置启停浮窗按钮
  • 适用版本(EC 6.0.0+)
  • @return 布尔型 true代表成功,false代表失败
  function main() {
ui.toast("我是ui的Toast函数");
var set = ui.layout("参数设置", "main.xml");
ui.layout("其他说明", "main2.xml");
ui.logd("设置UI结果: " + set);
ui.showCtrlWindow()
// 这里最好用延时,因为showCtrlWindow是异步的,防止没效果
ui.run(1000, function () {
//移出对应的视图
//关闭悬浮框按钮
ui.removeCtrlView("log_close_ctrl")
//回主页按钮
ui.removeCtrlView("main_page_ctrl")
//脚本启停按钮
ui.removeCtrlView("script_status_ctrl")
//日志框按钮
ui.removeCtrlView("log_window_ctrl")
//退出脚本按钮
ui.removeCtrlView("system_power_ctrl")
//加入新的按钮
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
//启动脚本
ui.start();
})
})
ui.run(3000, function () {
//移出所有控制视图
ui.removeAllCtrlView()
})
ui.run(5000, function () {
//重置
ui.resetDefaultCtrlView()
})
}

main();

展示日志浮窗 showLogWindow

  • 显示日志浮窗
  • @return 布尔型 true代表成功,false代表失败
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限:" + r)
if (!r) {
return
}
//展示浮窗
ui.showLogWindow();
ui.logd("显示消息")
//3秒后在UI线程消失掉
ui.getHandler().postDelayed(function () {
ui.closeLogWindow();
}, 3000);
}

main();

关闭日志浮窗 closeLogWindow

  • 关闭日志浮窗
  • @return 布尔型 true代表成功,false代表失败
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限:" + r)
if (!r) {
return
}
//展示浮窗
ui.showLogWindow();
ui.logd("显示消息")
//3秒后在UI线程消失掉
ui.getHandler().postDelayed(function () {
ui.closeLogWindow();
}, 3000);
}

main();

显示脚本暂停控制悬浮窗 showScriptCtrlFloatView

  • 显示脚本暂停控制悬浮窗
  • 适配EC 10.0.0+
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限:" + r)
if (!r) {
return
}
//展示浮窗
ui.showScriptCtrlFloatView();
//3秒后在UI线程消失掉
ui.getHandler().postDelayed(function () {
ui.closeScriptCtrlFloatView();
}, 3000);
}

main();

关闭脚本暂停控制悬浮窗 closeScriptCtrlFloatView

  • 关闭脚本暂停控制悬浮窗
  • 适配EC 10.0.0+
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("是否有浮窗权限:" + r)
if (!r) {
return
}
//展示浮窗
ui.showScriptCtrlFloatView();
//3秒后在UI线程消失掉
ui.getHandler().postDelayed(function () {
ui.closeScriptCtrlFloatView();
}, 3000);
}

main();

脚本启动

是否是无障碍模式 isAccMode

  • 是否是无障碍运行模式
  • @return 布尔型 true 是 false 否
function main() {
ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());

// 设置运行模式
ui.setRunningMode(1);

ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());
}

main();

是否是代理模式 isAgentMode

  • 是否是代理运行模式
  • @return 布尔型 true 是 false 否
function main() {
ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());

// 设置运行模式
ui.setRunningMode(1);

ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());
}

main();

自动化服务是否正常 isServiceOk

  • 自动化服务是否正常
  • @return 布尔型 true 是 false 否
function main() {
ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());

// 设置运行模式
ui.setRunningMode(1);

ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());


var ok = ui.isServiceOk();
if (!ok) {
ui.startEnvAsync(function (r) {
ui.logd("启动环境结果: " + r);

});
}
}

main();

设置运行模式 setRunningMode

  • 设置运行模式
  • @param mode 1 代表是代理模式 2 代表无障碍模式
  • @return 布尔型 true 是 false 否
function main() {
ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());

// 设置运行模式
ui.setRunningMode(1);

ui.logd("无障碍模式: " + ui.isAccMode());
ui.logd("代理模式: " + ui.isAgentMode());
}

main();

异步启动自动化环境 startEnvAsync

  • 启动环境
  • @return 布尔型 true代表启动成功,false代表启动失败
function main() {
var ok = ui.isServiceOk();
if (!ok) {
ui.startEnvAsync(function (r) {
ui.logd("启动环境结果: " + r);
});
}
}

main();

启动脚本 start

  • 启动脚本
  • @return 布尔型 true代表启动成功,false代表启动失败
function main() {
ui.layout("参数设置", "main.xml");
//xml中有个tag=startBtn的按钮
//启动脚本按钮
ui.setEvent(ui.startBtn, "click", function (view) {
ui.start();
});
}

main();

停止脚本 stopTask

  • 停止脚本
  • @return 布尔型 true代表启动成功,false代表启动失败
function main() {
ui.layout("参数设置", "main.xml");
//xml中有个tag=stopBtn的按钮
//启动脚本按钮
ui.setEvent(ui.stopBtn, "click", function (view) {
ui.stopTask();
});
}

main();

设置脚本暂停或者继续 setScriptPause

  • 设置脚本暂停或者继续
  • 适配 EC 10.0.0+
  • @param pause true 代表暂停脚本,false代表继续
  • @param timeout 自动恢复时间单位毫秒,0 代表不自动恢复,等待外部交互后恢复,大于0代表到了时间自动恢复运行
  • @return {boolean} true 代表脚本处于暂停中,false 代表继续运行中
function main() {
ui.layout("参数设置", "main.xml");
//xml中有个tag=stopBtn的按钮
//启动脚本按钮
ui.setEvent(ui.cbtn, "click", function (view) {
ui.setScriptPause(true,0);
});
}

main();

脚本是否处于暂停中 isScriptPause

  • 脚本是否处于暂停中
  • 适配 EC 10.0.0+
  • @return {boolean} true 代表脚本处于暂停中
function main() {
ui.layout("参数设置", "main.xml");
//启动脚本按钮
ui.setEvent(ui.cBtn, "click", function (view) {
// 如果是暂停 点下就是继续,如果是继续 点下就是暂停
// 这里是演示
ui.setScriptPause(!ui.isScriptPause(),0);
});
}

main();

脚本是否运行 isScriptRunning

  • 脚本是否运行
  • @return 布尔型 true代表启动成功,false代表启动失败
function main() {
ui.layout("参数设置", "main.xml");
//xml中有个tag=startBtn的按钮
logd("运行状态 -{}", ui.isScriptRunning())
}

main();

定时任务

开启定时任务 startJob

  • 开启一个定时脚本任务
  • @param tag 任务的唯一标示,不能为空,脚本中可以使用readConfigString("jobTaskTag")获取当前tag值,判断是那个任务过来执行的
  • @param execTime 定时时间格式: 2020-04-17 19:20:00,或者直接是秒数字,例如 3,代表3秒后
  • @param cancelBeforeRunning
  • @return 整型 jobid
function main() {
var set = ui.layout("参数设置", "main.xml");
//按照日志定时的任务
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("按照日志定时的任务:" + jobid)

//按照多少秒执行
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("按照多少秒执行:" + jobid2)

var tags = ui.getAllJobTag();
ui.logd("定时任务的标签:" + tags)

//取消任务
ui.cancelAllJob();
//按照标签取消任务
ui.cancelJob("job2");
}

main();

取消定时任务 cancelJob

  • 取消指定标签的任务
  • @param tag 标签
  • @return 布尔型 true代表成功,false代表失败
function main() {
var set = ui.layout("参数设置", "main.xml");
//按照日志定时的任务
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("按照日志定时的任务:" + jobid)

//按照多少秒执行
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("按照多少秒执行:" + jobid2)

var tags = ui.getAllJobTag();
ui.logd("定时任务的标签:" + tags)

//取消任务
ui.cancelAllJob();
//按照标签取消任务
ui.cancelJob("job2");
}

main();

取消所有定时任务 cancelAllJob

  • 取消所有的定时任务
  • @return 布尔型 true代表成功,false代表失败
function main() {
var set = ui.layout("参数设置", "main.xml");
//按照日志定时的任务
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("按照日志定时的任务:" + jobid)

//按照多少秒执行
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("按照多少秒执行:" + jobid2)

var tags = ui.getAllJobTag();
ui.logd("定时任务的标签:" + tags)

//取消任务
ui.cancelAllJob();
//按照标签取消任务
ui.cancelJob("job2");
}

main();

所有定时任务标签 getAllJobTag

  • 获取所有定时任务TAG
  • @return JSON字符串
function main() {
var set = ui.layout("参数设置", "main.xml");
//按照日志定时的任务
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("按照日志定时的任务:" + jobid)

//按照多少秒执行
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("按照多少秒执行:" + jobid2)

var tags = ui.getAllJobTag();
ui.logd("定时任务的标签:" + tags)

//取消任务
ui.cancelAllJob();
//按照标签取消任务
ui.cancelJob("job2");
}

main();

其他扩展

setWebViewType 切换webview内核函数

  • 适用版本(EC 5.16.0+)
  • 设置加载网页的webview组件组件类型,默认是X5浏览器
  • @param type 1:系统自带的webview, 2:X5浏览器
  • @return 布尔型 true 代表成功,false 代表失败
// ui.js中的注入
function main() {
ui.setWebViewType(2)
ui.layout("main", "main.html");
}

main();

registeH5Function 向H5注入扩展函数

  • 向网页中注入一个JS函数,H5可以调用该函数,以实现脚本和HTML的互通扩展
  • @param funcName 注入的函数名称
  • @param callback 回调 常见例子
  • @return 布尔型 true 代表成功,false 代表失败
// ui.js中的注入
function main() {
//UI中进行注入新的扩展
ui.registeH5Function("customFunction", function (data) {
logd("h5 call-" + data);
//返回给网页的数据
return new Date().toString()
})
ui.layout("main", "main.html");
}

main();

网页中的调用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button onclick="test()">测试扩展函数</button>
<script>
function test() {
//调用ui.js注入进来的扩展
let d = window.ec.call('customFunction', JSON.stringify({'action': 'android.settings.SETTINGS'}));
console.log("ddd " + d)
}
</script>
</body>
</html>

unregisteH5Function 取消向网页中注入一个JS函数

  • 取消向网页中注入一个JS函数
  • @param funcName 注入的函数名称
  • @return 布尔型 true 代表成功,false 代表失败
// ui.js中的注入
function main() {
//UI中进行注入新的扩展
ui.registeH5Function("customFunction", function (data) {
logd("h5 call-" + data);
})
ui.layout("main", "main.html");

ui.unregisteH5Function("customFunction");

}

main();

onActivityEvent 监听Activity 状态

  • 监听UI所在的activity事件
  • @param eventType 事件类型,分别为:onResume:Activity恢复时, onPause: Activity暂停时, onStop:Activity停止时, onDestroy:Activity销毁时,onActivityResult: 跳转到启动地方返回时候,
  • @param callback 回调函数
function main() {
//监听Activity的事件设置
ui.onActivityEvent("onResume", function (eventType) {
// 可以在这里判断服务是否正常
ui.logd("activity onResume " + ui.isServiceOk());
});

ui.onActivityEvent("onPause", function (eventType) {
ui.logd("activity onPause");
});

ui.onActivityEvent("onStop", function (eventType) {
ui.logd("activity onStop");
});
ui.onActivityEvent("onDestroy", function (eventType) {
ui.logd("activity onDestroy");
});


// 参数请看Android的
// protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 函数
ui.onActivityEvent("onActivityResult", function (requestCode, resultCode, data) {
ui.logd("activity onDestroy");
});
}

main();

getActivity UI对应的Activity

  • 取得当前的activity对象
  • @return Activity 对象或者null
function main() {
var activity = ui.getActivity();
ui.logd("activity " + activity);
//android context对象也是自带的
importPackage(android.widget);
importPackage(android.graphics);
//直接使用java对象
var tv = new android.widget.TextView(context);
tv.setText("我是js和java交互的文本对象");
tv.setTextColor(Color.parseColor("#888888"))
activity.setContentView(tv);
}

main();

getHandler 原生的Handler

  • 取得当前的Handler对象
  • @return Handler 对象或者null
function main() {
//展示浮窗
ui.showLogWindow();
ui.logd("显示消息")
//3秒后在UI线程消失掉
ui.getHandler().postDelayed(function () {
ui.closeLogWindow();
}, 3000);
}

main();

run UI线程异步任务

  • 在主线程进行运行函数,相当于 getHandler.post
  • @param delayTime 延迟时间,单位毫秒,如果是0就是理解执行
  • @param callback 回调
function main() {
ui.run(30, function () {
logd("Fsdfsd");
})
sleep(1000)
}

main();

setECSystemConfig 设置EC的系统参数

  • 设置EC的系统参数
  • @param params map形式例如 {"running_mode":"无障碍"}
{
"running_mode":"无障碍",
"auto_start_service":"是",
"volume_start_tc":"否",
"log_float_window":"否",
"ctrl_float_window":"否",
"service_start_run_script":"否"
}
  • 参数解释有:
  • running_mode : 值有 无障碍,代理两种
  • auto_start_service : 开机启动服务 值有 是,否 两种
  • log_float_window : 日志悬浮窗展示 值有 是,否 两种
  • ctrl_float_window : 启停控制悬浮窗展示 值有 是,否 两种
  • service_start_run_script : 服务被重启后自动重新运行 值有 是,否 两种
  • home_key_start_stop : 三击HOME启停脚本 值有 是,否 两种
  • @return 布尔型 true 是 false 否
function main() {
var m = {
"running_mode": "无障碍",
"auto_start_service": "是",
"log_float_window": "否",
"ctrl_float_window": "否"
};
ui.setECSystemConfig(m);
}

main();

openECSystemSetting 打开EC系统设置

  • 打开EC的系统设置
  • @return 布尔型 true代表成功 false代表失败
function main() {

ui.openECSystemSetting();
}

main();

openActivity 打开其他应用程序

  • 打开一个activity,通过map参数
  • @param map 例如 {"action":""},key的固定只有
  • action,
  • uri,pkg,className,flag,其他的都是参数了
  • @return 布尔型 true 代表成功,false 代表失败
function main() {
//打开安装包界面
var m = {
"action": "android.intent.action.VIEW",
"uri": "file:///sdcard/a.apk",
"type": "application/vnd.android.package-archive"
};
var x = ui.openActivity(m);
ui.logd("x " + x);

var map = {
"uri": "xx://xx/live/6701887916223941379",
};
ui.openActivity(map);
}

main();