diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 09d75975d..f3393090e 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index d7af1f9ac..7612b414f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.autojs.autojs" minSdkVersion 17 targetSdkVersion 23 - versionCode 400 - versionName "4.0.0 Alpha" + versionCode 401 + versionName "4.0.0 Alpha1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/app/src/main/assets/docs/all.html b/app/src/main/assets/docs/all.html index cd139783c..ff284e873 100644 --- a/app/src/main/assets/docs/all.html +++ b/app/src/main/assets/docs/all.html @@ -210,6 +210,22 @@

目录

  • dialogs.select(title, items, callback)
  • dialogs.singleChoice(title, items[, index, callback])
  • dialogs.multiChoice(title, items[, indices, callback])
  • +
  • dialogs.build(properties)
  • + + +
  • Dialog
  • Engines
  • +
  • colors.BLACK
  • +
  • colors.DKGRAY
  • +
  • colors.GRAY
  • +
  • colors.LTGRAY
  • +
  • colors.WHITE
  • +
  • colors.RED
  • +
  • colors.GREEN
  • +
  • colors.BLUE
  • +
  • colors.YELLOW
  • +
  • colors.CYAN
  • +
  • colors.MAGENTA
  • +
  • colors.TRANSPARENT
  • Images

    显示一个多选列表对话框,等待用户选择,返回用户选择的选项索引的数组。如果用户取消了选择,返回[]

    -

    在ui模式下该函数返回一个Promise。 -

    +

    在ui模式下该函数返回一个Promise

    +

    dialogs.build(properties)#

    +
    +

    创建一个可自定义的对话框,例如:

    +
    dialogs.build({
    +    //对话框标题
    +    title: "发现新版本",
    +    //对话框内容
    +    content: "更新日志: 新增了若干了BUG",
    +    //确定键内容
    +    positive: "下载",
    +    //取消键内容
    +    negative: "取消",
    +    //中性键内容
    +    neutral: "到浏览器下载",
    +    //勾选框内容
    +    checkBoxPrompt: "不再提示"
    +}).on("positive", ()=>{
    +    //监听确定键
    +    toast("开始下载....");
    +}).on("neutral", ()=>{
    +    //监听中性键
    +    app.openUrl("https://www.autojs.org");
    +}).on("check", (checked)=>{
    +    //监听勾选框
    +    log(checked);
    +}).show();
    +

    选项properties可供配置的项目为:

    + +

    通过这些选项可以自定义一个对话框,并通过监听返回的Dialog对象的按键、输入事件来实现交互。下面是一些例子。

    +

    模拟alert对话框:

    +
    dialogs.build({
    +    title: "你好",
    +    content: "今天也要元气满满哦",
    +    positive: "好的"
    +}).show();
    +

    模拟confirm对话框:

    +
    dialogs.build({
    +    title: "你好",
    +    content: "请问你是笨蛋吗?",
    +    positive: "是的",
    +    negative: "我是大笨蛋"
    +}).on("positive", ()=>{
    +    alert("哈哈哈笨蛋");
    +}).on("negative", ()=>{
    +    alert("哈哈哈大笨蛋");
    +}).show();
    +

    模拟单选框:

    +
    dialogs.build({
    +    title: "单选",
    +    items: ["选项1", "选项2", "选项3", "选项4"],
    +    itemsSelectMode: "singleChoice",
    +    itemsSelectedIndex: 3
    +}).on("item_select", (index, item)->{
    +    toast("您选择的是" + item);
    +}).show();
    +

    "处理中"对话框:

    +
    var d = dialogs.build({
    +    title: "下载中...",
    +    progress: {
    +        max: -1
    +    },
    +    cancelable: false
    +}).show();
    +
    +setTimeout(()=>{
    +    d.dismiss();
    +}, 3000);
    +

    输入对话框:

    +
    dialogs.build({
    +    title: "请输入您的年龄",
    +    inputPrefill: "18"
    +}).on("input", (input)=>{
    +    var age = parseInt(input);
    +    toastLog(age);
    +}).show();
    +

    使用这个函数来构造对话框,一个明显的不同是需要使用回调函数而不能像dialogs其他函数一样同步地返回结果;但也可以通过threads模块的方法来实现。例如显示一个输入框并获取输入结果为:

    +
    var input = threads.disposable();
    +dialogas.build({
    +    title: "请输入您的年龄",
    +    inputPrefill: "18"
    +}).on("input", text => {
    +    input.setAndNotify(text);
    +}).show();
    +var age = parseInt(input.blockedGet());
    +tosatLog(age);
    +

    Dialog#

    +

    dialogs.build()返回的对话框对象,内置一些事件用于响应用户的交互,也可以获取对话框的状态和信息。

    +

    事件: show#

    +
    +

    对话框显示时会触发的事件。例如:

    +
    dialogs.build({
    +    title: "标题"
    +}).on("show", (dialog)=>{
    +    toast("对话框显示了");
    +}).show();
    +

    事件: cancel#

    +
    +

    对话框被取消时会触发的事件。一个对话框可能按取消按钮、返回键取消或者点击对话框以外区域取消。例如:

    +
    dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("cancel", (dialog)=>{
    +    toast("对话框取消了");
    +}).show();
    +

    事件: dismiss#

    +
    +

    对话框消失时会触发的事件。对话框被取消或者手动调用dialog.dismiss()函数都会触发该事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("dismiss", (dialog)=>{
    +    toast("对话框消失了");
    +}).show();
    +
    +setTimeout(()=>{
    +    d.dismiss();
    +}, 5000);
    +

    事件: positive#

    +
    +

    确定按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("positive", (dialog)=>{
    +    toast("你点击了确定");
    +}).show();
    +

    事件: negative#

    +
    +

    取消按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("negative", (dialog)=>{
    +    toast("你点击了取消");
    +}).show();
    +

    事件: neutral#

    +
    +

    中性按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消",
    +    neutral: "稍后提示"
    +}).on("positive", (dialog)=>{
    +    toast("你点击了稍后提示");
    +}).show();
    +

    事件: any#

    +
    +

    任意按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消",
    +    neutral: "稍后提示"
    +}).on("any", (action, dialog)=>{
    +    if(action == "positive"){
    +        toast("你点击了确定");
    +    }else if(action == "negative"){
    +        toast("你点击了取消");
    +    }
    +}).show();
    +

    事件: item_select#

    +
    +

    对话框列表(itemsSelectMode为"select")的项目被点击选中时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "请选择",
    +    positive: "确定",
    +    negative: "取消",
    +    items: ["A", "B", "C", "D"],
    +    itemsSelectMode: "select"
    +}).on("item_select", (index, item, dialog)=>{
    +    toast("您选择的是第" + (index + 1) + "项, 选项为" + item);
    +}).show();
    +

    事件: single_choice#

    +
    +

    对话框单选列表(itemsSelectMode为"singleChoice")的项目被选中并点击确定时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "请选择",
    +    positive: "确定",
    +    negative: "取消",
    +    items: ["A", "B", "C", "D"],
    +    itemsSelectMode: "singleChoice"
    +}).on("item_select", (index, item, dialog)=>{
    +    toast("您选择的是第" + (index + 1) + "项, 选项为" + item);
    +}).show();
    +

    事件: multi_choice#

    +
    +

    对话框多选列表(itemsSelectMode为"multiChoice")的项目被选中并点击确定时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "请选择",
    +    positive: "确定",
    +    negative: "取消",
    +    items: ["A", "B", "C", "D"],
    +    itemsSelectMode: "multiChoice"
    +}).on("item_select", (indices, items, dialog)=>{
    +    toast(util.format("您选择的项目为%o, 选项为%o", indices, items);
    +}).show();
    +

    事件: input#

    +
    +

    带有输入框的对话框当点击确定时会触发的事件。例如:

    +
    dialogs.build({
    +    title: "请输入",
    +    positive: "确定",
    +    negative: "取消",
    +    inputPrefill: ""
    +}).on("input", (text, dialog)=>{
    +    toast("你输入的是" + text);
    +}).show();
    +

    事件: input_change#

    +
    +

    对话框的输入框的文本发生变化时会触发的事件。例如:

    +
    dialogs.build({
    +    title: "请输入",
    +    positive: "确定",
    +    negative: "取消",
    +    inputPrefill: ""
    +}).on("input_change", (text, dialog)=>{
    +    toast("你输入的是" + text);
    +}).show();
    +

    Engines#

    Stability: 2 - Stable

    engines模块包含了一些与脚本环境、脚本运行、脚本引擎有关的函数,包括运行其他脚本,关闭脚本等。

    @@ -2404,6 +2746,7 @@

    Floaty#layout <xml> | <View> 悬浮窗界面的XML或者View

  • 指定悬浮窗的布局,创建并显示一个悬浮窗,返回一个FloatyWindow对象。

    +

    该悬浮窗自带关闭、调整大小、调整位置按键,可根据需要调用setAdjustEnabled()函数来显示或隐藏。

    其中layout参数可以是xml布局或者一个View,更多信息参见ui模块的说明。

    例子:

    var w = floaty.window(
    @@ -2419,40 +2762,116 @@ 

    Floaty#ui.run(function(){ w.text.setText("文本"); }); -

    floaty.closeAll()#

    +

    有关返回的FloatyWindow对象的说明,参见下面的FloatyWindow章节。

    +

    floaty.rawWindow(layout)#

    +
    +

    指定悬浮窗的布局,创建并显示一个原始悬浮窗,返回一个FloatyRawWindow对象。

    +

    floaty.window()函数不同的是,该悬浮窗不会增加任何额外设施(例如调整大小、位置按钮),您可以根据自己需要编写任何布局。

    +

    而且,该悬浮窗支持完全全屏,可以覆盖状态栏,因此可以做护眼模式之类的应用。

    +
    var w = floaty.rawWindow(
    +    <frame gravity="center">
    +        <text id="text">悬浮文字</text>
    +    </frame>
    +);
    +
    +w.setPosition(500, 500);
    +
    +setTimeout(()=>{
    +    w.close();
    +}, 2000);
    +

    这段代码运行后将会在屏幕上显示悬浮文字,并在两秒后消失。

    +

    有关返回的FloatyRawWindow对象的说明,参见下面的FloatyRawWindow章节。

    +

    floaty.closeAll()#

    关闭所有本脚本的悬浮窗。

    FloatyWindow#

    悬浮窗对象,可通过FloatyWindow.{id}获取悬浮窗界面上的元素。例如, 悬浮窗window上一个控件的id为aaa, 那么window.aaa即可获取到该控件,类似于ui。

    -

    FloatyWindow.setAdjustEnabled(enabled)#

    +

    window.setAdjustEnabled(enabled)#

    如果enabled为true,则在悬浮窗左上角、右上角显示可供位置、大小调整的标示,就像控制台一样; 如果enabled为false,则隐藏上述标示。

    -

    FloatyWindow.setPosition(x, y)#

    +

    window.setPosition(x, y)#

    +
    +

    设置悬浮窗位置。

    +

    window.getX()#

    +

    返回悬浮窗位置的X坐标。

    +

    window.getY()#

    +

    返回悬浮窗位置的Y坐标。

    +

    window.setSize(width, height)#

    +
    +

    设置悬浮窗宽高。

    +

    window.getWidht()#

    +

    返回悬浮窗宽度。

    +

    window.getHeight()#

    +

    返回悬浮窗高度。

    +

    window.close()#

    +

    关闭悬浮窗。如果悬浮窗已经是关闭状态,则此函数将不执行任何操作。

    +

    被关闭后的悬浮窗不能再显示。

    +

    window.exitOnClose()#

    +

    使悬浮窗被关闭时自动结束脚本运行。

    +

    FloatyRawWindow#

    +

    原始悬浮窗对象,可通过window.{id}获取悬浮窗界面上的元素。例如, 悬浮窗window上一个控件的id为aaa, 那么window.aaa即可获取到该控件,类似于ui。

    +

    window.setTouchable(touchable)#

    +
    +

    设置悬浮窗是否可触摸,如果为true, 则悬浮窗将接收到触摸、点击等事件并且无法继续传递到悬浮窗下面;如果为false, 悬浮窗上的触摸、点击等事件将被直接传递到悬浮窗下面。处于安全考虑,被悬浮窗接收的触摸事情无法再继续传递到下层。

    +

    可以用此特性来制作护眼模式脚本。

    +
    var w = floaty.rawWindow(
    +    <frame gravity="center" bg="#44ffcc00"/>
    +);
    +
    +w.setSize(-1, -1);
    +w.setTouchable(false);
    +
    +setTimeout(()=>{
    +    w.close();
    +}, 4000);
    +

    window.setPosition(x, y)#

    设置悬浮窗位置。

    -

    FloatyWindow.getX()#

    +

    window.getX()#

    返回悬浮窗位置的X坐标。

    -

    FloatyWindow.getY()#

    +

    window.getY()#

    返回悬浮窗位置的Y坐标。

    -

    FloatyWindow.setSize(width, height)#

    +

    window.setSize(width, height)#

    设置悬浮窗宽高。

    -

    FloatyWindow.getWidht()#

    +

    特别地,如果设置为-1,则为占满全屏;设置为-2则为根据悬浮窗内容大小而定。例如:

    +
    var w = floaty.rawWindow(
    +    <frame gravity="center" bg="#77ff0000">
    +        <text id="text">悬浮文字</text>
    +    </frame>
    +);
    +
    +w.setSize(-1, -1);
    +
    +setTimeout(()=>{
    +    w.close();
    +}, 2000);
    +

    window.getWidht()#

    返回悬浮窗宽度。

    -

    FloatyWindow.getHeight()#

    +

    window.getHeight()#

    返回悬浮窗高度。

    -

    FloatyWindow.close()#

    +

    window.close()#

    关闭悬浮窗。如果悬浮窗已经是关闭状态,则此函数将不执行任何操作。

    被关闭后的悬浮窗不能再显示。

    -

    FloatyWindow.exitOnClose()#

    +

    window.exitOnClose()#

    使悬浮窗被关闭时自动结束脚本运行。

    @@ -2842,6 +3261,20 @@

    requiresAutojsVersion(version)#

    +
    +

    动态申请安卓的权限。例如:

    +
    //请求GPS权限
    +runtime.requestPermission(["access_fine_location"]);
    +

    尽管安卓有很多权限,但必须写入Manifest才能动态申请,为了防止权限的滥用,目前Auto.js只能额外申请两个权限:

    + +

    您可以通过APK编辑器来增加Auto.js以及Auto.js打包的应用的权限。

    +

    安卓所有的权限列表参见Permissions Overview。(并没有用)

    context#

    全局变量。一个android.content.Context对象。

    注意该对象为ApplicationContext,因此不能用于界面、对话框等的创建。 @@ -3128,7 +3561,31 @@

    colors.equals(color1, color2)#

    +

    colors.BLACK#

    +

    黑色,颜色值 #FF000000

    +

    colors.DKGRAY#

    +

    深灰色,颜色值 #FF444444

    +

    colors.GRAY#

    +

    灰色,颜色值 #FF888888

    +

    colors.LTGRAY#

    +

    亮灰色,颜色值 #FFCCCCCC

    +

    colors.WHITE#

    +

    白色,颜色值 #FFFFFFFF

    +

    colors.RED#

    +

    红色,颜色值 #FFFF0000

    +

    colors.GREEN#

    +

    绿色,颜色值 #FF00FF00

    +

    colors.BLUE#

    +

    蓝色,颜色值 #FF0000FF

    +

    colors.YELLOW#

    +

    黄色,颜色值 #FFFFFF00

    +

    colors.CYAN#

    +

    青色,颜色值 #FF00FFFF

    +

    colors.MAGENTA#

    +

    品红色,颜色值 #FFFF00FF

    +

    colors.TRANSPARENT#

    +

    透明,颜色值 #00000000

    +

    Images#

    Stability: 2 - Stable

    images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、找色、找图等。

    images.requestScreenCapture([landscape])#

    diff --git a/app/src/main/assets/docs/dialogs.html b/app/src/main/assets/docs/dialogs.html index ced935861..29ae1be51 100644 --- a/app/src/main/assets/docs/dialogs.html +++ b/app/src/main/assets/docs/dialogs.html @@ -83,6 +83,22 @@

    目录

  • dialogs.select(title, items, callback)
  • dialogs.singleChoice(title, items[, index, callback])
  • dialogs.multiChoice(title, items[, indices, callback])
  • +
  • dialogs.build(properties)
  • + + +
  • Dialog
  • @@ -213,7 +229,306 @@

    dialogs.multiChoice(title, items[, indices, callback])

    显示一个多选列表对话框,等待用户选择,返回用户选择的选项索引的数组。如果用户取消了选择,返回[]

    在ui模式下该函数返回一个Promise

    +

    dialogs.build(properties)#

    +
      +
    • properties <Object> 对话框属性,用于配置对话框。
    • +
    • 返回 <Dialog>
    • +
    +

    创建一个可自定义的对话框,例如:

    +
    dialogs.build({
    +    //对话框标题
    +    title: "发现新版本",
    +    //对话框内容
    +    content: "更新日志: 新增了若干了BUG",
    +    //确定键内容
    +    positive: "下载",
    +    //取消键内容
    +    negative: "取消",
    +    //中性键内容
    +    neutral: "到浏览器下载",
    +    //勾选框内容
    +    checkBoxPrompt: "不再提示"
    +}).on("positive", ()=>{
    +    //监听确定键
    +    toast("开始下载....");
    +}).on("neutral", ()=>{
    +    //监听中性键
    +    app.openUrl("https://www.autojs.org");
    +}).on("check", (checked)=>{
    +    //监听勾选框
    +    log(checked);
    +}).show();
    +

    选项properties可供配置的项目为:

    + +

    通过这些选项可以自定义一个对话框,并通过监听返回的Dialog对象的按键、输入事件来实现交互。下面是一些例子。

    +

    模拟alert对话框:

    +
    dialogs.build({
    +    title: "你好",
    +    content: "今天也要元气满满哦",
    +    positive: "好的"
    +}).show();
    +

    模拟confirm对话框:

    +
    dialogs.build({
    +    title: "你好",
    +    content: "请问你是笨蛋吗?",
    +    positive: "是的",
    +    negative: "我是大笨蛋"
    +}).on("positive", ()=>{
    +    alert("哈哈哈笨蛋");
    +}).on("negative", ()=>{
    +    alert("哈哈哈大笨蛋");
    +}).show();
    +

    模拟单选框:

    +
    dialogs.build({
    +    title: "单选",
    +    items: ["选项1", "选项2", "选项3", "选项4"],
    +    itemsSelectMode: "singleChoice",
    +    itemsSelectedIndex: 3
    +}).on("item_select", (index, item)->{
    +    toast("您选择的是" + item);
    +}).show();
    +

    "处理中"对话框:

    +
    var d = dialogs.build({
    +    title: "下载中...",
    +    progress: {
    +        max: -1
    +    },
    +    cancelable: false
    +}).show();
     
    +setTimeout(()=>{
    +    d.dismiss();
    +}, 3000);
    +

    输入对话框:

    +
    dialogs.build({
    +    title: "请输入您的年龄",
    +    inputPrefill: "18"
    +}).on("input", (input)=>{
    +    var age = parseInt(input);
    +    toastLog(age);
    +}).show();
    +

    使用这个函数来构造对话框,一个明显的不同是需要使用回调函数而不能像dialogs其他函数一样同步地返回结果;但也可以通过threads模块的方法来实现。例如显示一个输入框并获取输入结果为:

    +
    var input = threads.disposable();
    +dialogas.build({
    +    title: "请输入您的年龄",
    +    inputPrefill: "18"
    +}).on("input", text => {
    +    input.setAndNotify(text);
    +}).show();
    +var age = parseInt(input.blockedGet());
    +tosatLog(age);
    +

    Dialog#

    +

    dialogs.build()返回的对话框对象,内置一些事件用于响应用户的交互,也可以获取对话框的状态和信息。

    +

    事件: show#

    +
      +
    • dialog <Dialog> 对话框
    • +
    +

    对话框显示时会触发的事件。例如:

    +
    dialogs.build({
    +    title: "标题"
    +}).on("show", (dialog)=>{
    +    toast("对话框显示了");
    +}).show();
    +

    事件: cancel#

    +
      +
    • dialog <Dialog> 对话框
    • +
    +

    对话框被取消时会触发的事件。一个对话框可能按取消按钮、返回键取消或者点击对话框以外区域取消。例如:

    +
    dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("cancel", (dialog)=>{
    +    toast("对话框取消了");
    +}).show();
    +

    事件: dismiss#

    +
      +
    • dialog <Dialog> 对话框
    • +
    +

    对话框消失时会触发的事件。对话框被取消或者手动调用dialog.dismiss()函数都会触发该事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("dismiss", (dialog)=>{
    +    toast("对话框消失了");
    +}).show();
    +
    +setTimeout(()=>{
    +    d.dismiss();
    +}, 5000);
    +

    事件: positive#

    +
      +
    • dialog <Dialog> 对话框
    • +
    +

    确定按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("positive", (dialog)=>{
    +    toast("你点击了确定");
    +}).show();
    +

    事件: negative#

    +
      +
    • dialog <Dialog> 对话框
    • +
    +

    取消按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消"
    +}).on("negative", (dialog)=>{
    +    toast("你点击了取消");
    +}).show();
    +

    事件: neutral#

    +
      +
    • dialog <Dialog> 对话框
    • +
    +

    中性按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消",
    +    neutral: "稍后提示"
    +}).on("positive", (dialog)=>{
    +    toast("你点击了稍后提示");
    +}).show();
    +

    事件: any#

    +
      +
    • dialog <Dialog> 对话框
    • +
    • action <string> 被点击的按钮,可能的值为:
        +
      • positive 确定按钮
      • +
      • negative 取消按钮
      • +
      • neutral 中性按钮
      • +
      +
    • +
    +

    任意按钮按下时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "标题",
    +    positive: "确定",
    +    negative: "取消",
    +    neutral: "稍后提示"
    +}).on("any", (action, dialog)=>{
    +    if(action == "positive"){
    +        toast("你点击了确定");
    +    }else if(action == "negative"){
    +        toast("你点击了取消");
    +    }
    +}).show();
    +

    事件: item_select#

    +
      +
    • index <number> 被选中的项目索引,从0开始
    • +
    • item <Object> 被选中的项目
    • +
    • dialog <Dialog> 对话框
    • +
    +

    对话框列表(itemsSelectMode为"select")的项目被点击选中时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "请选择",
    +    positive: "确定",
    +    negative: "取消",
    +    items: ["A", "B", "C", "D"],
    +    itemsSelectMode: "select"
    +}).on("item_select", (index, item, dialog)=>{
    +    toast("您选择的是第" + (index + 1) + "项, 选项为" + item);
    +}).show();
    +

    事件: single_choice#

    +
      +
    • index <number> 被选中的项目索引,从0开始
    • +
    • item <Object> 被选中的项目
    • +
    • dialog <Dialog> 对话框
    • +
    +

    对话框单选列表(itemsSelectMode为"singleChoice")的项目被选中并点击确定时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "请选择",
    +    positive: "确定",
    +    negative: "取消",
    +    items: ["A", "B", "C", "D"],
    +    itemsSelectMode: "singleChoice"
    +}).on("item_select", (index, item, dialog)=>{
    +    toast("您选择的是第" + (index + 1) + "项, 选项为" + item);
    +}).show();
    +

    事件: multi_choice#

    +
      +
    • indices <Array> 被选中的项目的索引的数组
    • +
    • items <Array> 被选中的项目的数组
    • +
    • dialog <Dialog> 对话框
    • +
    +

    对话框多选列表(itemsSelectMode为"multiChoice")的项目被选中并点击确定时触发的事件。例如:

    +
    var d = dialogs.build({
    +    title: "请选择",
    +    positive: "确定",
    +    negative: "取消",
    +    items: ["A", "B", "C", "D"],
    +    itemsSelectMode: "multiChoice"
    +}).on("item_select", (indices, items, dialog)=>{
    +    toast(util.format("您选择的项目为%o, 选项为%o", indices, items);
    +}).show();
    +

    事件: input#

    +
      +
    • text <string> 输入框的内容
    • +
    • dialog <Dialog> 对话框
    • +
    +

    带有输入框的对话框当点击确定时会触发的事件。例如:

    +
    dialogs.build({
    +    title: "请输入",
    +    positive: "确定",
    +    negative: "取消",
    +    inputPrefill: ""
    +}).on("input", (text, dialog)=>{
    +    toast("你输入的是" + text);
    +}).show();
    +

    事件: input_change#

    +
      +
    • text <string> 输入框的内容
    • +
    • dialog <Dialog> 对话框
    • +
    +

    对话框的输入框的文本发生变化时会触发的事件。例如:

    +
    dialogs.build({
    +    title: "请输入",
    +    positive: "确定",
    +    negative: "取消",
    +    inputPrefill: ""
    +}).on("input_change", (text, dialog)=>{
    +    toast("你输入的是" + text);
    +}).show();
    +
    diff --git a/app/src/main/assets/docs/floaty.html b/app/src/main/assets/docs/floaty.html index ad58b322d..c68ae3a6a 100644 --- a/app/src/main/assets/docs/floaty.html +++ b/app/src/main/assets/docs/floaty.html @@ -76,19 +76,32 @@

    目录

    @@ -105,6 +118,7 @@

    Floaty#layout <xml> | <View> 悬浮窗界面的XML或者View

    指定悬浮窗的布局,创建并显示一个悬浮窗,返回一个FloatyWindow对象。

    +

    该悬浮窗自带关闭、调整大小、调整位置按键,可根据需要调用setAdjustEnabled()函数来显示或隐藏。

    其中layout参数可以是xml布局或者一个View,更多信息参见ui模块的说明。

    例子:

    var w = floaty.window(
    @@ -120,40 +134,116 @@ 

    Floaty#ui.run(function(){ w.text.setText("文本"); }); -

    floaty.closeAll()#

    +

    有关返回的FloatyWindow对象的说明,参见下面的FloatyWindow章节。

    +

    floaty.rawWindow(layout)#

    +
      +
    • layout <xml> | <View> 悬浮窗界面的XML或者View
    • +
    +

    指定悬浮窗的布局,创建并显示一个原始悬浮窗,返回一个FloatyRawWindow对象。

    +

    floaty.window()函数不同的是,该悬浮窗不会增加任何额外设施(例如调整大小、位置按钮),您可以根据自己需要编写任何布局。

    +

    而且,该悬浮窗支持完全全屏,可以覆盖状态栏,因此可以做护眼模式之类的应用。

    +
    var w = floaty.rawWindow(
    +    <frame gravity="center">
    +        <text id="text">悬浮文字</text>
    +    </frame>
    +);
    +
    +w.setPosition(500, 500);
    +
    +setTimeout(()=>{
    +    w.close();
    +}, 2000);
    +

    这段代码运行后将会在屏幕上显示悬浮文字,并在两秒后消失。

    +

    有关返回的FloatyRawWindow对象的说明,参见下面的FloatyRawWindow章节。

    +

    floaty.closeAll()#

    关闭所有本脚本的悬浮窗。

    FloatyWindow#

    悬浮窗对象,可通过FloatyWindow.{id}获取悬浮窗界面上的元素。例如, 悬浮窗window上一个控件的id为aaa, 那么window.aaa即可获取到该控件,类似于ui。

    -

    FloatyWindow.setAdjustEnabled(enabled)#

    +

    window.setAdjustEnabled(enabled)#

    • enabled <boolean> 是否启用悬浮窗调整(大小、位置)

    如果enabled为true,则在悬浮窗左上角、右上角显示可供位置、大小调整的标示,就像控制台一样; 如果enabled为false,则隐藏上述标示。

    -

    FloatyWindow.setPosition(x, y)#

    +

    window.setPosition(x, y)#

    设置悬浮窗位置。

    -

    FloatyWindow.getX()#

    +

    window.getX()#

    返回悬浮窗位置的X坐标。

    -

    FloatyWindow.getY()#

    +

    window.getY()#

    返回悬浮窗位置的Y坐标。

    -

    FloatyWindow.setSize(width, height)#

    +

    window.setSize(width, height)#

    设置悬浮窗宽高。

    -

    FloatyWindow.getWidht()#

    +

    window.getWidht()#

    +

    返回悬浮窗宽度。

    +

    window.getHeight()#

    +

    返回悬浮窗高度。

    +

    window.close()#

    +

    关闭悬浮窗。如果悬浮窗已经是关闭状态,则此函数将不执行任何操作。

    +

    被关闭后的悬浮窗不能再显示。

    +

    window.exitOnClose()#

    +

    使悬浮窗被关闭时自动结束脚本运行。

    +

    FloatyRawWindow#

    +

    原始悬浮窗对象,可通过window.{id}获取悬浮窗界面上的元素。例如, 悬浮窗window上一个控件的id为aaa, 那么window.aaa即可获取到该控件,类似于ui。

    +

    window.setTouchable(touchable)#

    +
    +

    设置悬浮窗是否可触摸,如果为true, 则悬浮窗将接收到触摸、点击等事件并且无法继续传递到悬浮窗下面;如果为false, 悬浮窗上的触摸、点击等事件将被直接传递到悬浮窗下面。处于安全考虑,被悬浮窗接收的触摸事情无法再继续传递到下层。

    +

    可以用此特性来制作护眼模式脚本。

    +
    var w = floaty.rawWindow(
    +    <frame gravity="center" bg="#44ffcc00"/>
    +);
    +
    +w.setSize(-1, -1);
    +w.setTouchable(false);
    +
    +setTimeout(()=>{
    +    w.close();
    +}, 4000);
    +

    window.setPosition(x, y)#

    +
    +

    设置悬浮窗位置。

    +

    window.getX()#

    +

    返回悬浮窗位置的X坐标。

    +

    window.getY()#

    +

    返回悬浮窗位置的Y坐标。

    +

    window.setSize(width, height)#

    +
    +

    设置悬浮窗宽高。

    +

    特别地,如果设置为-1,则为占满全屏;设置为-2则为根据悬浮窗内容大小而定。例如:

    +
    var w = floaty.rawWindow(
    +    <frame gravity="center" bg="#77ff0000">
    +        <text id="text">悬浮文字</text>
    +    </frame>
    +);
    +
    +w.setSize(-1, -1);
    +
    +setTimeout(()=>{
    +    w.close();
    +}, 2000);
    +

    window.getWidht()#

    返回悬浮窗宽度。

    -

    FloatyWindow.getHeight()#

    +

    window.getHeight()#

    返回悬浮窗高度。

    -

    FloatyWindow.close()#

    +

    window.close()#

    关闭悬浮窗。如果悬浮窗已经是关闭状态,则此函数将不执行任何操作。

    被关闭后的悬浮窗不能再显示。

    -

    FloatyWindow.exitOnClose()#

    +

    window.exitOnClose()#

    使悬浮窗被关闭时自动结束脚本运行。

    diff --git a/app/src/main/assets/docs/globals.html b/app/src/main/assets/docs/globals.html index b160bd5f7..4d60caa33 100644 --- a/app/src/main/assets/docs/globals.html +++ b/app/src/main/assets/docs/globals.html @@ -89,6 +89,7 @@

    目录

  • random()
  • requiresApi(api)
  • requiresAutojsVersion(version)
  • +
  • runtime.requestPermissions(permissions)
  • context
  • @@ -217,6 +218,20 @@

    requiresAutojsVersion(version)#

    +
      +
    • permissions <Array> 权限的字符串数组
    • +
    +

    动态申请安卓的权限。例如:

    +
    //请求GPS权限
    +runtime.requestPermission(["access_fine_location"]);
    +

    尽管安卓有很多权限,但必须写入Manifest才能动态申请,为了防止权限的滥用,目前Auto.js只能额外申请两个权限:

    +
      +
    • access_fine_location GPS权限
    • +
    • record_audio 录音权限
    • +
    +

    您可以通过APK编辑器来增加Auto.js以及Auto.js打包的应用的权限。

    +

    安卓所有的权限列表参见Permissions Overview。(并没有用)

    context#

    全局变量。一个android.content.Context对象。

    注意该对象为ApplicationContext,因此不能用于界面、对话框等的创建。

    diff --git a/app/src/main/assets/docs/images.html b/app/src/main/assets/docs/images.html index 1187a09f1..9e009677e 100644 --- a/app/src/main/assets/docs/images.html +++ b/app/src/main/assets/docs/images.html @@ -87,11 +87,24 @@

    目录

  • colors.equals(color1, color2)
  • +
  • colors.BLACK
  • +
  • colors.DKGRAY
  • +
  • colors.GRAY
  • +
  • colors.LTGRAY
  • +
  • colors.WHITE
  • +
  • colors.RED
  • +
  • colors.GREEN
  • +
  • colors.BLUE
  • +
  • colors.YELLOW
  • +
  • colors.CYAN
  • +
  • colors.MAGENTA
  • +
  • colors.TRANSPARENT
  • Images
    • images.requestScreenCapture([landscape])
    • images.captureScreen()
    • images.captureScreen(path)
    • images.pixel(image, x, y)
    • +
    • images.copy(img)
    • images.save(image, path[, format = "png", quality = 100])
    • images.read(path)
    • images.load(url)
    • @@ -208,7 +221,31 @@

      colors.equals(color1, color2)#

      +

      colors.BLACK#

      +

      黑色,颜色值 #FF000000

      +

      colors.DKGRAY#

      +

      深灰色,颜色值 #FF444444

      +

      colors.GRAY#

      +

      灰色,颜色值 #FF888888

      +

      colors.LTGRAY#

      +

      亮灰色,颜色值 #FFCCCCCC

      +

      colors.WHITE#

      +

      白色,颜色值 #FFFFFFFF

      +

      colors.RED#

      +

      红色,颜色值 #FFFF0000

      +

      colors.GREEN#

      +

      绿色,颜色值 #FF00FF00

      +

      colors.BLUE#

      +

      蓝色,颜色值 #FF0000FF

      +

      colors.YELLOW#

      +

      黄色,颜色值 #FFFFFF00

      +

      colors.CYAN#

      +

      青色,颜色值 #FF00FFFF

      +

      colors.MAGENTA#

      +

      品红色,颜色值 #FFFF00FF

      +

      colors.TRANSPARENT#

      +

      透明,颜色值 #00000000

      +

      Images#

      Stability: 2 - Stable

      images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、找色、找图等。

      images.requestScreenCapture([landscape])#

        @@ -263,9 +300,15 @@

        images.pixel(image, x, y)#

        +
          +
        • img <Image> 图片
        • +
        • 返回 <Image>
        • +
        +

        复制一张图片并返回新的副本。该函数会完全复制img对象的数据。

        images.save(image, path[, format = "png", quality = 100])#

          -
        • image <image> 图片
        • +
        • image <Image> 图片
        • path <string> 路径
        • format <string> 图片格式,可选的值为:
          • png
          • diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java b/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java index a3e6cbfdd..8bfd8bf3c 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java @@ -71,8 +71,8 @@ void lol() { mLolClickCount++; //Toast.makeText(this, R.string.text_lll, Toast.LENGTH_LONG).show(); if (mLolClickCount >= 5) { - //crashTest(); - showEasterEgg(); + crashTest(); + //showEasterEgg(); } } diff --git a/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java b/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java index 10e5bfb7c..83e5ab9b7 100644 --- a/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java @@ -99,7 +99,7 @@ private void fetchSplashAD() { mHandler.postDelayed(() -> { if (mAdLoading) enterNextActivity(); - }, 4000); + }, 3000); mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId(BuildConfig.DEBUG ? Constants.ADMOB_INTERSTITIAL_TEST_ID : Constants.ADMOB_INTERSTITIAL_ID); mInterstitialAd.setAdListener(new AdListener() { diff --git a/inrt/build.gradle b/inrt/build.gradle index b09aa7242..330c3a208 100644 --- a/inrt/build.gradle +++ b/inrt/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.stardust.auojs.inrt" minSdkVersion 17 targetSdkVersion 23 - versionCode 56 - versionName "1.1.0 Beta" + versionCode 201 + versionName "4.0.0 Alpha1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" ndk { abiFilters 'armeabi-v7a'