Merge pull request #338 from hyb1996/dev

4.0.0 Beta
This commit is contained in:
Stardust 2018-06-03 21:42:20 +08:00 committed by GitHub
commit 7be59e0c46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1433 changed files with 17920 additions and 2813 deletions

Binary file not shown.

View File

@ -0,0 +1,221 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="RIGHT_MARGIN" value="100" />
<JavaCodeStyleSettings>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="android" withSubpackages="true" static="false" />
<emptyLine />
<package name="com" withSubpackages="true" static="false" />
<emptyLine />
<package name="junit" withSubpackages="true" static="false" />
<emptyLine />
<package name="net" withSubpackages="true" static="false" />
<emptyLine />
<package name="org" withSubpackages="true" static="false" />
<emptyLine />
<package name="java" withSubpackages="true" static="false" />
<emptyLine />
<package name="javax" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="true" />
<emptyLine />
</value>
</option>
</JavaCodeStyleSettings>
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" fileNamingConvention="NONE" />
<pair source="c" header="h" fileNamingConvention="NONE" />
</extensions>
</Objective-C-extensions>
<XML>
<option name="XML_KEEP_LINE_BREAKS" value="false" />
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
</XML>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</code_scheme>
</component>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default (1)" />
</state>
</component>

View File

@ -3,8 +3,7 @@
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Auto.js.iml" filepath="$PROJECT_DIR$/Auto.js.iml" />
<module fileurl="file://E:\YiBin\AndroidStudioProjects\NoRootScriptDroid\Auto.js.iml" filepath="E:\YiBin\AndroidStudioProjects\NoRootScriptDroid\Auto.js.iml" />
<module fileurl="file://C:\Users\Stardust\Documents\AndroidProjects\Auto.js\NoRootScriptDroid.iml" filepath="C:\Users\Stardust\Documents\AndroidProjects\Auto.js\NoRootScriptDroid.iml" />
<module fileurl="file://$PROJECT_DIR$/NoRootScriptDroid.iml" filepath="$PROJECT_DIR$/NoRootScriptDroid.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/autojs/autojs.iml" filepath="$PROJECT_DIR$/autojs/autojs.iml" />
<module fileurl="file://$PROJECT_DIR$/automator/automator.iml" filepath="$PROJECT_DIR$/automator/automator.iml" />

View File

@ -4,7 +4,7 @@
同时有[Sublime Text 插件](https://github.com/hyb1996/AutoJs-Sublime-Plugin)可提供基础的在桌面开发的功能。
下载地址:[酷安](http://www.coolapk.com/apk/com.stardust.scriptdroid)
下载地址:[酷安](http://www.coolapk.com/apk/org.autojs.autojs)
Alpha版本[Releases](https://github.com/hyb1996/NoRootScriptDroid/releases)

View File

@ -5,11 +5,11 @@ android {
compileSdkVersion 25
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.stardust.scriptdroid"
applicationId "org.autojs.autojs"
minSdkVersion 17
targetSdkVersion 23
versionCode 255
versionName "3.1.0 Alpha5"
versionCode 403
versionName "4.0.0 Beta"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
@ -74,10 +74,6 @@ dependencies {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
// LeakCanary (a memory leak tracer)
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
// Android Annotations
annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
@ -151,5 +147,5 @@ dependencies {
compile project(':automator')
compile project(':common')
compile project(':autojs')
compile files('libs/GDTUnionSDK.4.9.545.min.jar')
implementation 'com.google.android.gms:play-services-ads:11.8.0'
}

Binary file not shown.

View File

@ -1 +1 @@
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":34},"path":"inrt-release.apk","properties":{"packageId":"com.stardust.auojs.inrt","split":"","minSdkVersion":"17"}}]
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":203},"path":"inrt-release.apk","properties":{"packageId":"com.stardust.auojs.inrt","split":"","minSdkVersion":"17"}}]

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.statics;
package org.autojs.autojs.statics;
import org.junit.Test;
import org.mozilla.javascript.Context;

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.stardust.scriptdroid">
package="org.autojs.autojs">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
@ -12,6 +13,11 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<!-- 非Auto.js运行必需不会主动申请某些脚本可以自行申请-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- Ad SDK Permissions -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
@ -25,6 +31,7 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:label, android:icon, android:allowBackup">
<activity
android:name=".ui.splash.SplashActivity_"
android:hardwareAccelerated="true"
@ -45,7 +52,7 @@
</activity>
<activity
android:name=".external.shortcut.ShortcutActivity"
android:taskAffinity="com.stardust.scriptdroid.external.shortcut.ShortcutActivity"
android:taskAffinity="org.autojs.autojs.external.shortcut.ShortcutActivity"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
@ -56,7 +63,7 @@
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.stardust.scriptdroid.fileprovider"
android:authorities="org.autojs.autojs.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
@ -151,7 +158,7 @@
android:name=".external.open.RunIntentActivity"
android:icon="@drawable/autojs_material"
android:label="@string/text_run_script"
android:taskAffinity="com.stardust.scriptdroid.external.open.RunIntentActivity"
android:taskAffinity="org.autojs.autojs.external.open.RunIntentActivity"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>

File diff suppressed because it is too large Load Diff

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -73,6 +75,10 @@
<h2>目录</h2>
<ul>
<li><span class="stability_undefined"><a href="#app_app">App</a></span><ul>
<li><span class="stability_undefined"><a href="#app_app_versioncode">app.versionCode</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_versionname">app.versionName</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_autojs_versioncode">app.autojs.versionCode</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_autojs_versionname">app.autojs.versionName</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_launchapp_appname">app.launchApp(appName)</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_launch_packagename">app.launch(packageName)</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_launchpackage_packagename">app.launchPackage(packageName)</a></span></li>
@ -84,6 +90,7 @@
<li><span class="stability_undefined"><a href="#app_app_uninstall_packagename">app.uninstall(packageName)</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_openurl_url">app.openUrl(url)</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_sendemail_options">app.sendEmail(options)</a></span></li>
<li><span class="stability_undefined"><a href="#app_app_startactivity_name">app.startActivity(name)</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#app_intent">进阶: 意图Intent</a></span><ul>
@ -100,6 +107,30 @@
<h1>App<span><a class="mark" href="#app_app" id="app_app">#</a></span></h1>
<p>app模块提供一系列函数用于使用其他应用、与其他应用交互。例如发送意图、打开文件、发送邮件等。</p>
<p>同时提供了方便的进阶函数startActivity和sendBroadcast用他们可完成app模块没有内置的和其他应用的交互。</p>
<h2>app.versionCode<span><a class="mark" href="#app_app_versioncode" id="app_app_versioncode">#</a></span></h2>
<div class="signature"><ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a></li>
</ul>
</div><p>当前软件版本号整数值。例如160, 256等。</p>
<p>如果在Auto.js中运行则为Auto.js的版本号在打包的软件中则为打包软件的版本号。</p>
<pre><code>toastLog(app.versionCode);
</code></pre><h2>app.versionName<span><a class="mark" href="#app_app_versionname" id="app_app_versionname">#</a></span></h2>
<div class="signature"><ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a></li>
</ul>
</div><p>当前软件的版本名称,例如&quot;3.0.0 Beta&quot;</p>
<p>如果在Auto.js中运行则为Auto.js的版本名称在打包的软件中则为打包软件的版本名称。</p>
<pre><code>toastLog(app.verionName);
</code></pre><h2>app.autojs.versionCode<span><a class="mark" href="#app_app_autojs_versioncode" id="app_app_autojs_versioncode">#</a></span></h2>
<div class="signature"><ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a></li>
</ul>
</div><p>Auto.js版本号整数值。例如160, 256等。</p>
<h2>app.autojs.versionName<span><a class="mark" href="#app_app_autojs_versionname" id="app_app_autojs_versionname">#</a></span></h2>
<div class="signature"><ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a></li>
</ul>
</div><p>Auto.js版本名称例如&quot;3.0.0 Beta&quot;</p>
<h2>app.launchApp(appName)<span><a class="mark" href="#app_app_launchapp_appname" id="app_app_launchapp_appname">#</a></span></h2>
<div class="signature"><ul>
<li><code>appName</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 应用名称</li>
@ -189,6 +220,16 @@ app.sendEmail({
subject: &quot;这是一个邮件标题&quot;,
text: &quot;这是邮件正文&quot;
});
</code></pre><h2>app.startActivity(name)<span><a class="mark" href="#app_app_startactivity_name" id="app_app_startactivity_name">#</a></span></h2>
<div class="signature"><ul>
<li><code>name</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 活动名称,可选的值为:<ul>
<li><code>console</code> 日志界面</li>
<li><code>settings</code> 设置界面</li>
</ul>
</li>
</ul>
</div><p>启动Auto.js的特定界面。该函数在Auto.js内运行则会打开Auto.js内的界面在打包应用中运行则会打开打包应用的相应界面。</p>
<pre><code>app.startActivity(&quot;console&quot;);
</code></pre><h1>进阶: 意图Intent<span><a class="mark" href="#app_intent" id="app_intent">#</a></span></h1>
<p>Intent(意图) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:</p>
<ul>

View File

@ -0,0 +1,119 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Canvas | Auto.js 3.0.0 文档</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic">
<link rel="stylesheet" href="assets/style.css">
<link rel="stylesheet" href="assets/sh.css">
<link rel="canonical" href="https://nodejs.org/api/canvas.html">
</head>
<body class="alt apidoc" id="api-section-canvas">
<div id="content" class="clearfix">
<div id="column2" class="interior">
<div id="intro" class="interior">
<a href="/" title="返回首页">
Auto.js
</a>
</div>
<ul>
<li><a class="nav-documentation" href="documentation.html">关于本文档</a></li>
<li><a class="nav-http-www-w3school-com-cn-js-pro_js_syntax-asp" href="http://www.w3school.com.cn/js/pro_js_syntax.asp">W3CSchool - ECMAScript教程</a></li>
<li><a class="nav-http-es6-ruanyifeng-com-README" href="http://es6.ruanyifeng.com/#README">阮一峰 - ECMAScript 6教程</a></li>
</ul>
<div class="line"></div>
<ul>
<li><a class="nav-overview" href="overview.html">Overview - 综述</a></li>
<li><a class="nav-qa" href="qa.html">Q&amp;A - 常见问题</a></li>
<li><a class="nav-app" href="app.html">App - 应用</a></li>
<li><a class="nav-console" href="console.html">Console - 控制台</a></li>
<li><a class="nav-coordinates-based-automation" href="coordinates-based-automation.html">CoordinatesBasedAutomation - 基于坐标的操作</a></li>
<li><a class="nav-device" href="device.html">Device - 设备</a></li>
<li><a class="nav-dialogs" href="dialogs.html">Dialogs - 对话框</a></li>
<li><a class="nav-engines" href="engines.html">Engines - 脚本引擎</a></li>
<li><a class="nav-events" href="events.html">Events - 事件与监听</a></li>
<li><a class="nav-floaty" href="floaty.html">Floaty - 悬浮窗</a></li>
<li><a class="nav-files" href="files.html">Files - 文件系统</a></li>
<li><a class="nav-globals" href="globals.html">Globals - 一般全局函数</a></li>
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
<li><a class="nav-timers" href="timers.html">Timers - 定时器</a></li>
<li><a class="nav-ui" href="ui.html">UI - 用户界面</a></li>
<li><a class="nav-https-developer-mozilla-org-zh-CN-docs-Mozilla-Projects-Rhino-Scripting_Java" href="https://developer.mozilla.org/zh-CN/docs/Mozilla/Projects/Rhino/Scripting_Java">Work with Java - 调用Java API</a></li>
</ul>
<div class="line"></div>
<ul>
<li><a class="nav-https-github-com-hyb1996-NoRootScriptDroid" href="https://github.com/hyb1996/NoRootScriptDroid">GitHub项目 &amp; Issue提交</a></li>
<li><a class="nav-http-autojs-org" href="http://autojs.org">Auto.js交流社区</a></li>
</ul>
</div>
<div id="column1" data-id="canvas" class="interior">
<header>
<h1>Auto.js 3.0.0 文档</h1>
<div id="gtoc">
<p>
<a href="index.html" name="toc">索引</a> |
<a href="all.html">查看全部</a>
</p>
</div>
<hr>
</header>
<div id="toc">
<h2>目录</h2>
<ul>
<li><span class="stability_undefined"><a href="#canvas_canvas">Canvas</a></span><ul>
<li><span class="stability_undefined"><a href="#canvas_canvas_drawargb_a_r_g_b">canvas.drawARGB(a, r, g, b)</a></span></li>
<li><span class="stability_undefined"><a href="#canvas_canvas_draw">canvas.draw</a></span></li>
</ul>
</li>
</ul>
</div>
<div id="apicontent">
<h1>Canvas<span><a class="mark" href="#canvas_canvas" id="canvas_canvas">#</a></span></h1>
<p>canvas提供了使用画布进行2D画图的支持可用于简单的小游戏开发或者图片编辑。使用canvas可以轻松地在一张图片或一个界面上绘制各种线与图形。</p>
<p>canvas的坐标系为平面直角坐标系以屏幕左上角为原点屏幕上边为x轴正方向屏幕左边为y轴正方向。例如分辨率为1920*1080的屏幕上画一条从屏幕左上角到屏幕右下角的线段为:</p>
<pre><code>canvas.drawLine(0, 0, 1080, 1920, paint);
</code></pre><p>canvas的绘制依赖于画笔Paint, 通过设置画笔的粗细、颜色、填充等可以改变绘制出来的图形。例如绘制一个红色实心正方形为:</p>
<pre><code>var paint = new Paint();
//设置画笔为填充,则绘制出来的图形都是实心的
paint.setStyle(Paint.STYLE.FILL);
//设置画笔颜色为红色
paint.setColor(colors.RED);
//绘制一个从坐标(0, 0)到坐标(100, 100)的正方形
canvas.drawRect(0, 0, 100, 100, paint);
</code></pre><p>如果要绘制正方形的边框则通过设置画笔的Style来实现</p>
<pre><code>var paint = new Paint();
//设置画笔为描边,则绘制出来的图形都是轮廓
paint.setStyle(Paint.STYLE.STROKE);
//设置画笔颜色为红色
paint.setColor(colors.RED);
//绘制一个从坐标(0, 0)到坐标(100, 100)的正方形
canvas.drawRect(0, 0, 100, 100, paint);
</code></pre><p>结合画笔canvas可以绘制基本图形、图片等。</p>
<h2>canvas.drawARGB(a, r, g, b)<span><a class="mark" href="#canvas_canvas_drawargb_a_r_g_b" id="canvas_canvas_drawargb_a_r_g_b">#</a></span></h2>
<h2>canvas.draw<span><a class="mark" href="#canvas_canvas_draw" id="canvas_canvas_draw">#</a></span></h2>
</div>
</div>
</div>
<script src="assets/sh_main.js"></script>
<script src="assets/sh_javascript.min.js"></script>
<script>highlight(undefined, undefined, 'pre');</script>
<!-- __TRACKING__ -->
</body>
</html>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -81,6 +83,22 @@
<li><span class="stability_undefined"><a href="#dialogs_dialogs_select_title_items_callback">dialogs.select(title, items, callback)</a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_dialogs_singlechoice_title_items_index_callback">dialogs.singleChoice(title, items[, index, callback])</a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_dialogs_multichoice_title_items_indices_callback">dialogs.multiChoice(title, items[, indices, callback])</a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_dialogs_build_properties">dialogs.build(properties)</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#dialogs_dialog">Dialog</a></span><ul>
<li><span class="stability_undefined"><a href="#dialogs_show">事件: <code>show</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_cancel">事件: <code>cancel</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_dismiss">事件: <code>dismiss</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_positive">事件: <code>positive</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_negative">事件: <code>negative</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_neutral">事件: <code>neutral</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_any">事件: <code>any</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_item_select">事件: <code>item_select</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_single_choice">事件: <code>single_choice</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_multi_choice">事件: <code>multi_choice</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_input">事件: <code>input</code></a></span></li>
<li><span class="stability_undefined"><a href="#dialogs_input_change">事件: <code>input_change</code></a></span></li>
</ul>
</li>
</ul>
@ -211,7 +229,306 @@ dialogs.select(&quot;请选择一个选项&quot;, [&quot;选项A&quot;, &quot;
</ul>
</div><p>显示一个多选列表对话框,等待用户选择,返回用户选择的选项索引的数组。如果用户取消了选择,返回<code>[]</code></p>
<p>在ui模式下该函数返回一个<code>Promise</code></p>
<h2>dialogs.build(properties)<span><a class="mark" href="#dialogs_dialogs_build_properties" id="dialogs_dialogs_build_properties">#</a></span></h2>
<div class="signature"><ul>
<li><code>properties</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&lt;Object&gt;</a> 对话框属性,用于配置对话框。</li>
<li>返回 <span class="type">&lt;Dialog&gt;</span></li>
</ul>
</div><p>创建一个可自定义的对话框,例如:</p>
<pre><code>dialogs.build({
//对话框标题
title: &quot;发现新版本&quot;,
//对话框内容
content: &quot;更新日志: 新增了若干了BUG&quot;,
//确定键内容
positive: &quot;下载&quot;,
//取消键内容
negative: &quot;取消&quot;,
//中性键内容
neutral: &quot;到浏览器下载&quot;,
//勾选框内容
checkBoxPrompt: &quot;不再提示&quot;
}).on(&quot;positive&quot;, ()=&gt;{
//监听确定键
toast(&quot;开始下载....&quot;);
}).on(&quot;neutral&quot;, ()=&gt;{
//监听中性键
app.openUrl(&quot;https://www.autojs.org&quot;);
}).on(&quot;check&quot;, (checked)=&gt;{
//监听勾选框
log(checked);
}).show();
</code></pre><p>选项properties可供配置的项目为:</p>
<ul>
<li><code>title</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框标题</li>
<li><code>titleColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框标题的颜色</li>
<li><code>buttonRippleColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框按钮的波纹效果颜色</li>
<li><code>icon</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <span class="type">&lt;Image&gt;</span> 对话框的图标是一个URL或者图片对象 </li>
<li><code>content</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框文字内容 </li>
<li><code>contentColor</code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框文字内容的颜色</li>
<li><code>contentLineSpacing</code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框文字内容的行高倍数1.0为一倍行高</li>
<li><code>items</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type">&lt;Array&gt;</a> 对话框列表的选项</li>
<li><code>itemsColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框列表的选项的文字颜色</li>
<li><code>itemsSelectMode</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框列表的选项选择模式,可以为:<ul>
<li><code>select</code> 普通选择模式</li>
<li><code>singleChoice</code> 单选模式</li>
<li><code>multiChoice</code> 多选模式</li>
</ul>
</li>
<li><code>itemsSelectedIndex</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type">&lt;Array&gt;</a> 对话框列表中???</li>
<li><code>positive</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框确定按钮的文字内容(最右边按钮)</li>
<li><code>positiveColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框确定按钮的文字颜色(最右边按钮)</li>
<li><code>neutral</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框中立按钮的文字内容(最左边按钮)</li>
<li><code>neutralColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框中立按钮的文字颜色(最左边按钮)</li>
<li><code>negative</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框取消按钮的文字内容(确定按钮左边的按钮)</li>
<li><code>negativeColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 对话框取消按钮的文字颜色(确定按钮左边的按钮)</li>
<li><code>checkBoxPrompt</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 勾选框文字内容</li>
<li><code>checkBoxChecked</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 勾选框是否勾选 </li>
<li><code>progress</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&lt;Object&gt;</a> 配置对话框进度条的对象:<ul>
<li><code>max</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 进度条的最大值,如果为-1则为无限循环的进度条</li>
<li><code>horizontal</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 如果为true, 则对话框无限循环的进度条为水平进度条</li>
<li><code>showMinMax</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 是否显示进度条的最大值和最小值</li>
</ul>
</li>
<li><code>cancelable</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 对话框是否可取消如果为false则对话框只能用代码手动取消</li>
<li><code>canceledOnTouchOutside</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 对话框是否在点击对话框以外区域时自动取消默认为true</li>
<li><code>inputHint</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框的输入框的输入提示</li>
<li><code>inputPrefill</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 对话框输入框的默认输入内容</li>
</ul>
<p>通过这些选项可以自定义一个对话框并通过监听返回的Dialog对象的按键、输入事件来实现交互。下面是一些例子。</p>
<p>模拟alert对话框</p>
<pre><code>dialogs.build({
title: &quot;你好&quot;,
content: &quot;今天也要元气满满哦&quot;,
positive: &quot;好的&quot;
}).show();
</code></pre><p>模拟confirm对话框:</p>
<pre><code>dialogs.build({
title: &quot;你好&quot;,
content: &quot;请问你是笨蛋吗?&quot;,
positive: &quot;是的&quot;,
negative: &quot;我是大笨蛋&quot;
}).on(&quot;positive&quot;, ()=&gt;{
alert(&quot;哈哈哈笨蛋&quot;);
}).on(&quot;negative&quot;, ()=&gt;{
alert(&quot;哈哈哈大笨蛋&quot;);
}).show();
</code></pre><p>模拟单选框:</p>
<pre><code>dialogs.build({
title: &quot;单选&quot;,
items: [&quot;选项1&quot;, &quot;选项2&quot;, &quot;选项3&quot;, &quot;选项4&quot;],
itemsSelectMode: &quot;singleChoice&quot;,
itemsSelectedIndex: 3
}).on(&quot;item_select&quot;, (index, item)-&gt;{
toast(&quot;您选择的是&quot; + item);
}).show();
</code></pre><p>&quot;处理中&quot;对话框:</p>
<pre><code>var d = dialogs.build({
title: &quot;下载中...&quot;,
progress: {
max: -1
},
cancelable: false
}).show();
setTimeout(()=&gt;{
d.dismiss();
}, 3000);
</code></pre><p>输入对话框:</p>
<pre><code>dialogs.build({
title: &quot;请输入您的年龄&quot;,
inputPrefill: &quot;18&quot;
}).on(&quot;input&quot;, (input)=&gt;{
var age = parseInt(input);
toastLog(age);
}).show();
</code></pre><p>使用这个函数来构造对话框一个明显的不同是需要使用回调函数而不能像dialogs其他函数一样同步地返回结果但也可以通过threads模块的方法来实现。例如显示一个输入框并获取输入结果为</p>
<pre><code>var input = threads.disposable();
dialogas.build({
title: &quot;请输入您的年龄&quot;,
inputPrefill: &quot;18&quot;
}).on(&quot;input&quot;, text =&gt; {
input.setAndNotify(text);
}).show();
var age = parseInt(input.blockedGet());
tosatLog(age);
</code></pre><h1>Dialog<span><a class="mark" href="#dialogs_dialog" id="dialogs_dialog">#</a></span></h1>
<p><code>dialogs.build()</code>返回的对话框对象,内置一些事件用于响应用户的交互,也可以获取对话框的状态和信息。</p>
<h2>事件: <code>show</code><span><a class="mark" href="#dialogs_show" id="dialogs_show">#</a></span></h2>
<div class="signature"><ul>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>对话框显示时会触发的事件。例如:</p>
<pre><code>dialogs.build({
title: &quot;标题&quot;
}).on(&quot;show&quot;, (dialog)=&gt;{
toast(&quot;对话框显示了&quot;);
}).show();
</code></pre><h2>事件: <code>cancel</code><span><a class="mark" href="#dialogs_cancel" id="dialogs_cancel">#</a></span></h2>
<div class="signature"><ul>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>对话框被取消时会触发的事件。一个对话框可能按取消按钮、返回键取消或者点击对话框以外区域取消。例如:</p>
<pre><code>dialogs.build({
title: &quot;标题&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;
}).on(&quot;cancel&quot;, (dialog)=&gt;{
toast(&quot;对话框取消了&quot;);
}).show();
</code></pre><h2>事件: <code>dismiss</code><span><a class="mark" href="#dialogs_dismiss" id="dialogs_dismiss">#</a></span></h2>
<div class="signature"><ul>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>对话框消失时会触发的事件。对话框被取消或者手动调用<code>dialog.dismiss()</code>函数都会触发该事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;标题&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;
}).on(&quot;dismiss&quot;, (dialog)=&gt;{
toast(&quot;对话框消失了&quot;);
}).show();
setTimeout(()=&gt;{
d.dismiss();
}, 5000);
</code></pre><h2>事件: <code>positive</code><span><a class="mark" href="#dialogs_positive" id="dialogs_positive">#</a></span></h2>
<div class="signature"><ul>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>确定按钮按下时触发的事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;标题&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;
}).on(&quot;positive&quot;, (dialog)=&gt;{
toast(&quot;你点击了确定&quot;);
}).show();
</code></pre><h2>事件: <code>negative</code><span><a class="mark" href="#dialogs_negative" id="dialogs_negative">#</a></span></h2>
<div class="signature"><ul>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>取消按钮按下时触发的事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;标题&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;
}).on(&quot;negative&quot;, (dialog)=&gt;{
toast(&quot;你点击了取消&quot;);
}).show();
</code></pre><h2>事件: <code>neutral</code><span><a class="mark" href="#dialogs_neutral" id="dialogs_neutral">#</a></span></h2>
<div class="signature"><ul>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>中性按钮按下时触发的事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;标题&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;,
neutral: &quot;稍后提示&quot;
}).on(&quot;positive&quot;, (dialog)=&gt;{
toast(&quot;你点击了稍后提示&quot;);
}).show();
</code></pre><h2>事件: <code>any</code><span><a class="mark" href="#dialogs_any" id="dialogs_any">#</a></span></h2>
<div class="signature"><ul>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
<li><code>action</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 被点击的按钮,可能的值为:<ul>
<li><code>positive</code> 确定按钮 </li>
<li><code>negative</code> 取消按钮</li>
<li><code>neutral</code> 中性按钮</li>
</ul>
</li>
</ul>
</div><p>任意按钮按下时触发的事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;标题&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;,
neutral: &quot;稍后提示&quot;
}).on(&quot;any&quot;, (action, dialog)=&gt;{
if(action == &quot;positive&quot;){
toast(&quot;你点击了确定&quot;);
}else if(action == &quot;negative&quot;){
toast(&quot;你点击了取消&quot;);
}
}).show();
</code></pre><h2>事件: <code>item_select</code><span><a class="mark" href="#dialogs_item_select" id="dialogs_item_select">#</a></span></h2>
<div class="signature"><ul>
<li><code>index</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 被选中的项目索引从0开始</li>
<li><code>item</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&lt;Object&gt;</a> 被选中的项目</li>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>对话框列表(itemsSelectMode为&quot;select&quot;)的项目被点击选中时触发的事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;请选择&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;,
items: [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
itemsSelectMode: &quot;select&quot;
}).on(&quot;item_select&quot;, (index, item, dialog)=&gt;{
toast(&quot;您选择的是第&quot; + (index + 1) + &quot;项, 选项为&quot; + item);
}).show();
</code></pre><h2>事件: <code>single_choice</code><span><a class="mark" href="#dialogs_single_choice" id="dialogs_single_choice">#</a></span></h2>
<div class="signature"><ul>
<li><code>index</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 被选中的项目索引从0开始</li>
<li><code>item</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&lt;Object&gt;</a> 被选中的项目</li>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>对话框单选列表(itemsSelectMode为&quot;singleChoice&quot;)的项目被选中并点击确定时触发的事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;请选择&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;,
items: [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
itemsSelectMode: &quot;singleChoice&quot;
}).on(&quot;item_select&quot;, (index, item, dialog)=&gt;{
toast(&quot;您选择的是第&quot; + (index + 1) + &quot;项, 选项为&quot; + item);
}).show();
</code></pre><h2>事件: <code>multi_choice</code><span><a class="mark" href="#dialogs_multi_choice" id="dialogs_multi_choice">#</a></span></h2>
<div class="signature"><ul>
<li><code>indices</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type">&lt;Array&gt;</a> 被选中的项目的索引的数组</li>
<li><code>items</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type">&lt;Array&gt;</a> 被选中的项目的数组</li>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>对话框多选列表(itemsSelectMode为&quot;multiChoice&quot;)的项目被选中并点击确定时触发的事件。例如:</p>
<pre><code>var d = dialogs.build({
title: &quot;请选择&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;,
items: [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
itemsSelectMode: &quot;multiChoice&quot;
}).on(&quot;item_select&quot;, (indices, items, dialog)=&gt;{
toast(util.format(&quot;您选择的项目为%o, 选项为%o&quot;, indices, items);
}).show();
</code></pre><h2>事件: <code>input</code><span><a class="mark" href="#dialogs_input" id="dialogs_input">#</a></span></h2>
<div class="signature"><ul>
<li><code>text</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 输入框的内容</li>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>带有输入框的对话框当点击确定时会触发的事件。例如:</p>
<pre><code>dialogs.build({
title: &quot;请输入&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;,
inputPrefill: &quot;&quot;
}).on(&quot;input&quot;, (text, dialog)=&gt;{
toast(&quot;你输入的是&quot; + text);
}).show();
</code></pre><h2>事件: <code>input_change</code><span><a class="mark" href="#dialogs_input_change" id="dialogs_input_change">#</a></span></h2>
<div class="signature"><ul>
<li><code>text</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 输入框的内容</li>
<li><code>dialog</code> <span class="type">&lt;Dialog&gt;</span> 对话框</li>
</ul>
</div><p>对话框的输入框的文本发生变化时会触发的事件。例如:</p>
<pre><code>dialogs.build({
title: &quot;请输入&quot;,
positive: &quot;确定&quot;,
negative: &quot;取消&quot;,
inputPrefill: &quot;&quot;
}).on(&quot;input_change&quot;, (text, dialog)=&gt;{
toast(&quot;你输入的是&quot; + text);
}).show();
</code></pre>
</div>
</div>
</div>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -79,6 +81,7 @@
<li><span class="stability_undefined"><a href="#engines_engines_stopall">engines.stopAll()</a></span></li>
<li><span class="stability_undefined"><a href="#engines_engines_stopallandtoast">engines.stopAllAndToast()</a></span></li>
<li><span class="stability_undefined"><a href="#engines_engines_myengine">engines.myEngine()</a></span></li>
<li><span class="stability_undefined"><a href="#engines_engines_all">engines.all()</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#engines_scriptexecution">ScriptExecution</a></span><ul>
@ -89,6 +92,8 @@
<li><span class="stability_undefined"><a href="#engines_scriptengine">ScriptEngine</a></span><ul>
<li><span class="stability_undefined"><a href="#engines_scriptengine_forcestop">ScriptEngine.forceStop()</a></span></li>
<li><span class="stability_undefined"><a href="#engines_scriptengine_cwd">ScriptEngine.cwd()</a></span></li>
<li><span class="stability_undefined"><a href="#engines_scriptengine_getsource">ScriptEngine.getSource()</a></span></li>
<li><span class="stability_undefined"><a href="#engines_scriptengine_emit_eventname_args">ScriptEngine.emit(eventName[, ...args])</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#engines_scriptconfig">ScriptConfig</a></span><ul>
@ -180,7 +185,13 @@ exec(add, {a: 1, b:2});
<p>停止所有正在运行的脚本并显示停止的脚本数量。包括当前脚本自身。</p>
<h2>engines.myEngine()<span><a class="mark" href="#engines_engines_myengine" id="engines_engines_myengine">#</a></span></h2>
<p>返回当前脚本的脚本引擎对象(<a href="#engines_scriptengine">ScriptEngine</a>)</p>
<h1>ScriptExecution<span><a class="mark" href="#engines_scriptexecution" id="engines_scriptexecution">#</a></span></h1>
<h2>engines.all()<span><a class="mark" href="#engines_engines_all" id="engines_engines_all">#</a></span></h2>
<div class="signature"><ul>
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type">&lt;Array&gt;</a></li>
</ul>
</div><p>返回当前所有正在运行的脚本的脚本引擎<a href="#engines_scriptengine">ScriptEngine</a>的数组。</p>
<pre><code>log(engines.all());
</code></pre><h1>ScriptExecution<span><a class="mark" href="#engines_scriptexecution" id="engines_scriptexecution">#</a></span></h1>
<p>执行脚本时返回的对象,可以通过他获取执行的引擎、配置等,也可以停止这个执行。</p>
<p>要停止这个脚本的执行,使用<code>exectuion.getEngine().forceStop()</code>.</p>
<h2>ScriptExecution.getEngine()<span><a class="mark" href="#engines_scriptexecution_getengine" id="engines_scriptexecution_getengine">#</a></span></h2>
@ -196,7 +207,33 @@ exec(add, {a: 1, b:2});
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a></li>
</ul>
</div><p>返回脚本执行的路径。对于一个脚本文件而言为这个脚本所在的文件夹;对于其他脚本,例如字符串脚本,则为<code>null</code>或者执行时的设置值。</p>
<h1>ScriptConfig<span><a class="mark" href="#engines_scriptconfig" id="engines_scriptconfig">#</a></span></h1>
<h2>ScriptEngine.getSource()<span><a class="mark" href="#engines_scriptengine_getsource" id="engines_scriptengine_getsource">#</a></span></h2>
<div class="signature"><ul>
<li>返回 <a href="#engines_scriptsource">ScriptSource</a></li>
</ul>
</div><p>返回当前脚本引擎正在执行的脚本对象。</p>
<pre><code>log(engines.myEngine().getSource());
</code></pre><h2>ScriptEngine.emit(eventName[, ...args])<span><a class="mark" href="#engines_scriptengine_emit_eventname_args" id="engines_scriptengine_emit_eventname_args">#</a></span></h2>
<div class="signature"><ul>
<li><code>eventName</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 事件名称</li>
<li><code>...args</code> <span class="type">&lt;any&gt;</span> 事件参数</li>
</ul>
</div><p>向该脚本引擎发送一个事件该事件可以在该脚本引擎对应的脚本的events模块监听到并在脚本主线程执行事件处理。</p>
<p>例如脚本receiver.js的内容如下</p>
<pre><code>//监听say事件
events.on(&quot;say&quot;, function(words){
toastLog(words);
});
//保持脚本运行
setInterval(()=&gt;{}, 1000);
</code></pre><p>同一目录另一脚本可以启动他并发送该事件:</p>
<pre><code>//运行脚本
var e = engines.execScriptFile(&quot;./receiver.js&quot;);
//等待脚本启动
sleep(2000);
//向该脚本发送事件
e.getEngine().emit(&quot;say&quot;, &quot;你好&quot;);
</code></pre><h1>ScriptConfig<span><a class="mark" href="#engines_scriptconfig" id="engines_scriptconfig">#</a></span></h1>
<p>脚本执行时的配置。</p>
<h2>delay<span><a class="mark" href="#engines_delay" id="engines_delay">#</a></span></h2>
<div class="signature"><ul>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -81,6 +83,7 @@
<li><span class="stability_undefined"><a href="#events_events_oncekeyup_keyname_listener">events.onceKeyUp(keyName, listener)</a></span></li>
<li><span class="stability_undefined"><a href="#events_events_removeallkeydownlisteners_keyname">events.removeAllKeyDownListeners(keyName)</a></span></li>
<li><span class="stability_undefined"><a href="#events_events_removeallkeyuplisteners_keyname">events.removeAllKeyUpListeners(keyName)</a></span></li>
<li><span class="stability_undefined"><a href="#events_events_setkeyinterceptionenabled_key_enabled">events.setKeyInterceptionEnabled([key, ]enabled)</a></span></li>
<li><span class="stability_undefined"><a href="#events_events_observetouch">events.observeTouch()</a></span></li>
<li><span class="stability_undefined"><a href="#events_events_settoucheventtimeout_timeout">events.setTouchEventTimeout(timeout)</a></span></li>
<li><span class="stability_undefined"><a href="#events_events_gettoucheventtimeout">events.getTouchEventTimeout()</a></span></li>
@ -132,6 +135,7 @@
<li><span class="stability_undefined"><a href="#events_eventemitter_setmaxlisteners_n">EventEmitter.setMaxListeners(n)</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#events_events_broadcast">events.broadcast: 脚本间广播</a></span></li>
</ul>
</div>
@ -217,6 +221,21 @@ events.onKeyDown(&quot;home&quot;, function(event){
<li><code>keyName</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 按键名称</li>
</ul>
</div><p>删除该按键的KeyUp(弹起)事件的所有监听。</p>
<h2>events.setKeyInterceptionEnabled([key, ]enabled)<span><a class="mark" href="#events_events_setkeyinterceptionenabled_key_enabled" id="events_events_setkeyinterceptionenabled_key_enabled">#</a></span></h2>
<div class="signature"><ul>
<li><code>enabled</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a></li>
<li><code>key</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 要屏蔽的按键</li>
</ul>
</div><p>设置按键屏蔽是否启用。所谓按键屏蔽指的是,屏蔽原有按键的功能,例如使得音量键不再能调节音量,但此时仍然能通过按键事件监听按键。</p>
<p>如果不加参数key则会屏蔽所有按键。</p>
<p>例如,调用<code>events.setKeyInterceptionEnabled(true)</code>会使系统的音量、Home、返回等键不再具有调节音量、回到主页、返回的作用但此时仍然能通过按键事件监听按键。</p>
<p>该函数通常于按键监听结合,例如想监听音量键并使音量键按下时不弹出音量调节框则为:</p>
<pre><code>events.setKeyInterceptionEnabled(&quot;volume_up&quot;, true);
events.observeKey();
events.onKeyDown(&quot;volume_up&quot;, ()=&gt;{
log(&quot;音量上键被按下&quot;);
});
</code></pre><p>只要有一个脚本屏蔽了某个按键,该按键便会被屏蔽;当脚本退出时,会自动解除所有按键屏蔽。</p>
<h2>events.observeTouch()<span><a class="mark" href="#events_events_observetouch" id="events_events_observetouch">#</a></span></h2>
<p>启用屏幕触摸监听。需要root权限</p>
<p>只有这个函数被成功执行后, 触摸事件的监听才有效。</p>
@ -571,7 +590,18 @@ myEmitter.emit(&#39;event&#39;);
</ul>
</div><p>默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 此限制有助于寻找内存泄露。 但是,并不是所有的事件都要被限为 10 个。 emitter.setMaxListeners() 方法允许修改指定的 EventEmitter 实例的限制。 值设为 Infinity或 0表明不限制监听器的数量。</p>
<p>返回一个 EventEmitter 引用,可以链式调用。</p>
<h1>events.broadcast: 脚本间广播<span><a class="mark" href="#events_events_broadcast" id="events_events_broadcast">#</a></span></h1>
<p>脚本间通信除了使用engines模块提供的<code>ScriptEngine.emit()</code>方法以外也可以使用events模块提供的broadcast广播。</p>
<p>events.broadcast本身是一个EventEmitter但它的事件是在脚本间共享的所有脚本都能发送和监听这些事件事件处理会在脚本主线程执行后续可能加入函数<code>onThisThread(eventName, ...args)</code>来提供在其他线程执行的能力)。</p>
<p>例如在一个脚本发送一个广播hello:</p>
<pre><code>events.broadcast.emit(&quot;hello&quot;, &quot;小明&quot;);
</code></pre><p>在其他脚本中监听并处理:</p>
<pre><code>events.broadcast.on(&quot;hello&quot;, function(name){
toast(&quot;你好, &quot; + name);
});
//保持脚本运行
setInterval(()=&gt;{}, 1000);
</code></pre>
</div>
</div>
</div>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -74,19 +76,32 @@
<ul>
<li><span class="stability_undefined"><a href="#floaty_floaty">Floaty</a></span><ul>
<li><span class="stability_undefined"><a href="#floaty_floaty_window_layout">floaty.window(layout)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floaty_rawwindow_layout">floaty.rawWindow(layout)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floaty_closeall">floaty.closeAll()</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow">FloatyWindow</a></span><ul>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_setadjustenabled_enabled">FloatyWindow.setAdjustEnabled(enabled)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_setposition_x_y">FloatyWindow.setPosition(x, y)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_getx">FloatyWindow.getX()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_gety">FloatyWindow.getY()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_setsize_width_height">FloatyWindow.setSize(width, height)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_getwidht">FloatyWindow.getWidht()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_getheight">FloatyWindow.getHeight()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_close">FloatyWindow.close()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_floatywindow_exitonclose">FloatyWindow.exitOnClose()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_setadjustenabled_enabled">window.setAdjustEnabled(enabled)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_setposition_x_y">window.setPosition(x, y)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_getx">window.getX()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_gety">window.getY()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_setsize_width_height">window.setSize(width, height)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_getwidht">window.getWidht()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_getheight">window.getHeight()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_close">window.close()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_exitonclose">window.exitOnClose()</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#floaty_floatyrawwindow">FloatyRawWindow</a></span><ul>
<li><span class="stability_undefined"><a href="#floaty_window_settouchable_touchable">window.setTouchable(touchable)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_setposition_x_y_1">window.setPosition(x, y)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_getx_1">window.getX()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_gety_1">window.getY()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_setsize_width_height_1">window.setSize(width, height)</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_getwidht_1">window.getWidht()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_getheight_1">window.getHeight()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_close_1">window.close()</a></span></li>
<li><span class="stability_undefined"><a href="#floaty_window_exitonclose_1">window.exitOnClose()</a></span></li>
</ul>
</li>
</ul>
@ -103,6 +118,7 @@
<li><code>layout</code> <span class="type">&lt;xml&gt;</span> | <span class="type">&lt;View&gt;</span> 悬浮窗界面的XML或者View</li>
</ul>
</div><p>指定悬浮窗的布局,创建并<strong>显示</strong>一个悬浮窗,返回一个<code>FloatyWindow</code>对象。</p>
<p>该悬浮窗自带关闭、调整大小、调整位置按键,可根据需要调用<code>setAdjustEnabled()</code>函数来显示或隐藏。</p>
<p>其中layout参数可以是xml布局或者一个View更多信息参见ui模块的说明。</p>
<p>例子:</p>
<pre><code>var w = floaty.window(
@ -118,40 +134,116 @@ setTimeout(()=&gt;{
<pre><code>ui.run(function(){
w.text.setText(&quot;文本&quot;);
});
</code></pre><h2>floaty.closeAll()<span><a class="mark" href="#floaty_floaty_closeall" id="floaty_floaty_closeall">#</a></span></h2>
</code></pre><p>有关返回的<code>FloatyWindow</code>对象的说明,参见下面的<code>FloatyWindow</code>章节。</p>
<h2>floaty.rawWindow(layout)<span><a class="mark" href="#floaty_floaty_rawwindow_layout" id="floaty_floaty_rawwindow_layout">#</a></span></h2>
<div class="signature"><ul>
<li><code>layout</code> <span class="type">&lt;xml&gt;</span> | <span class="type">&lt;View&gt;</span> 悬浮窗界面的XML或者View</li>
</ul>
</div><p>指定悬浮窗的布局,创建并<strong>显示</strong>一个原始悬浮窗,返回一个<code>FloatyRawWindow</code>对象。</p>
<p><code>floaty.window()</code>函数不同的是,该悬浮窗不会增加任何额外设施(例如调整大小、位置按钮),您可以根据自己需要编写任何布局。</p>
<p>而且,该悬浮窗支持完全全屏,可以覆盖状态栏,因此可以做护眼模式之类的应用。</p>
<pre><code>var w = floaty.rawWindow(
&lt;frame gravity=&quot;center&quot;&gt;
&lt;text id=&quot;text&quot;&gt;悬浮文字&lt;/text&gt;
&lt;/frame&gt;
);
w.setPosition(500, 500);
setTimeout(()=&gt;{
w.close();
}, 2000);
</code></pre><p>这段代码运行后将会在屏幕上显示悬浮文字,并在两秒后消失。</p>
<p>有关返回的<code>FloatyRawWindow</code>对象的说明,参见下面的<code>FloatyRawWindow</code>章节。</p>
<h2>floaty.closeAll()<span><a class="mark" href="#floaty_floaty_closeall" id="floaty_floaty_closeall">#</a></span></h2>
<p>关闭所有本脚本的悬浮窗。</p>
<h1>FloatyWindow<span><a class="mark" href="#floaty_floatywindow" id="floaty_floatywindow">#</a></span></h1>
<p>悬浮窗对象,可通过<code>FloatyWindow.{id}</code>获取悬浮窗界面上的元素。例如, 悬浮窗window上一个控件的id为aaa, 那么<code>window.aaa</code>即可获取到该控件类似于ui。</p>
<h2>FloatyWindow.setAdjustEnabled(enabled)<span><a class="mark" href="#floaty_floatywindow_setadjustenabled_enabled" id="floaty_floatywindow_setadjustenabled_enabled">#</a></span></h2>
<h2>window.setAdjustEnabled(enabled)<span><a class="mark" href="#floaty_window_setadjustenabled_enabled" id="floaty_window_setadjustenabled_enabled">#</a></span></h2>
<div class="signature"><ul>
<li><code>enabled</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 是否启用悬浮窗调整(大小、位置)</li>
</ul>
</div><p>如果enabled为true则在悬浮窗左上角、右上角显示可供位置、大小调整的标示就像控制台一样
如果enabled为false则隐藏上述标示。</p>
<h2>FloatyWindow.setPosition(x, y)<span><a class="mark" href="#floaty_floatywindow_setposition_x_y" id="floaty_floatywindow_setposition_x_y">#</a></span></h2>
<h2>window.setPosition(x, y)<span><a class="mark" href="#floaty_window_setposition_x_y" id="floaty_window_setposition_x_y">#</a></span></h2>
<div class="signature"><ul>
<li><code>x</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> x</li>
<li><code>x</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> y</li>
</ul>
</div><p>设置悬浮窗位置。</p>
<h2>FloatyWindow.getX()<span><a class="mark" href="#floaty_floatywindow_getx" id="floaty_floatywindow_getx">#</a></span></h2>
<h2>window.getX()<span><a class="mark" href="#floaty_window_getx" id="floaty_window_getx">#</a></span></h2>
<p>返回悬浮窗位置的X坐标。</p>
<h2>FloatyWindow.getY()<span><a class="mark" href="#floaty_floatywindow_gety" id="floaty_floatywindow_gety">#</a></span></h2>
<h2>window.getY()<span><a class="mark" href="#floaty_window_gety" id="floaty_window_gety">#</a></span></h2>
<p>返回悬浮窗位置的Y坐标。</p>
<h2>FloatyWindow.setSize(width, height)<span><a class="mark" href="#floaty_floatywindow_setsize_width_height" id="floaty_floatywindow_setsize_width_height">#</a></span></h2>
<h2>window.setSize(width, height)<span><a class="mark" href="#floaty_window_setsize_width_height" id="floaty_window_setsize_width_height">#</a></span></h2>
<div class="signature"><ul>
<li><code>width</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 宽度</li>
<li><code>height</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 高度</li>
</ul>
</div><p>设置悬浮窗宽高。</p>
<h2>FloatyWindow.getWidht()<span><a class="mark" href="#floaty_floatywindow_getwidht" id="floaty_floatywindow_getwidht">#</a></span></h2>
<h2>window.getWidht()<span><a class="mark" href="#floaty_window_getwidht" id="floaty_window_getwidht">#</a></span></h2>
<p>返回悬浮窗宽度。</p>
<h2>FloatyWindow.getHeight()<span><a class="mark" href="#floaty_floatywindow_getheight" id="floaty_floatywindow_getheight">#</a></span></h2>
<h2>window.getHeight()<span><a class="mark" href="#floaty_window_getheight" id="floaty_window_getheight">#</a></span></h2>
<p>返回悬浮窗高度。</p>
<h2>FloatyWindow.close()<span><a class="mark" href="#floaty_floatywindow_close" id="floaty_floatywindow_close">#</a></span></h2>
<h2>window.close()<span><a class="mark" href="#floaty_window_close" id="floaty_window_close">#</a></span></h2>
<p>关闭悬浮窗。如果悬浮窗已经是关闭状态,则此函数将不执行任何操作。</p>
<p>被关闭后的悬浮窗不能再显示。</p>
<h2>FloatyWindow.exitOnClose()<span><a class="mark" href="#floaty_floatywindow_exitonclose" id="floaty_floatywindow_exitonclose">#</a></span></h2>
<h2>window.exitOnClose()<span><a class="mark" href="#floaty_window_exitonclose" id="floaty_window_exitonclose">#</a></span></h2>
<p>使悬浮窗被关闭时自动结束脚本运行。</p>
<h1>FloatyRawWindow<span><a class="mark" href="#floaty_floatyrawwindow" id="floaty_floatyrawwindow">#</a></span></h1>
<p>原始悬浮窗对象,可通过<code>window.{id}</code>获取悬浮窗界面上的元素。例如, 悬浮窗window上一个控件的id为aaa, 那么<code>window.aaa</code>即可获取到该控件类似于ui。</p>
<h2>window.setTouchable(touchable)<span><a class="mark" href="#floaty_window_settouchable_touchable" id="floaty_window_settouchable_touchable">#</a></span></h2>
<div class="signature"><ul>
<li><code>touchable</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;Boolean&gt;</a> 是否可触摸</li>
</ul>
</div><p>设置悬浮窗是否可触摸如果为true, 则悬浮窗将接收到触摸、点击等事件并且无法继续传递到悬浮窗下面如果为false, 悬浮窗上的触摸、点击等事件将被直接传递到悬浮窗下面。处于安全考虑,被悬浮窗接收的触摸事情无法再继续传递到下层。</p>
<p>可以用此特性来制作护眼模式脚本。</p>
<pre><code>var w = floaty.rawWindow(
&lt;frame gravity=&quot;center&quot; bg=&quot;#44ffcc00&quot;/&gt;
);
w.setSize(-1, -1);
w.setTouchable(false);
setTimeout(()=&gt;{
w.close();
}, 4000);
</code></pre><h2>window.setPosition(x, y)<span><a class="mark" href="#floaty_window_setposition_x_y_1" id="floaty_window_setposition_x_y_1">#</a></span></h2>
<div class="signature"><ul>
<li><code>x</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> x</li>
<li><code>x</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> y</li>
</ul>
</div><p>设置悬浮窗位置。</p>
<h2>window.getX()<span><a class="mark" href="#floaty_window_getx_1" id="floaty_window_getx_1">#</a></span></h2>
<p>返回悬浮窗位置的X坐标。</p>
<h2>window.getY()<span><a class="mark" href="#floaty_window_gety_1" id="floaty_window_gety_1">#</a></span></h2>
<p>返回悬浮窗位置的Y坐标。</p>
<h2>window.setSize(width, height)<span><a class="mark" href="#floaty_window_setsize_width_height_1" id="floaty_window_setsize_width_height_1">#</a></span></h2>
<div class="signature"><ul>
<li><code>width</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 宽度</li>
<li><code>height</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 高度</li>
</ul>
</div><p>设置悬浮窗宽高。</p>
<p>特别地,如果设置为-1则为占满全屏设置为-2则为根据悬浮窗内容大小而定。例如</p>
<pre><code>var w = floaty.rawWindow(
&lt;frame gravity=&quot;center&quot; bg=&quot;#77ff0000&quot;&gt;
&lt;text id=&quot;text&quot;&gt;悬浮文字&lt;/text&gt;
&lt;/frame&gt;
);
w.setSize(-1, -1);
setTimeout(()=&gt;{
w.close();
}, 2000);
</code></pre><h2>window.getWidht()<span><a class="mark" href="#floaty_window_getwidht_1" id="floaty_window_getwidht_1">#</a></span></h2>
<p>返回悬浮窗宽度。</p>
<h2>window.getHeight()<span><a class="mark" href="#floaty_window_getheight_1" id="floaty_window_getheight_1">#</a></span></h2>
<p>返回悬浮窗高度。</p>
<h2>window.close()<span><a class="mark" href="#floaty_window_close_1" id="floaty_window_close_1">#</a></span></h2>
<p>关闭悬浮窗。如果悬浮窗已经是关闭状态,则此函数将不执行任何操作。</p>
<p>被关闭后的悬浮窗不能再显示。</p>
<h2>window.exitOnClose()<span><a class="mark" href="#floaty_window_exitonclose_1" id="floaty_window_exitonclose_1">#</a></span></h2>
<p>使悬浮窗被关闭时自动结束脚本运行。</p>
</div>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -85,6 +87,9 @@
<li><span class="stability_undefined"><a href="#globals_exit">exit()</a></span></li>
<li><span class="stability_undefined"><a href="#globals_random_min_max">random(min, max)</a></span></li>
<li><span class="stability_undefined"><a href="#globals_random">random()</a></span></li>
<li><span class="stability_undefined"><a href="#globals_requiresapi_api">requiresApi(api)</a></span></li>
<li><span class="stability_undefined"><a href="#globals_requiresautojsversion_version">requiresAutojsVersion(version)</a></span></li>
<li><span class="stability_undefined"><a href="#globals_runtime_requestpermissions_permissions">runtime.requestPermissions(permissions)</a></span></li>
<li><span class="stability_undefined"><a href="#globals_context">context</a></span></li>
</ul>
</li>
@ -190,6 +195,43 @@ for(var i = 0; i &lt; 100; i++){
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a></li>
</ul>
</div><p>返回在[0, 1)的随机浮点数。</p>
<h2>requiresApi(api)<span><a class="mark" href="#globals_requiresapi_api" id="globals_requiresapi_api">#</a></span></h2>
<div class="signature"><ul>
<li><code>api</code> Android版本号</li>
</ul>
</div><p>表示此脚本需要Android API版本达到指定版本才能运行。例如<code>requiresApi(19)</code>表示脚本需要在Android 4.4以及以上运行。</p>
<p>调用该函数时会判断运行脚本的设备系统的版本号,如果没有达到要求则抛出异常。</p>
<p>可以参考以下Android API和版本的对照表:</p>
<p> 平台版本: API级别</p>
<p> Android 7.0 24</p>
<p> Android 6.0 23</p>
<p> Android 5.1 22</p>
<p> Android 5.0 21</p>
<p> Android 4.4W 20</p>
<p> Android 4.4 19</p>
<p> Android 4.3 18</p>
<h2>requiresAutojsVersion(version)<span><a class="mark" href="#globals_requiresautojsversion_version" id="globals_requiresautojsversion_version">#</a></span></h2>
<div class="signature"><ul>
<li><code>version</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> Auto.js的版本或版本号</li>
</ul>
</div><p>表示此脚本需要Auto.js版本达到指定版本才能运行。例如<code>requiresAutojsVersion(&quot;3.0.0 Beta&quot;)</code>表示脚本需要在Auto.js 3.0.0 Beta以及以上运行。</p>
<p>调用该函数时会判断运行脚本的Auto.js的版本号如果没有达到要求则抛出异常。</p>
<p>version参数可以是整数表示版本号例如<code>requiresAutojsVersion(250)</code>;也可以是字符串格式表示的版本,例如&quot;3.0.0 Beta&quot;, &quot;3.1.0 Alpha4&quot;, &quot;3.2.0&quot;等。</p>
<p>可以通过<code>app.autojs.versionCode</code><code>app.autojs.versionName</code>获取当前的Auto.js版本号和版本。</p>
<h2>runtime.requestPermissions(permissions)<span><a class="mark" href="#globals_runtime_requestpermissions_permissions" id="globals_runtime_requestpermissions_permissions">#</a></span></h2>
<div class="signature"><ul>
<li><code>permissions</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type">&lt;Array&gt;</a> 权限的字符串数组</li>
</ul>
</div><p>动态申请安卓的权限。例如:</p>
<pre><code>//请求GPS权限
runtime.requestPermissions([&quot;access_fine_location&quot;]);
</code></pre><p>尽管安卓有很多权限但必须写入Manifest才能动态申请为了防止权限的滥用目前Auto.js只能额外申请两个权限</p>
<ul>
<li><code>access_fine_location</code> GPS权限</li>
<li><code>record_audio</code> 录音权限</li>
</ul>
<p>您可以通过APK编辑器来增加Auto.js以及Auto.js打包的应用的权限。</p>
<p>安卓所有的权限列表参见<a href="https://developer.android.com/guide/topics/permissions/overview">Permissions Overview</a>。(并没有用)</p>
<h2>context<span><a class="mark" href="#globals_context" id="globals_context">#</a></span></h2>
<p>全局变量。一个android.content.Context对象。</p>
<p>注意该对象为ApplicationContext因此不能用于界面、对话框等的创建。</p>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -116,17 +118,15 @@ http.get(&quot;www.baidu.com&quot;, {}, function(res, err){
console.error(err);
return;
}
log(&quot;code = &quot; + r.statusCode);
log(&quot;html = &quot; + r.body.string());
log(&quot;code = &quot; + res.statusCode);
log(&quot;html = &quot; + res.body.string());
});
</code></pre><p>如果要增加HTTP头部信息则在options参数中添加例如</p>
<pre><code>console.show();
var r = http.get(&quot;www.baidu.com&quot;, {
headers: {
&quot;Accept-Language&quot;: &quot;zh-cn,zh;q=0.5&quot;,
&quot;User-Agent: &quot;Mozilla/5.0 (Macintosh; Intel Mac OS X
10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56
Safari/535.11&quot;
&#39;Accept-Language&#39;: &#39;zh-cn,zh;q=0.5&#39;,
&#39;User-Agent&#39;: &#39;Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11&#39;
}
});
log(&quot;code = &quot; + r.statusCode);

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images active" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -85,14 +87,31 @@
<li><span class="stability_undefined"><a href="#images_colors_equals_color1_color2">colors.equals(color1, color2)</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#images_colors_black">colors.BLACK</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_dkgray">colors.DKGRAY</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_gray">colors.GRAY</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_ltgray">colors.LTGRAY</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_white">colors.WHITE</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_red">colors.RED</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_green">colors.GREEN</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_blue">colors.BLUE</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_yellow">colors.YELLOW</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_cyan">colors.CYAN</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_magenta">colors.MAGENTA</a></span></li>
<li><span class="stability_undefined"><a href="#images_colors_transparent">colors.TRANSPARENT</a></span></li>
<li><span class="stability_2"><a href="#images_images">Images</a></span><ul>
<li><span class="stability_undefined"><a href="#images_images_requestscreencapture_landscape">images.requestScreenCapture([landscape])</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_capturescreen">images.captureScreen()</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_capturescreen_path">images.captureScreen(path)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_pixel_image_x_y">images.pixel(image, x, y)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_save_image_path">images.save(image, path)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_copy_img">images.copy(img)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_save_image_path_format_png_quality_100">images.save(image, path[, format = &quot;png&quot;, quality = 100])</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_read_path">images.read(path)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_load_url">images.load(url)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_frombase64_base64">images.fromBase64(base64)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_tobase64_img_format_png_quality_100">images.toBase64(img[, format = &quot;png&quot;, quality = 100])</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_frombytes_bytes">images.fromBytes(bytes)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_tobytes_img_format_png_quality_100">images.toBytes(img[, format = &quot;png&quot;, quality = 100])</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_clip_img_x_y_w_h">images.clip(img, x, y, w, h)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_findcolor_image_color_options">images.findColor(image, color, options)</a></span></li>
<li><span class="stability_undefined"><a href="#images_images_findcolorinregion_img_color_x_y_width_height_threshold">images.findColorInRegion(img, color, x, y[, width, height, threshold])</a></span></li>
@ -202,7 +221,31 @@
</div><p>返回两个颜色是否相等。<em>*注意该函数会忽略Alpha通道的值进行比较</em></p>
<pre><code>log(colors.equals(&quot;#112233&quot;, &quot;#112234&quot;));
log(colors.equals(0xFF112233, 0xFF223344));
</code></pre><h1>Images<span><a class="mark" href="#images_images" id="images_images">#</a></span></h1>
</code></pre><h1>colors.BLACK<span><a class="mark" href="#images_colors_black" id="images_colors_black">#</a></span></h1>
<p>黑色,颜色值 #FF000000</p>
<h1>colors.DKGRAY<span><a class="mark" href="#images_colors_dkgray" id="images_colors_dkgray">#</a></span></h1>
<p>深灰色,颜色值 #FF444444</p>
<h1>colors.GRAY<span><a class="mark" href="#images_colors_gray" id="images_colors_gray">#</a></span></h1>
<p>灰色,颜色值 #FF888888</p>
<h1>colors.LTGRAY<span><a class="mark" href="#images_colors_ltgray" id="images_colors_ltgray">#</a></span></h1>
<p>亮灰色,颜色值 #FFCCCCCC</p>
<h1>colors.WHITE<span><a class="mark" href="#images_colors_white" id="images_colors_white">#</a></span></h1>
<p>白色,颜色值 #FFFFFFFF</p>
<h1>colors.RED<span><a class="mark" href="#images_colors_red" id="images_colors_red">#</a></span></h1>
<p>红色,颜色值 #FFFF0000</p>
<h1>colors.GREEN<span><a class="mark" href="#images_colors_green" id="images_colors_green">#</a></span></h1>
<p>绿色,颜色值 #FF00FF00</p>
<h1>colors.BLUE<span><a class="mark" href="#images_colors_blue" id="images_colors_blue">#</a></span></h1>
<p>蓝色,颜色值 #FF0000FF</p>
<h1>colors.YELLOW<span><a class="mark" href="#images_colors_yellow" id="images_colors_yellow">#</a></span></h1>
<p>黄色,颜色值 #FFFFFF00</p>
<h1>colors.CYAN<span><a class="mark" href="#images_colors_cyan" id="images_colors_cyan">#</a></span></h1>
<p>青色,颜色值 #FF00FFFF</p>
<h1>colors.MAGENTA<span><a class="mark" href="#images_colors_magenta" id="images_colors_magenta">#</a></span></h1>
<p>品红色,颜色值 #FFFF00FF</p>
<h1>colors.TRANSPARENT<span><a class="mark" href="#images_colors_transparent" id="images_colors_transparent">#</a></span></h1>
<p>透明,颜色值 #00000000</p>
<h1>Images<span><a class="mark" href="#images_images" id="images_images">#</a></span></h1>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p>images模块提供了一些手机设备中常见的图片处理函数包括截图、读写图片、图片剪裁、找色、找图等。</p>
<h2>images.requestScreenCapture([landscape])<span><a class="mark" href="#images_images_requestscreencapture_landscape" id="images_images_requestscreencapture_landscape">#</a></span></h2>
<div class="signature"><ul>
@ -257,13 +300,30 @@ toast(colors.toString(color));
</div><p>返回图片image在点(x, y)处的像素的ARGB值。 </p>
<p>该值的格式为0xAARRGGBB是一个&quot;32位整数&quot;(虽然JavaScript中并不区分整数类型和其他数值类型)。</p>
<p>坐标系以图片左上角为原点。以图片左侧边为y轴上侧边为x轴。</p>
<h2>images.save(image, path)<span><a class="mark" href="#images_images_save_image_path" id="images_images_save_image_path">#</a></span></h2>
<h2>images.copy(img)<span><a class="mark" href="#images_images_copy_img" id="images_images_copy_img">#</a></span></h2>
<div class="signature"><ul>
<li><code>image</code> <span class="type">&lt;image&gt;</span> 图片</li>
<li><code>path</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 路劲</li>
<li><code>img</code> <span class="type">&lt;Image&gt;</span> 图片</li>
<li>返回 <span class="type">&lt;Image&gt;</span></li>
</ul>
</div><p>复制一张图片并返回新的副本。该函数会完全复制img对象的数据。</p>
<h2>images.save(image, path[, format = &quot;png&quot;, quality = 100])<span><a class="mark" href="#images_images_save_image_path_format_png_quality_100" id="images_images_save_image_path_format_png_quality_100">#</a></span></h2>
<div class="signature"><ul>
<li><code>image</code> <span class="type">&lt;Image&gt;</span> 图片</li>
<li><code>path</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 路径</li>
<li><code>format</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 图片格式,可选的值为:<ul>
<li><code>png</code></li>
<li><code>jpeg</code>/<code>jpg</code></li>
<li><code>webp</code></li>
</ul>
</li>
<li><code>quality</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 图片质量为0~100的整数值</li>
</ul>
</div><p>把图片image以PNG格式保存到path中。如果文件不存在会被创建文件存在会被覆盖。</p>
<h2>images.read(path)<span><a class="mark" href="#images_images_read_path" id="images_images_read_path">#</a></span></h2>
<pre><code>//把图片压缩为原来的一半质量并保存
var img = images.read(&quot;/sdcard/1.png&quot;);
images.save(img, &quot;/sdcard/1.jpg&quot;, &quot;jpg&quot;, 50);
app.viewFile(&quot;/sdcard/1.jpg&quot;);
</code></pre><h2>images.read(path)<span><a class="mark" href="#images_images_read_path" id="images_images_read_path">#</a></span></h2>
<div class="signature"><ul>
<li><code>path</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 图片路径</li>
</ul>
@ -273,6 +333,43 @@ toast(colors.toString(color));
<li><code>url</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 图片URL地址</li>
</ul>
</div><p>加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。</p>
<h2>images.fromBase64(base64)<span><a class="mark" href="#images_images_frombase64_base64" id="images_images_frombase64_base64">#</a></span></h2>
<div class="signature"><ul>
<li><code>base64</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 图片的Base64数据</li>
<li>返回 <span class="type">&lt;Image&gt;</span></li>
</ul>
</div><p>解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回<code>null</code></p>
<h2>images.toBase64(img[, format = &quot;png&quot;, quality = 100])<span><a class="mark" href="#images_images_tobase64_img_format_png_quality_100" id="images_images_tobase64_img_format_png_quality_100">#</a></span></h2>
<div class="signature"><ul>
<li><code>image</code> <span class="type">&lt;image&gt;</span> 图片</li>
<li><code>format</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 图片格式,可选的值为:<ul>
<li><code>png</code></li>
<li><code>jpeg</code>/<code>jpg</code></li>
<li><code>webp</code></li>
</ul>
</li>
<li><code>quality</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 图片质量为0~100的整数值</li>
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a></li>
</ul>
</div><p>把图片编码为base64数据并返回。</p>
<h2>images.fromBytes(bytes)<span><a class="mark" href="#images_images_frombytes_bytes" id="images_images_frombytes_bytes">#</a></span></h2>
<div class="signature"><ul>
<li><code>bytes</code> <span class="type">&lt;byte[]&gt;</span> 字节数组</li>
</ul>
</div><p>解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回<code>null</code></p>
<h2>images.toBytes(img[, format = &quot;png&quot;, quality = 100])<span><a class="mark" href="#images_images_tobytes_img_format_png_quality_100" id="images_images_tobytes_img_format_png_quality_100">#</a></span></h2>
<div class="signature"><ul>
<li><code>image</code> <span class="type">&lt;image&gt;</span> 图片</li>
<li><code>format</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 图片格式,可选的值为:<ul>
<li><code>png</code></li>
<li><code>jpeg</code>/<code>jpg</code></li>
<li><code>webp</code></li>
</ul>
</li>
<li><code>quality</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 图片质量为0~100的整数值</li>
<li>返回 <span class="type">&lt;byte[]&gt;</span></li>
</ul>
</div><p>把图片编码为字节数组并返回。</p>
<h2>images.clip(img, x, y, w, h)<span><a class="mark" href="#images_images_clip_img_x_y_w_h" id="images_images_clip_img_x_y_w_h">#</a></span></h2>
<div class="signature"><ul>
<li><code>img</code> <span class="type">&lt;Image&gt;</span> 图片</li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -98,8 +100,10 @@
<li><a href="http.html">Http - HTTP</a></li>
<li><a href="images.html">Images - 图片与图色处理</a></li>
<li><a href="keys.html">Keys - 按键模拟</a></li>
<li><a href="media.html">Media - 多媒体</a></li>
<li><a href="modules.html">Modules - 模块</a></li>
<li><a href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a href="sensors.html">Sensors - 传感器</a></li>
<li><a href="shell.html">Shell - Shell命令</a></li>
<li><a href="storages.html">Storages - 本地存储</a></li>
<li><a href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys active" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -0,0 +1,177 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Media | Auto.js 3.0.0 文档</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic">
<link rel="stylesheet" href="assets/style.css">
<link rel="stylesheet" href="assets/sh.css">
<link rel="canonical" href="https://nodejs.org/api/media.html">
</head>
<body class="alt apidoc" id="api-section-media">
<div id="content" class="clearfix">
<div id="column2" class="interior">
<div id="intro" class="interior">
<a href="/" title="返回首页">
Auto.js
</a>
</div>
<ul>
<li><a class="nav-documentation" href="documentation.html">关于本文档</a></li>
<li><a class="nav-http-www-w3school-com-cn-js-pro_js_syntax-asp" href="http://www.w3school.com.cn/js/pro_js_syntax.asp">W3CSchool - ECMAScript教程</a></li>
<li><a class="nav-http-es6-ruanyifeng-com-README" href="http://es6.ruanyifeng.com/#README">阮一峰 - ECMAScript 6教程</a></li>
</ul>
<div class="line"></div>
<ul>
<li><a class="nav-overview" href="overview.html">Overview - 综述</a></li>
<li><a class="nav-qa" href="qa.html">Q&amp;A - 常见问题</a></li>
<li><a class="nav-app" href="app.html">App - 应用</a></li>
<li><a class="nav-console" href="console.html">Console - 控制台</a></li>
<li><a class="nav-coordinates-based-automation" href="coordinates-based-automation.html">CoordinatesBasedAutomation - 基于坐标的操作</a></li>
<li><a class="nav-device" href="device.html">Device - 设备</a></li>
<li><a class="nav-dialogs" href="dialogs.html">Dialogs - 对话框</a></li>
<li><a class="nav-engines" href="engines.html">Engines - 脚本引擎</a></li>
<li><a class="nav-events" href="events.html">Events - 事件与监听</a></li>
<li><a class="nav-floaty" href="floaty.html">Floaty - 悬浮窗</a></li>
<li><a class="nav-files" href="files.html">Files - 文件系统</a></li>
<li><a class="nav-globals" href="globals.html">Globals - 一般全局函数</a></li>
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media active" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
<li><a class="nav-timers" href="timers.html">Timers - 定时器</a></li>
<li><a class="nav-ui" href="ui.html">UI - 用户界面</a></li>
<li><a class="nav-https-developer-mozilla-org-zh-CN-docs-Mozilla-Projects-Rhino-Scripting_Java" href="https://developer.mozilla.org/zh-CN/docs/Mozilla/Projects/Rhino/Scripting_Java">Work with Java - 调用Java API</a></li>
</ul>
<div class="line"></div>
<ul>
<li><a class="nav-https-github-com-hyb1996-NoRootScriptDroid" href="https://github.com/hyb1996/NoRootScriptDroid">GitHub项目 &amp; Issue提交</a></li>
<li><a class="nav-http-autojs-org" href="http://autojs.org">Auto.js交流社区</a></li>
</ul>
</div>
<div id="column1" data-id="media" class="interior">
<header>
<h1>Auto.js 3.0.0 文档</h1>
<div id="gtoc">
<p>
<a href="index.html" name="toc">索引</a> |
<a href="all.html">查看全部</a>
</p>
</div>
<hr>
</header>
<div id="toc">
<h2>目录</h2>
<ul>
<li><span class="stability_2"><a href="#media_media">Media</a></span><ul>
<li><span class="stability_undefined"><a href="#media_media_scanfile_path">media.scanFile(path)</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_playmusic_path_volume_looping">media.playMusic(path[, volume, looping])</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_musicseekto_msec">media.musicSeekTo(msec)</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_pausemusic">media.pauseMusic()</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_resumemusic">media.resumeMusic()</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_stopmusic">media.stopMusic()</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_ismusicplaying">media.isMusicPlaying()</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_getmusicduration">media.getMusicDuration()</a></span></li>
<li><span class="stability_undefined"><a href="#media_media_getmusiccurrentposition">media.getMusicCurrentPosition()</a></span></li>
</ul>
</li>
</ul>
</div>
<div id="apicontent">
<h1>Media<span><a class="mark" href="#media_media" id="media_media">#</a></span></h1>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p>media模块提供多媒体编程的支持。目前仅支持音乐播放和媒体文件扫描。后续会结合UI加入视频播放等功能。</p>
<p>需要注意是,使用该模块播放音乐时是在后台异步播放的,在脚本结束后会自动结束播放,因此可能需要插入诸如<code>sleep()</code>的语句来使脚本保持运行。例如:</p>
<pre><code>//播放音乐
media.playMusic(&quot;/sdcard/1.mp3&quot;);
//让音乐播放完
sleep(media.getMusicDuration());
</code></pre><h2>media.scanFile(path)<span><a class="mark" href="#media_media_scanfile_path" id="media_media_scanfile_path">#</a></span></h2>
<div class="signature"><ul>
<li><code>path</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 媒体文件路径</li>
</ul>
</div><p>扫描路径path的媒体文件将它加入媒体库中或者如果该文件以及被删除则通知媒体库移除该文件。</p>
<p>媒体库包括相册、音乐库等,因此该函数可以用于把某个图片文件加入相册。</p>
<pre><code>//请求截图
requestScreenCapture(false);
//截图
var im = captureScreen();
var path = &quot;/sdcard/screenshot.png&quot;;
//保存图片
im.saveTo(path);
//把图片加入相册
media.scanFile(path);
</code></pre><h2>media.playMusic(path[, volume, looping])<span><a class="mark" href="#media_media_playmusic_path_volume_looping" id="media_media_playmusic_path_volume_looping">#</a></span></h2>
<div class="signature"><ul>
<li><code>path</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 音乐文件路径</li>
<li><code>volume</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 播放音量为0~1的浮点数默认为1</li>
<li><code>looping</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 是否循环播放如果looping为<code>true</code>则循环播放,默认为<code>false</code></li>
</ul>
</div><p>播放音乐文件path。该函数不会显示任何音乐播放界面。如果文件不存在或者文件不是受支持的音乐格式则抛出<code>UncheckedIOException</code>异常。</p>
<pre><code>//播放音乐
media.playMusic(&quot;/sdcard/1.mp3&quot;);
//让音乐播放完
sleep(media.getMusicDuration());
</code></pre><p>如果要循环播放音乐则使用looping参数</p>
<pre><code>
</code></pre><p>//传递第三个参数为true以循环播放音乐
media.playMusic(&quot;/sdcard/1.mp3&quot;, 1, true);
//等待三次播放的时间
sleep(media.getMusicDuration() * 3);</p>
<pre><code>
</code></pre><p>如果要使用音乐播放器播放音乐,调用<code>app.viewFile(path)</code>函数。</p>
<h2>media.musicSeekTo(msec)<span><a class="mark" href="#media_media_musicseekto_msec" id="media_media_musicseekto_msec">#</a></span></h2>
<div class="signature"><ul>
<li><code>msec</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 毫秒数,表示音乐进度</li>
</ul>
</div><p>把当前播放进度调整到时间msec的位置。如果当前没有在播放音乐则调用函数没有任何效果。</p>
<p>例如要把音乐调到1分钟的位置<code>media.musicSeekTo(60 * 1000)</code></p>
<pre><code>//播放音乐
media.playMusic(&quot;/sdcard/1.mp3&quot;);
//调整到30秒的位置
media.musicSeekTo(30 * 1000);
//等待音乐播放完成
sleep(media.getMusicDuration() - 30 * 1000);
</code></pre><h2>media.pauseMusic()<span><a class="mark" href="#media_media_pausemusic" id="media_media_pausemusic">#</a></span></h2>
<p>暂停音乐播放。如果当前没有在播放音乐,则调用函数没有任何效果。</p>
<h2>media.resumeMusic()<span><a class="mark" href="#media_media_resumemusic" id="media_media_resumemusic">#</a></span></h2>
<p>继续音乐播放。如果当前没有播放过音乐,则调用该函数没有任何效果。</p>
<h2>media.stopMusic()<span><a class="mark" href="#media_media_stopmusic" id="media_media_stopmusic">#</a></span></h2>
<p>停止音乐播放。如果当前没有在播放音乐,则调用函数没有任何效果。</p>
<h2>media.isMusicPlaying()<span><a class="mark" href="#media_media_ismusicplaying" id="media_media_ismusicplaying">#</a></span></h2>
<div class="signature"><ul>
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a></li>
</ul>
</div><p>返回当前是否正在播放音乐。</p>
<h2>media.getMusicDuration()<span><a class="mark" href="#media_media_getmusicduration" id="media_media_getmusicduration">#</a></span></h2>
<div class="signature"><ul>
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a></li>
</ul>
</div><p>返回当前音乐的时长。单位毫秒。</p>
<h2>media.getMusicCurrentPosition()<span><a class="mark" href="#media_media_getmusiccurrentposition" id="media_media_getmusiccurrentposition">#</a></span></h2>
<div class="signature"><ul>
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a></li>
</ul>
</div><p>返回当前音乐的播放进度(已经播放的时间),单位毫秒。</p>
</div>
</div>
</div>
<script src="assets/sh_main.js"></script>
<script src="assets/sh_javascript.min.js"></script>
<script>highlight(undefined, undefined, 'pre');</script>
<!-- __TRACKING__ -->
</body>
</html>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules active" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -0,0 +1,321 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sensors | Auto.js 3.0.0 文档</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic">
<link rel="stylesheet" href="assets/style.css">
<link rel="stylesheet" href="assets/sh.css">
<link rel="canonical" href="https://nodejs.org/api/sensors.html">
</head>
<body class="alt apidoc" id="api-section-sensors">
<div id="content" class="clearfix">
<div id="column2" class="interior">
<div id="intro" class="interior">
<a href="/" title="返回首页">
Auto.js
</a>
</div>
<ul>
<li><a class="nav-documentation" href="documentation.html">关于本文档</a></li>
<li><a class="nav-http-www-w3school-com-cn-js-pro_js_syntax-asp" href="http://www.w3school.com.cn/js/pro_js_syntax.asp">W3CSchool - ECMAScript教程</a></li>
<li><a class="nav-http-es6-ruanyifeng-com-README" href="http://es6.ruanyifeng.com/#README">阮一峰 - ECMAScript 6教程</a></li>
</ul>
<div class="line"></div>
<ul>
<li><a class="nav-overview" href="overview.html">Overview - 综述</a></li>
<li><a class="nav-qa" href="qa.html">Q&amp;A - 常见问题</a></li>
<li><a class="nav-app" href="app.html">App - 应用</a></li>
<li><a class="nav-console" href="console.html">Console - 控制台</a></li>
<li><a class="nav-coordinates-based-automation" href="coordinates-based-automation.html">CoordinatesBasedAutomation - 基于坐标的操作</a></li>
<li><a class="nav-device" href="device.html">Device - 设备</a></li>
<li><a class="nav-dialogs" href="dialogs.html">Dialogs - 对话框</a></li>
<li><a class="nav-engines" href="engines.html">Engines - 脚本引擎</a></li>
<li><a class="nav-events" href="events.html">Events - 事件与监听</a></li>
<li><a class="nav-floaty" href="floaty.html">Floaty - 悬浮窗</a></li>
<li><a class="nav-files" href="files.html">Files - 文件系统</a></li>
<li><a class="nav-globals" href="globals.html">Globals - 一般全局函数</a></li>
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors active" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
<li><a class="nav-timers" href="timers.html">Timers - 定时器</a></li>
<li><a class="nav-ui" href="ui.html">UI - 用户界面</a></li>
<li><a class="nav-https-developer-mozilla-org-zh-CN-docs-Mozilla-Projects-Rhino-Scripting_Java" href="https://developer.mozilla.org/zh-CN/docs/Mozilla/Projects/Rhino/Scripting_Java">Work with Java - 调用Java API</a></li>
</ul>
<div class="line"></div>
<ul>
<li><a class="nav-https-github-com-hyb1996-NoRootScriptDroid" href="https://github.com/hyb1996/NoRootScriptDroid">GitHub项目 &amp; Issue提交</a></li>
<li><a class="nav-http-autojs-org" href="http://autojs.org">Auto.js交流社区</a></li>
</ul>
</div>
<div id="column1" data-id="sensors" class="interior">
<header>
<h1>Auto.js 3.0.0 文档</h1>
<div id="gtoc">
<p>
<a href="index.html" name="toc">索引</a> |
<a href="all.html">查看全部</a>
</p>
</div>
<hr>
</header>
<div id="toc">
<h2>目录</h2>
<ul>
<li><span class="stability_2"><a href="#sensors_sensors">Sensors</a></span><ul>
<li><span class="stability_undefined"><a href="#sensors_sensors_register_sensorname_delay">sensors.register(sensorName[, delay])</a></span></li>
<li><span class="stability_undefined"><a href="#sensors_sensors_unregister_emitter">sensors.unregister(emitter)</a></span></li>
<li><span class="stability_undefined"><a href="#sensors_sensors_unregisterall">sensors.unregisterAll()</a></span></li>
<li><span class="stability_undefined"><a href="#sensors_sensors_ignoresunsupportedsensor">sensors.ignoresUnsupportedSensor</a></span></li>
<li><span class="stability_undefined"><a href="#sensors_unsupported_sensor">事件: &#39;unsupported_sensor&#39;</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#sensors_sensoreventemitter">SensorEventEmitter</a></span><ul>
<li><span class="stability_undefined"><a href="#sensors_change">事件: &#39;change&#39;</a></span></li>
<li><span class="stability_undefined"><a href="#sensors_accuracy_change">事件: &#39;accuracy_change&#39;</a></span></li>
</ul>
</li>
</ul>
</div>
<div id="apicontent">
<h1>Sensors<span><a class="mark" href="#sensors_sensors" id="sensors_sensors">#</a></span></h1>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p>sensors模块提供了获取手机上的传感器的信息的支持这些传感器包括距离传感器、光线光感器、重力传感器、方向传感器等。需要指出的是脚本只能获取传感器的数据<strong>不能模拟或伪造传感器的数据和事件</strong>,因此诸如模拟摇一摇的功能是无法实现的。</p>
<p>要监听一个传感器时,需要使用<code>sensors.register()</code>注册监听器,之后才能开始监听;不需要监听时则调用<code>sensors.unregister()</code>注销监听器。在脚本结束时会自动注销所有的监听器。同时,这种监听会使脚本保持运行状态,如果不注销监听器,脚本会一直保持运行状态。</p>
<p>例如,监听光线传感器的代码为:</p>
<pre><code>//光线传感器监听
sensors.register(&quot;light&quot;).on(&quot;change&quot;, (event, light)=&gt;{
log(&quot;当前光强度为&quot;, light);
});
</code></pre><p>要注意的是,每个传感器的数据并不相同,所以对他们调用<code>on()</code>监听事件时的回调函数参数也不是相同,例如光线传感器参数为<code>(event, light)</code>,加速度传感器参数为<code>(event, ax, ay, az)</code>。甚至在某些设备上的传感器参数有所增加,例如华为手机的距离传感器为三个参数,一般手机只有一个参数。</p>
<p>常用的传感器及其事件参数如下表:</p>
<ul>
<li><p><code>accelerometer</code> 加速度传感器,参数<code>(event, ax, ay, az)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>ax</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> x轴上的加速度单位m/s^2</li>
<li><code>ay</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> y轴上的加速度单位m/s^2</li>
<li><p><code>az</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> z轴上的加速度单位m/s^2
这里的x轴y轴z轴所属的坐标系统如下图(其中z轴垂直于设备屏幕表面):</p>
<p>!<img src="#images/axis_device.png" alt="axis_device"></p>
</li>
</ul>
</li>
<li><p><code>orientation</code> 方向传感器,参数<code>(event, azimuth, pitch, roll)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>azimuth</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 方位角从地磁指北方向线起依顺时针方向到y轴之间的水平夹角单位角度范围0~359</li>
<li><code>pitch</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 绕x轴旋转的角度当设备水平放置时该值为0当设备顶部翘起时该值为正数当设备尾部翘起时该值为负数单位角度范围-180~180</li>
<li><code>roll</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 绕y轴顺时针旋转的角度单位角度范围-90~90</li>
</ul>
</li>
<li><p><code>gyroscope</code> 陀螺仪传感器,参数<code>(event, wx, wy, wz)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>wx</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 绕x轴的角速度单位弧度/s</li>
<li><code>wy</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 绕y轴的角速度单位弧度/s</li>
<li><code>wz</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 绕z轴的角速度单位弧度/s</li>
</ul>
</li>
<li><p><code>magnetic_field</code> 磁场传感器,参数<code>(event, bx, by, bz)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>bx</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> x轴上的磁场强度单位uT</li>
<li><code>by</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> y轴上的磁场强度单位uT</li>
<li><code>bz</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> z轴上的磁场强度单位uT</li>
</ul>
</li>
<li><p><code>gravity</code> 重力传感器,参数<code>(event, gx, gy, gz)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>gx</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> x轴上的重力加速度单位m/s^2</li>
<li><code>gy</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> y轴上的重力加速度单位m/s^2</li>
<li><code>gz</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> z轴上的重力加速度单位m/s^2</li>
</ul>
</li>
<li><p><code>linear_acceleration</code> 线性加速度传感器,参数<code>(event, ax, ay, az)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>ax</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> x轴上的线性加速度单位m/s^2</li>
<li><code>ay</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> y轴上的线性加速度单位m/s^2</li>
<li><code>az</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> z轴上的线性加速度单位m/s^2</li>
</ul>
</li>
<li><p><code>ambient_temperature</code> 环境温度传感器,大部分设备并不支持,参数<code>(event, t)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>t</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 环境温度,单位摄氏度。</li>
</ul>
</li>
<li><p><code>light</code> 光线传感器,参数<code>(event, light)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>light</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 环境光强度单位lux</li>
</ul>
</li>
<li><p><code>pressure</code> 压力传感器,参数<code>(event, p)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>p</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 大气压单位hPa</li>
</ul>
</li>
<li><p><code>proximity</code> 距离传感器,参数<code>(event, distance)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>distance</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 一般指设备前置摄像头旁边的距离传感器到前方障碍物的距离并且很多设备上这个值只有两种情况当障碍物较近时该值为0当障碍物较远或在范围内没有障碍物时该值为5</li>
</ul>
</li>
<li><p><code>relative_humidity</code> 湿度传感器,大部分设备并不支持,参数<code>(event, rh)</code>:</p>
<ul>
<li><code>event</code> <a href="#sensors_sensorevent">SensorEvent</a> 传感器事件,用于获取传感器数据变化时的所有信息</li>
<li><code>rh</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 相对湿度范围为0~100百分比</li>
</ul>
</li>
</ul>
<h2>sensors.register(sensorName[, delay])<span><a class="mark" href="#sensors_sensors_register_sensorname_delay" id="sensors_sensors_register_sensorname_delay">#</a></span></h2>
<div class="signature"><ul>
<li><code>sensorName</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 传感器名称,常用的传感器名称如上面所述</li>
<li><code>delay</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 传感器数据更新频率,可选,默认为<code>sensors.delay.normal</code>。可用的值如下:<ul>
<li><code>sensors.delay.normal</code> 正常频率</li>
<li><code>sensors.delay.ui</code> 适合于用户界面的更新频率</li>
<li><code>sensors.delay.game</code> 适合于游戏的更新频率</li>
<li><code>sensors.delay.fastest</code> 最快的更新频率】</li>
</ul>
</li>
<li>返回 <a href="#sensors_sensoreventemitter">SensorEventEmiiter</a></li>
</ul>
</div><p>注册一个传感器监听并返回<a href="#sensors_sensoreventemitter">SensorEventEmitter</a></p>
<p>例如:</p>
<pre><code>console.show();
//注册传感器监听
var sensor = sensors.register(&quot;gravity&quot;);
if(sensor == null){
toast(&quot;不支持重力传感器&quot;);
exit();
}
//监听数据
sensor.on(&quot;change&quot;, (gx, gy, gz)=&gt;{
log(&quot;重力加速度: %d, %d, %d&quot;, gx, gy, gz);
});
</code></pre><p>可以通过delay参数来指定传感器数据的更新频率例如</p>
<pre><code>var sensor = sensors.register(&quot;gravity&quot;, sensors.delay.game);
</code></pre><p>另外,如果不支持<code>sensorName</code>所指定的传感器,那么该函数将返回<code>null</code>;但如果<code>sensors.ignoresUnsupportedSensor</code>的值被设置为<code>true</code>, 则该函数会返回一个不会分发任何传感器事件的<a href="#sensors_sensoreventemitter">SensorEventEmitter</a></p>
<p>例如:</p>
<pre><code>sensors.ignoresUnsupportedSensor = true;
//无需null判断
sensors.register(&quot;gravity&quot;).on(&quot;change&quot;, (gx, gy, gz)=&gt;{
log(&quot;重力加速度: %d, %d, %d&quot;, gx, gy, gz);
});
</code></pre><p>更多信息,参见<a href="#sensors_sensoreventemitter">SensorEventEmitter</a><a href="#sensors_sensors_ignoresUnsupportedSensor">sensors.ignoresUnsupportedSensor</a></p>
<h2>sensors.unregister(emitter)<span><a class="mark" href="#sensors_sensors_unregister_emitter" id="sensors_sensors_unregister_emitter">#</a></span></h2>
<div class="signature"><ul>
<li><code>emiiter</code> <a href="#sensors_sensoreventemitter">SensorEventEmitter</a></li>
</ul>
</div><p>注销该传感器监听器。被注销的监听器将不再能监听传感器数据。</p>
<pre><code>//注册一个传感器监听器
var sensor = sensors.register(&quot;gravity&quot;);
if(sensor == null){
exit();
}
//2秒后注销该监听器
setTimeout(()=&gt; {
sensors.unregister(sensor);
}, 2000);
</code></pre><h2>sensors.unregisterAll()<span><a class="mark" href="#sensors_sensors_unregisterall" id="sensors_sensors_unregisterall">#</a></span></h2>
<p>注销所有传感器监听器。</p>
<h2>sensors.ignoresUnsupportedSensor<span><a class="mark" href="#sensors_sensors_ignoresunsupportedsensor" id="sensors_sensors_ignoresunsupportedsensor">#</a></span></h2>
<div class="signature"><ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a></li>
</ul>
</div><p>表示是否忽略不支持的传感器。如果该值被设置为<code>true</code>,则函数<code>sensors.register()</code>即使对不支持的传感器也会返回一个无任何数据的虚拟传感器监听,也就是<code>sensors.register()</code>不会返回<code>null</code>从而避免非空判断,并且此时会触发<code>sensors</code>&quot;unsupported_sensor&quot;事件。</p>
<pre><code>//忽略不支持的传感器
sensors.ignoresUnsupportedSensor = true;
//监听有不支持的传感器时的事件
sensors.on(&quot;unsupported_sensor&quot;, function(sensorName){
toastLog(&quot;不支持的传感器: &quot; + sensorName);
});
//随便注册一个不存在的传感器。
log(sensors.register(&quot;aaabbb&quot;));
</code></pre><h2>事件: &#39;unsupported_sensor&#39;<span><a class="mark" href="#sensors_unsupported_sensor" id="sensors_unsupported_sensor">#</a></span></h2>
<div class="signature"><ul>
<li><code>sensorName</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 不支持的传感器名称</li>
</ul>
</div><p><code>sensors.ignoresUnsupportedSensor</code>被设置为<code>true</code>并且有不支持的传感器被注册时触发该事件。事件参数的传感器名称。</p>
<h1>SensorEventEmitter<span><a class="mark" href="#sensors_sensoreventemitter" id="sensors_sensoreventemitter">#</a></span></h1>
<p>注册传感器返回的对象其本身是一个EventEmmiter用于监听传感器事件。</p>
<h2>事件: &#39;change&#39;<span><a class="mark" href="#sensors_change" id="sensors_change">#</a></span></h2>
<div class="signature"><ul>
<li><code>..args</code> <span class="type">&lt;Any&gt;</span> 传感器参数</li>
</ul>
</div><p>当传感器数据改变时触发该事件;该事件触发的最高频繁由<code>sensors.register()</code>指定的delay参数决定。</p>
<p>事件参数根据传感器类型不同而不同,具体参见本章最前面的列表。</p>
<p>一个监听光线传感器和加速度传感器并且每0.5秒获取一个数据并最终写入一个csv表格文件的例子如下</p>
<pre><code>//csv文件路径
cosnt csvPath = &quot;/sdcard/sensors_data.csv&quot;;
//记录光线传感器的数据
var light = 0;
//记录加速度传感器的数据
var ax = 0;
var ay = 0;
var az = 0;
//监听光线传感器
sensors.register(&quot;light&quot;, sensors.delay.fastest)
.on(&quot;change&quot;, l =&gt; {
light = l;
});
//监听加速度传感器
sensors.register(&quot;accelerometer&quot;, sensors.delay.fastest)
.on(&quot;change&quot;, (ax0, ay0, az0) =&gt; {
ax = ax0;
ay = ay0;
az = az0;
});
var file = open(csvPath, &quot;w&quot;);
//写csv表格头
file.writeline(&quot;light,ax,ay,az&quot;)
//每0.5秒获取一次数据并写入文件
setInterval(()=&gt;{
file.writeline(util.format(&quot;%d,%d,%d,%d&quot;, light, ax, ay, az));
}, 500);
//10秒后退出并打开文件
setTimeout(()=&gt;{
file.close();
sensors.unregsiterAll();
app.viewFile(csvPath);
}, 10 * 1000);
</code></pre><h2>事件: &#39;accuracy_change&#39;<span><a class="mark" href="#sensors_accuracy_change" id="sensors_accuracy_change">#</a></span></h2>
<div class="signature"><ul>
<li><code>accuracy</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type">&lt;number&gt;</a> 表示传感器精度。为以下值之一:<ul>
<li>-1 传感器未连接</li>
<li>0 传感器不可读</li>
<li>1 低精度</li>
<li>2 中精度</li>
<li>3 高精度</li>
</ul>
</li>
</ul>
</div><p>当传感器精度改变时会触发的事件。比较少用。</p>
</div>
</div>
</div>
<script src="assets/sh_main.js"></script>
<script src="assets/sh_javascript.min.js"></script>
<script>highlight(undefined, undefined, 'pre');</script>
<!-- __TRACKING__ -->
</body>
</html>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell active" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -73,11 +75,11 @@
<h2>目录</h2>
<ul>
<li><span class="stability_2"><a href="#shell_shell">shell函数</a></span><ul>
<li><span class="stability_undefined"><a href="#shell_shell_cmd_root_false">shell(cmd[, root = false])</a></span></li>
<li><span class="stability_undefined"><a href="#shell_shell_cmd_root">shell(cmd[, root])</a></span></li>
</ul>
</li>
<li><span class="stability_2"><a href="#shell_shell_1">Shell</a></span><ul>
<li><span class="stability_undefined"><a href="#shell_shell_root_false">Shell(root = false)</a></span></li>
<li><span class="stability_undefined"><a href="#shell_new_shell_root">new Shell(root)</a></span></li>
<li><span class="stability_undefined"><a href="#shell_shell_exec_cmd">Shell.exec(cmd)</a></span></li>
<li><span class="stability_undefined"><a href="#shell_shell_exit">Shell.exit()</a></span></li>
<li><span class="stability_undefined"><a href="#shell_shell_exitandwaitfor">Shell.exitAndWaitFor()</a></span></li>
@ -153,7 +155,7 @@
<li>通过内嵌终端模拟器执行(RootAutomator, Shell等对象)</li>
</ul>
<h1>shell函数<span><a class="mark" href="#shell_shell" id="shell_shell">#</a></span></h1>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><h2>shell(cmd[, root = false])<span><a class="mark" href="#shell_shell_cmd_root_false" id="shell_shell_cmd_root_false">#</a></span></h2>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><h2>shell(cmd[, root])<span><a class="mark" href="#shell_shell_cmd_root" id="shell_shell_cmd_root">#</a></span></h2>
<div class="signature"><ul>
<li>cmd <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 要执行的命令</li>
<li>root <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;Boolean&gt;</a> 是否以root权限运行默认为false。</li>
@ -175,9 +177,9 @@ if(result.code == 0){
}
</code></pre><h1>Shell<span><a class="mark" href="#shell_shell_1" id="shell_shell_1">#</a></span></h1>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p>shell函数通过用来一次性执行单条命令并获取结果。如果有多条命令需要执行用Shell对象的效率更高。这是因为每次运行shell函数都会打开一个单独的shell进程并在运行结束后关闭他这个过程需要一定的时间而Shell对象自始至终使用同一个shell进程。</p>
<h2>Shell(root = false)<span><a class="mark" href="#shell_shell_root_false" id="shell_shell_root_false">#</a></span></h2>
<h2>new Shell(root)<span><a class="mark" href="#shell_new_shell_root" id="shell_new_shell_root">#</a></span></h2>
<div class="signature"><ul>
<li>root <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;Boolean&gt;</a> 是否以root权限运行一个shell进程。这将会影响其后使用该Shell对象执行的命令的权限</li>
<li>root <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;Boolean&gt;</a> 是否以root权限运行一个shell进程默认为false。这将会影响其后使用该Shell对象执行的命令的权限</li>
</ul>
</div><p>Shell对象的&quot;构造函数&quot;</p>
<pre><code>var sh = new Shell(true);

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages active" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -101,7 +103,7 @@ storages无法像Web开发中LocalStorage一样提供根据域名独立的存储
</ul>
</div><p>创建一个本地存储并返回一个<code>Storage</code>对象。不同名称的本地存储的数据是隔开的,而相同名称的本地存储的数据是共享的。</p>
<p>例如在一个脚本中创建名称为ABC的存储并存入a=123:</p>
<pre><code>var storage = stroages.create(&quot;ABC&quot;);
<pre><code>var storage = storages.create(&quot;ABC&quot;);
storage.put(&quot;a&quot;, 123);
</code></pre><p>而在另一个脚本中是可以获取到ABC以及a的值的</p>
<pre><code>var storage = storages.create(&quot;ABC&quot;);

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads active" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -141,8 +143,14 @@
<li><span class="stability_undefined"><a href="#ui_circle">circle</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#ui_vertical">垂直布局: vertical</a></span></li>
<li><span class="stability_undefined"><a href="#ui_horizontal">水平布局: horizontal</a></span></li>
<li><span class="stability_undefined"><a href="#ui_vertical">垂直布局: vertical</a></span><ul>
<li><span class="stability_undefined"><a href="#ui_layout_weight">layout_weight</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#ui_horizontal">水平布局: horizontal</a></span><ul>
<li><span class="stability_undefined"><a href="#ui_layout_weight_1">layout_weight</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#ui_linear">线性布局: linear</a></span></li>
<li><span class="stability_undefined"><a href="#ui_frame">帧布局: frame</a></span></li>
<li><span class="stability_undefined"><a href="#ui_relative">相对布局: relative</a></span></li>
@ -619,12 +627,80 @@ ui.layout(
<p>指定该图片控件的图片是否剪切为圆形显示。如果为<code>true</code>,则图片控件会使其宽高保持一致(如果宽高不一致,则保持高度等于宽度)并使圆形的半径为宽度的一半。</p>
<p>例如圆形的Auto.js图标<code>&lt;img w=&quot;100&quot; h=&quot;100&quot; circle=&quot;true&quot; bg=&quot;white&quot; src=&quot;http://www.autojs.org/assets/uploads/profile/3-profileavatar.png&quot; /&gt;</code></p>
<h1>垂直布局: vertical<span><a class="mark" href="#ui_vertical" id="ui_vertical">#</a></span></h1>
<p>垂直布局是一种比较简单的布局,会把在它里面的控件按照垂直方向依次摆放,如下图所示:</p>
<p>垂直布局:</p>
<p> —————</p>
<p>| 控件1 |</p>
<p>| 控件2 |</p>
<p>| 控件3 |</p>
<p>| ............ |</p>
<p> ——————</p>
<h2>layout_weight<span><a class="mark" href="#ui_layout_weight" id="ui_layout_weight">#</a></span></h2>
<p>垂直布局中的控件可以通过<code>layout_weight</code>属性来控制控件高度占垂直布局高度的比例。如果为一个控件指定<code>layout_weight</code>, 则这个控件的高度=垂直布局剩余高度 * layout_weight / weightSum如果不指定weightSum, 则weightSum为所有子控件的layout_weight之和。所谓&quot;剩余高度&quot;指的是垂直布局中减去没有指定layout_weight的控件的剩余高度。
例如:</p>
<pre><code>&quot;ui&quot;;
ui.layout(
&lt;vertical h=&quot;100dp&quot;&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件1&quot; bg=&quot;#ff0000&quot;/&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件2&quot; bg=&quot;#00ff00&quot;/&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件3&quot; bg=&quot;#0000ff&quot;/&gt;
&lt;/vertical&gt;
);
</code></pre><p>在这个布局中三个控件的layout_weight都是1也就是他们的高度都会占垂直布局高度的1/3都是33.3dp.
再例如:</p>
<pre><code>&quot;ui&quot;;
ui.layout(
&lt;vertical h=&quot;100dp&quot;&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件1&quot; bg=&quot;#ff0000&quot;/&gt;
&lt;text layout_weight=&quot;2&quot; text=&quot;控件2&quot; bg=&quot;#00ff00&quot;/&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件3&quot; bg=&quot;#0000ff&quot;/&gt;
&lt;/vertical&gt;
);
</code></pre><p>在这个布局中第一个控件高度为1/4, 第二个控件为2/4, 第三个控件为1/4.
再例如:</p>
<pre><code>&quot;ui&quot;;
ui.layout(
&lt;vertical h=&quot;100dp&quot; weightSum=&quot;5&quot;&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件1&quot; bg=&quot;#ff0000&quot;/&gt;
&lt;text layout_weight=&quot;2&quot; text=&quot;控件2&quot; bg=&quot;#00ff00&quot;/&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件3&quot; bg=&quot;#0000ff&quot;/&gt;
&lt;/vertical&gt;
);
</code></pre><p>在这个布局中因为指定了weightSum为5, 因此第一个控件高度为1/5, 第二个控件为2/5, 第三个控件为1/5.
再例如:</p>
<pre><code>&quot;ui&quot;;
ui.layout(
&lt;vertical h=&quot;100dp&quot;&gt;
&lt;text h=&quot;40dp&quot; text=&quot;控件1&quot; bg=&quot;#ff0000&quot;/&gt;
&lt;text layout_weight=&quot;2&quot; text=&quot;控件2&quot; bg=&quot;#00ff00&quot;/&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件3&quot; bg=&quot;#0000ff&quot;/&gt;
&lt;/vertical&gt;
);
</code></pre><p>在这个布局中第一个控件并没有指定layout_weight, 而是指定高度为40dp, 因此不加入比例计算此时布局剩余高度为60dp。第二个控件高度为剩余高度的2/3也就是40dp第三个控件高度为剩余高度的1/3也就是20dp。</p>
<p>垂直布局的layout_weight属性还可以用于控制他的子控件高度占满剩余空间例如</p>
<pre><code>&quot;ui&quot;;
ui.layout(
&lt;vertical h=&quot;100dp&quot;&gt;
&lt;text h=&quot;40dp&quot; text=&quot;控件1&quot; bg=&quot;#ff0000&quot;/&gt;
&lt;text h=&quot;40dp&quot; text=&quot;控件2&quot; bg=&quot;#00ff00&quot;/&gt;
&lt;text layout_weight=&quot;1&quot; text=&quot;控件3&quot; bg=&quot;#0000ff&quot;/&gt;
&lt;/vertical&gt;
);
</code></pre><p>在这个布局中第三个控件的高度会占满除去控件1和控件2的剩余空间。</p>
<h1>水平布局: horizontal<span><a class="mark" href="#ui_horizontal" id="ui_horizontal">#</a></span></h1>
<p>水平布局是一种比较简单的布局,会把在它里面的控件按照水平方向依次摆放,如下图所示:
水平布局:
————————————————————————————</p>
<p>| 控件1 | 控件2 | 控件3 | ... |</p>
<p> ————————————————————————————</p>
<h2>layout_weight<span><a class="mark" href="#ui_layout_weight_1" id="ui_layout_weight_1">#</a></span></h2>
<p>水平布局中也可以使用layout_weight属性来控制子控件的<strong>宽度</strong>占父布局的比例。和垂直布局中类似,不再赘述。</p>
<h1>线性布局: linear<span><a class="mark" href="#ui_linear" id="ui_linear">#</a></span></h1>
<p>实际上垂直布局和水平布局都属于线性布局。线性布局有一个orientation的属性用于指定布局的方向可选的值为<code>vertical</code><code>horizontal</code></p>
<p>例如<code>&lt;linear orientation=&quot;vertical&quot;&gt;&lt;/linear&gt;</code>相当于<code>&lt;vertical&gt;&lt;/vertical&gt;</code></p>
<p>线性布局的默认方向是横向的因此一个没有指定orientation属性的线性布局就是横向布局。</p>
<h1>帧布局: frame<span><a class="mark" href="#ui_frame" id="ui_frame">#</a></span></h1>
<p>帧布局</p>
<h1>相对布局: relative<span><a class="mark" href="#ui_relative" id="ui_relative">#</a></span></h1>
<h1>勾选框控件: checkbox<span><a class="mark" href="#ui_checkbox" id="ui_checkbox">#</a></span></h1>
<h1>选择框控件: radio<span><a class="mark" href="#ui_radio" id="ui_radio">#</a></span></h1>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>

View File

@ -39,8 +39,10 @@
<li><a class="nav-http" href="http.html">Http - HTTP</a></li>
<li><a class="nav-images" href="images.html">Images - 图片与图色处理</a></li>
<li><a class="nav-keys" href="keys.html">Keys - 按键模拟</a></li>
<li><a class="nav-media" href="media.html">Media - 多媒体</a></li>
<li><a class="nav-modules" href="modules.html">Modules - 模块</a></li>
<li><a class="nav-widgets-based-automation active" href="widgets-based-automation.html">WidgetsBasedAutomation - 基于控件的操作</a></li>
<li><a class="nav-sensors" href="sensors.html">Sensors - 传感器</a></li>
<li><a class="nav-shell" href="shell.html">Shell - Shell命令</a></li>
<li><a class="nav-storages" href="storages.html">Storages - 本地存储</a></li>
<li><a class="nav-threads" href="threads.html">Threads - 多线程</a></li>
@ -74,6 +76,8 @@
<ul>
<li><span class="stability_undefined"><a href="#widgets_based_automation">基于控件的操作</a></span><ul>
<li><span class="stability_undefined"><a href="#widgets_based_automation_auto_mode">auto([mode])</a></span></li>
<li><span class="stability_undefined"><a href="#widgets_based_automation_auto_waitfor">auto.waitFor()</a></span></li>
<li><span class="stability_undefined"><a href="#widgets_based_automation_auto_setmode_mode">auto.setMode(mode)</a></span></li>
</ul>
</li>
<li><span class="stability_2"><a href="#widgets_based_automation_simpleactionautomator">SimpleActionAutomator</a></span><ul>
@ -211,11 +215,23 @@
<li><code>normal</code> 正常模式,默认。</li>
</ul>
<p>如果不加mode参数则为正常模式。</p>
<p>建议使用<code>auto.waitFor()</code><code>auto.setMode()</code>代替该函数,因为<code>auto()</code>函数如果无障碍服务未启动会停止脚本;而<code>auto.waitFor()</code>则会在在无障碍服务启动后继续运行。</p>
<p>示例:</p>
<pre><code>auto(&quot;fast&quot;);
</code></pre><p>示例2</p>
<pre><code>auto();
</code></pre><h1>SimpleActionAutomator<span><a class="mark" href="#widgets_based_automation_simpleactionautomator" id="widgets_based_automation_simpleactionautomator">#</a></span></h1>
</code></pre><h2>auto.waitFor()<span><a class="mark" href="#widgets_based_automation_auto_waitfor" id="widgets_based_automation_auto_waitfor">#</a></span></h2>
<p>检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。</p>
<h2>auto.setMode(mode)<span><a class="mark" href="#widgets_based_automation_auto_setmode_mode" id="widgets_based_automation_auto_setmode_mode">#</a></span></h2>
<div class="signature"><ul>
<li><code>mode</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 模式</li>
</ul>
</div><p>设置无障碍模式为mode。mode的可选值为</p>
<ul>
<li><code>fast</code> 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。</li>
<li><code>normal</code> 正常模式,默认。</li>
</ul>
<h1>SimpleActionAutomator<span><a class="mark" href="#widgets_based_automation_simpleactionautomator" id="widgets_based_automation_simpleactionautomator">#</a></span></h1>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p>SimpleActionAutomator提供了一些模拟简单操作的函数例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。</p>
<h2>click(text[, i])<span><a class="mark" href="#widgets_based_automation_click_text_i" id="widgets_based_automation_click_text_i">#</a></span></h2>
<div class="signature"><ul>

View File

@ -513,6 +513,11 @@
"url": "events.html#events_events_observekey",
"summary": "监听按键"
},
{
"key": "setKeyInterceptionEnabled",
"url": "events.html#events_events_setkeyinterceptionenabled_key_enabled",
"summary": "屏蔽按键"
},
{
"key": "observeTouch",
"url": "events.html#events_events_observetouch",
@ -1726,5 +1731,127 @@
],
"url": "threads.html",
"summary": "多线程"
},
{
"name": "media",
"properties": [
{
"key": "scanFile",
"summary": "扫描文件",
"url": "media.html#media_media_scanfile_path"
},
{
"key": "playMusic",
"summary": "播放音乐",
"url": "media.html#media_media_playmusic_path_volume_looping"
},
{
"key": "musicSeekTo",
"summary": "调整进度",
"url": "media.html#media_media_musicseekto_msec"
},
{
"key": "pauseMusic",
"summary": "暂停音乐",
"url": "media.html#media_media_pausemusic"
},
{
"key": "resumeMusic",
"summary": "继续播放",
"url": "media.html#media_media_resumemusic"
},
{
"key": "stopMusic",
"summary": "停止音乐",
"url": "media.html#media_media_stopmusic"
},
{
"key": "isMusicPlaying",
"summary": "是否在播放",
"url": "media.html#media_media_ismusicplaying"
},
{
"key": "getMusicDuration",
"summary": "音乐时长",
"url": "media.html#media_media_getmusicduration"
},
{
"key": "getMusicCurrentPosition",
"summary": "当前位置",
"url": "media.html#media_media_getmusiccurrentposition"
}
],
"url": "media.html",
"summary": "多媒体"
},
{
"name": "sensors",
"properties": [
{
"key": "register",
"summary": "注册监听",
"url": "sensors.html#sensors_sensors_register_sensorname_delay"
},
{
"key": "unregister",
"summary": "注销监听",
"url": "sensors.html#sensors_sensors_unregister_emitter"
},
{
"key": "unregisterAll",
"summary": "注销所有",
"url": "sensors.html#sensors_sensors_unregisterall"
},
{
"key": "ignoresUnsupportedSensor",
"summary": "忽略不支持传感器",
"url": "sensors.html#sensors_sensors_ignoresunsupportedsensor",
"variable": true
}
],
"url": "sensors.html",
"summary": "传感器"
},
{
"name": "engines",
"properties": [
{
"key": "execScript",
"summary": "执行脚本",
"url": "engines.html#engines_engines_execscript_name_script_config"
},
{
"key": "execScriptFile",
"summary": "执行脚本文件",
"url": "engines.html#engines_engines_execscriptfile_path_config"
},
{
"key": "execAutoFile",
"summary": "执行录制文件",
"url": "engines.html#engines_engines_execautofile_path_config"
},
{
"key": "stopAll",
"summary": "停止全部",
"url": "engines.html#engines_engines_stopall"
},
{
"key": "stopAllAndToast",
"summary": "停止并提示",
"url": "engines.html#engines_engines_stopallandtoast"
},
{
"key": "myEngine",
"summary": "当前引擎",
"url": "engines.html#engines_engines_myengine"
},
{
"key": "all",
"summary": "所有引擎",
"url": "engines.html#engines_engines_all"
}
],
"url": "engines.html",
"summary": "脚本引擎"
}
]

View File

@ -1,5 +1,5 @@
auto();
events.observeNotification();
events.observeToast();
events.onToast(function(toast){
var pkg = toast.getPackageName();
log("Toast内容: " + toast.getText() +

View File

@ -1,21 +1,16 @@
auto();
events.observeNotification();
events.onNotification(function(info, notification){
printNotification(info, notification);
events.onNotification(function(notification){
printNotification(notification);
});
toast("监听中,请在日志中查看记录的通知及其内容");
function printNotification(info, notification){
log("应用包名: " + info.getPackageName());
log("通知文本: " + info.getTexts());
function printNotification(notification){
log("应用包名: " + notification.getPackageName());
log("通知文本: " + notification.getText());
log("通知优先级: " + notification.priority);
log("通知目录: " + notification.category);
log("通知创建时间: " + new Date(notification.creationTime));
log("通知时间: " + new Date(notification.when));
log("通知数: " + notification.number);
log("通知摘要: " + notification.tickerText);
for(var i = 0; i < notification.actions.length; i++){
var action = notification.actions[i];
log("通知" + (i + 1) + ": " + action.title);
}
}

View File

@ -0,0 +1,89 @@
"ui";
var color = "#009688";
ui.layout(
<drawer id="drawer">
<vertical>
<appbar>
<toolbar id="toolbar" title="示例"/>
<tabs id="tabs"/>
</appbar>
<viewpager id="viewpager">
<frame>
<text text="第一页内容" textColor="black" textSize="16sp"/>
</frame>
<frame>
<text text="第二页内容" textColor="red" textSize="16sp"/>
</frame>
<frame>
<text text="第三页内容" textColor="green" textSize="16sp"/>
</frame>
</viewpager>
</vertical>
<vertical layout_gravity="left" bg="#ffffff" w="280">
<img w="280" h="200" scaleType="fitXY" src="http://images.shejidaren.com/wp-content/uploads/2014/10/023746fki.jpg"/>
<list id="menu">
<horizontal bg="?selectableItemBackground" w="*">
<img w="50" h="50" padding="16" src="{{this.icon}}" tint="{{color}}"/>
<text textColor="black" textSize="15sp" text="{{this.title}}" layout_gravity="center"/>
</horizontal>
</list>
</vertical>
</drawer>
);
//创建选项菜单(右上角)
ui.emitter.on("create_options_menu", menu=>{
menu.add("设置");
menu.add("关于");
});
//监听选项菜单点击
ui.emitter.on("options_item_selected", (e, item)=>{
switch(item.getTitle()){
case "设置":
toast("还没有设置");
break;
case "关于":
alert("关于", "Auto.js界面模板 v1.0.0");
break;
}
e.consumed = true;
});
activity.setSupportActionBar(ui.toolbar);
//设置滑动页面的标题
ui.viewpager.setTitles(["标签一", "标签二", "标签三"]);
//让滑动页面和标签栏联动
ui.tabs.setupWithViewPager(ui.viewpager);
//让工具栏左上角可以打开侧拉菜单
ui.toolbar.setupWithDrawer(ui.drawer);
ui.menu.setDataSource([
{
title: "选项一",
icon: "@drawable/ic_android_black_48dp"
},
{
title: "选项二",
icon: "@drawable/ic_settings_black_48dp"
},
{
title: "选项三",
icon: "@drawable/ic_favorite_black_48dp"
},
{
title: "退出",
icon: "@drawable/ic_exit_to_app_black_48dp"
}
]);
ui.menu.on("item_click", item => {
switch(item.title){
case "退出":
ui.finish();
break;
}
})

View File

@ -24,10 +24,10 @@ function showLoginUI(){
</frame>
);
ui.login.click(() => {
ui.login.on("click", () => {
toast("您输入的用户名为" + ui.name.text() + " 密码为" + ui.password.text());
});
ui.register.click(() => showRegisterUI());
ui.register.on("click", () => showRegisterUI());
}
//显示注册界面
@ -41,7 +41,7 @@ function showRegisterUI(){
</linear>
<linear>
<text w="56" gravity="center" color="#111111" size="16">密码</text>
<input w="*" h="40" inputType="password"/>
<input w="*" h="40" password="true"/>
</linear>
<linear>
<text w="56" gravity="center" color="#111111" size="16">邮箱</text>
@ -54,5 +54,5 @@ function showRegisterUI(){
</vertical>
</frame>
);
ui.cancel.click(() => showLoginUI());
ui.cancel.on("click", () => showLoginUI());
}

View File

@ -0,0 +1,59 @@
"ui";
//音乐文件的后缀名
var musicExts = [".mp3", ".wma", ".rm", ".wav", ".mid", ".ape", ".flac"];
//扫描路径
var path = files.getSdcardPath();
//保存音乐文件列表的数组
var musicFiles = [];
ui.layout(
<vertical bg="#ffffff">
<list id="files" layout_weight="1">
<linear bg="?selectableItemBackground">
<img src="@drawable/ic_music_note_black_48dp" tint="white" bg="#ff5722" w="50" h="70" margin="16" />
<vertical>
<text id="name" textSize="16sp" textColor="#000000" text="{{this.name}}" marginTop="16" maxLines="1" ellipsize="end"/>
<text id="path" textSize="13sp" textColor="#929292" text="{{this.path}}" marginTop="8" maxLines="1" ellipsize="end"/>
</vertical>
</linear>
</list>
<progressbar id="progressbar" indeterminate="true" style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/>
</vertical>
);
ui.files.setDataSource(musicFiles);
ui.files.on("item_click", function(item, pos){
media.playMusic(item.path, 1);
});
//启动线程来扫描音乐文件
threads.start(function () {
listMuiscFiles(path, musicFiles);
ui.run(()=> {
ui.progressbar.setVisility(8);
});
});
function listMuiscFiles(dir, list) {
//遍历该文件夹的文件
files.listDir(dir).forEach(fileName => {
var path = files.join(dir, fileName);
//如果是子文件夹则继续扫描子文件夹的文件
if (files.isDir(path)) {
listMuiscFiles(path, list);
return;
}
for (var i = 0; i < musicExts.length; i++) {
//如果文件名的后缀是音乐格式
if (fileName.endsWith(musicExts[i])) {
//则把它添加到列表中
list.push({
name: fileName,
path: path
});
}
}
});
}

View File

@ -0,0 +1,66 @@
var releaseNotes = "版本 v7.7.7\n"
+ "更新日志:\n"
+ "* 新增 若干Bug\n";
dialogs.build({
title: "发现新版本",
content: releaseNotes,
positive: "立即下载",
negative: "取消",
neutral: "到浏览器下载"
})
.on("positive", download)
.on("neutral", () => {
app.openUrl("https://www.autojs.org");
})
.show();
var downloadDialog = null;
var downloadId = -1;
function download(){
downloadDialog = dialogs.build({
title: "下载中...",
positive: "暂停",
negative: "取消",
progress: {
max: 100,
showMinMax: true
},
autoDismiss: false
})
.on("positive", ()=>{
if(downloadDialog.getActionButton("positive") == "暂停"){
stopDownload();
downloadDialog.setActionButton("positive", "继续");
}else{
startDownload();
downloadDialog.setActionButton("positive", "暂停");
}
})
.on("negative", ()=>{
stopDownload();
downloadDialog.dismiss();
downloadDialog = null;
})
.show();
startDownload();
}
function startDownload(){
downloadId = setInterval(()=>{
var p = downloadDialog.getProgress();
if(p >= 100){
stopDownload();
downloadDialog.dismiss();
downloadDialog = null;
toast("下载完成");
}else{
downloadDialog.setProgress(p + 1);
}
}, 100);
}
function stopDownload(){
clearInterval(downloadId);
}

View File

@ -0,0 +1,33 @@
var window = floaty.window(
<vertical>
<input id="input" text="请输入你的名字" textSize="16sp" focusable="true"/>
<button id="ok" text="确定"/>
</vertical>
);
window.exitOnClose();
toast("长按确定键可调整位置");
window.input.on("key", function(keyCode, event){
if(event.getAction() == event.ACTION_DOWN && keyCode == keys.back){
window.disableFocus();
event.consumed = true;
}
});
window.input.on("touch_down", ()=>{
window.requestFocus();
window.input.requestFocus();
});
window.ok.on("click", ()=>{
toast("傻瓜! " + window.input.text());
window.disableFocus();
});
window.ok.on("long_click", ()=>{
window.setAdjustEnabled(!window.isAdjustEnabled());
});
setInterval(()=>{}, 1000);

View File

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

View File

@ -14,7 +14,7 @@ if(content != null){
ui.content.setText(content);
}
ui.save.click(()=>{
storage.put("content", ui.content.getText());
storage.put("content", ui.content.text());
});

View File

@ -0,0 +1,41 @@
"ui";
//ui布局为一块画布
ui.layout(
<frame>
<canvas id="board" w="*" h="*"/>
</frame>
);
//要绘制的函数,这里是一个一元二次函数
var f = function(x){
return x * x + 3 * x - 4;
}
//绘制区间
var minX = -5;
var maxX = 5;
var minY = -10;
//画笔
var paint = new Paint();
ui.board.on("draw", function(canvas){
var w = canvas.getWidth();
var h = canvas.getHeight();
//计算y轴区间上限
var maxY = minY + (maxX - minX) * h / w;
//设置画笔颜色为黑色
paint.setColor(colors.parseColor("#000000"));
//绘制两个坐标轴
canvas.drawLine(w / 2, 0, w / 2, h, paint);
canvas.drawLine(0, h / 2, w, h / 2, paint);
//设置画笔颜色为红色
paint.setColor(colors.parseColor("#ff0000"));
//绘制图像
for(var i = 0; i < w; i++){
var x = minX + i / w * (maxX - minX);
var y = f(x);
var j = h - (y - minY) / (maxY - minY) * h;
canvas.drawPoint(i, j, paint);
}
});

View File

@ -0,0 +1,99 @@
"ui";
//ui布局为一块画布和一些函数调整控件
ui.layout(
<vertical>
<linear>
<input id="fx" textSize="16sp" text="x*x+3*x-4" layout_weight="1"/>
<button id="ok" w="50dp"/>
</linear>
<linear>
<button id="left" text="←" layout_weight="1"/>
<button id="right" text="→" layout_weight="1"/>
<button id="up" text="↓" layout_weight="1"/>
<button id="down" text="↑" layout_weight="1"/>
<button id="zoom_in" text="+" layout_weight="1"/>
<button id="zoom_out" text="-" layout_weight="1"/>
</linear>
<canvas id="board" w="*" h="*"/>
</vertical>
);
//函数表达式
var f = "x*x+3*x-4";
//绘制区间
var minX = -5;
var maxX = 5;
var minY;
var h = 1;
var w = 1;
//画笔
var paint = new Paint();
paint.setStrokeWidth(2);
ui.board.on("draw", function(canvas){
w = canvas.getWidth();
h = canvas.getHeight();
if(minY == undefined){
minY = -(maxX - minX) * h / w / 2;
}
//计算y轴区间上限
var maxY = minY + (maxX - minX) * h / w;
//设置画笔颜色为黑色
paint.setColor(colors.parseColor("#000000"));
//绘制两个坐标轴
var x0 = parseInt(- minX / (maxX - minX) * w);
canvas.drawLine(x0, 0, x0, h, paint);
var y0 = parseInt(h + minY / (maxY - minY) * h);
canvas.drawLine(0, y0, w, y0, paint);
//设置画笔颜色为红色
paint.setColor(colors.parseColor("#ff0000"));
//绘制图像
for(var i = 0; i < w; i++){
var x = minX + i / w * (maxX - minX);
var y = eval(f);
var j = h - (y - minY) / (maxY - minY) * h;
canvas.drawPoint(i, j, paint);
}
});
ui.ok.click(()=>{
f = String(ui.fx.text());
});
ui.left.click(()=>{
var d = maxX - minX;
maxX -= d / 10;
minX -= d / 10;
});
ui.right.click(()=>{
var d = maxX - minX;
maxX += d / 10;
minX += d / 10;
});
ui.up.click(()=>{
var d = maxX - minX;
minY += d / 8;
});
ui.down.click(()=>{
var d = maxX - minX;
minY -= d / 8;
});
ui.zoom_in.click(()=>{
var d = maxX - minX;
var a = (maxX + minX) / 2;
maxX = a + d;
minX = a - d;
minY *= (maxX - minY) / d * h / w;
});
ui.zoom_out.click(()=>{
var d = maxX - minX;
maxX -= d / 2;
minX += d / 2;
});

View File

@ -0,0 +1,183 @@
"ui";
ui.layout(
<vertical>
<canvas id="board" layout_weight="1"/>
<relative h="120">
<button id="up" text="↑" w="60" h="60" layout_alignParentTop="true" layout_centerHorizontal="true"/>
<button id="left" text="←" w="60" h="60" layout_alignParentBottom="true" layout_toLeftOf="@id/down"/>
<button id="down" text="↓" w="60" h="60" layout_alignParentBottom="true" layout_centerHorizontal="true"/>
<button id="right" text="→" w="60" h="60" layout_alignParentBottom="true" layout_toRightOf="@id/down"/>
</relative>
</vertical>
);
//蛇的颜色
const SNAKE_COLOR = colors.parseColor("#4caf50");
//背景色
const BG_COLOR = colors.parseColor("#ffffff");
//苹果颜色
const APPLE_COLOR = colors.parseColor("#f44336");
//墙的颜色
const WALL_COLOR = colors.parseColor("#607d8b");
//文本颜色
const TEXT_COLOR = colors.parseColor("#03a9f4");
//蛇自动移动的时间间隔,调小可以增加难度
const MOVE_INTERVAL = 500;
//方块宽度
const BLOCK_WIDTH = 40;
//游戏区域宽高
const GAME_BOARD_HEIGHT = 20;
const GAME_BOARD_WIDTH = 15;
//蛇的四个移动方向
const DIRECTION_LEFT = {x: -1, y: 0};
const DIRECTION_RIGHT = {x: 1, y: 0};
const DIRECTION_UP = {x: 0, y: -1};
const DIRECTION_DOWN = {x: 0, y: 1};
//蛇,是一个蛇身的坐标的数组
var snake = [{x: 4, y: 2}, {x: 3, y: 2}, {x: 2, y: 2}];
//苹果的坐标
var apple = generateApple();
//当前蛇的移动方向
var direction = DIRECTION_RIGHT;
//标记游戏是否结束
var isGameOver = false;
//分数
var score = 0;
var paint = new Paint();
ui.board.on("draw", function(canvas){
//绘制背景色
canvas.drawColor(BG_COLOR);
//绘制分数
paint.setColor(TEXT_COLOR);
paint.setTextSize(50);
canvas.drawText("分数: " + score, 30, 70, paint);
//如果游戏结束则绘制游戏结束字样
if(isGameOver){
canvas.drawText("游戏结束!", canvas.getWidth() - 280, 70, paint);
}
//计算坐标偏移,是的游戏区域绘制在画面的水平居中位置
var offset = {
x: (canvas.getWidth() - (GAME_BOARD_WIDTH + 2) * BLOCK_WIDTH) / 2,
y: 100
};
//偏移坐标
canvas.translate(offset.x, offset.y);
//绘制围墙
paint.setColor(WALL_COLOR);
for(var i = 0; i <= GAME_BOARD_WIDTH + 1; i++){
//上围墙
drawBlock(canvas, paint, i, 0);
//下围墙
drawBlock(canvas, paint, i, GAME_BOARD_HEIGHT + 1);
}
for(var i = 0; i <= GAME_BOARD_HEIGHT + 1; i++){
//左围墙
drawBlock(canvas, paint, 0, i);
//右围墙
drawBlock(canvas, paint, GAME_BOARD_WIDTH + 1, i);
}
//绘制蛇身
paint.setColor(SNAKE_COLOR);
for(var i = 0; i < snake.length; i++){
drawBlock(canvas, paint, snake[i].x, snake[i].y);
}
//绘制苹果
paint.setColor(APPLE_COLOR);
drawBlock(canvas, paint, apple.x, apple.y);
});
//启动游戏线程
var gameThread = threads.start(game);
//按键点击时改变蛇的移动方向
ui.left.on("click", ()=> direction = DIRECTION_LEFT);
ui.right.on("click", ()=> direction = DIRECTION_RIGHT);
ui.up.on("click", ()=> direction = DIRECTION_UP);
ui.down.on("click", ()=> direction = DIRECTION_DOWN);
function game(){
//每隔一段时间让蛇自动前进
setInterval(()=>{
move(direction.x, direction.y);
}, MOVE_INTERVAL);
}
function move(dx, dy){
log("move: %d, %d", dx, dy);
direction.x = dx;
direction.y = dy;
//蛇前进时把一个新的方块添加到蛇头前面
var head = snake[0];
snake.splice(0, 0, {
x: head.x + dx,
y: head.y + dy
});
//如果蛇头吃到了苹果
if(snakeEatsApple()){
//添加分数和重新生成苹果
score += 5;
apple = generateApple();
}else{
//没有吃到苹果的情况下把蛇尾去掉保持蛇身长度不变
snake.pop();
}
//碰撞检测
collisionTest();
}
function snakeEatsApple(){
return snake[0].x == apple.x && snake[0].y == apple.y;
}
function generateApple(){
//循环生成苹果直至苹果不会生成在蛇身上
var x, y;
do{
x = random(1, GAME_BOARD_WIDTH);
y = random(1, GAME_BOARD_HEIGHT);
}while(!isAppleValid(x, y));
return {x: x, y: y};
}
function isAppleValid(x, y){
for (var i = 0; i < snake.length; i++) {
if (snake[i].x == x && snake[i].y == y) {
return false;
}
}
return true;
}
function collisionTest(){
//检测蛇有没有撞到墙上
var head = snake[0];
if(head.x < 1 || head.x > GAME_BOARD_WIDTH
|| head.y < 1 || head.y > GAME_BOARD_HEIGHT){
gameOver();
return;
}
//检测蛇有没有撞到自己
for(var i = 1; i < snake.length; i++){
if(snake[i].x == head && snake[i].y == head){
gameOver();
return;
}
}
}
function gameOver(){
gameThread.interrupt();
isGameOver = true;
}
function drawBlock(canvas, paint, x, y){
x *= BLOCK_WIDTH;
y *= BLOCK_WIDTH;
canvas.drawRect(x, y, x + BLOCK_WIDTH, y + BLOCK_WIDTH, paint);
}

File diff suppressed because one or more lines are too long

View File

@ -15,12 +15,12 @@ ui.layout(
</vertical>
);
ui.ok.click(()=>{
ui.ok.on("click", ()=>{
var i = ui.sp1.getSelectedItemPosition();
var j = ui.sp2.getSelectedItemPosition();
toast("您的选择是选项" + (i + 1) + "和选项" + (j + 4));
});
ui.select3.click(()=>{
ui.select3.on("click", ()=>{
ui.sp1.setSelection(2);
});

View File

@ -0,0 +1,33 @@
"ui";
ui.layout(
<frame>
<list id="list">
<vertical>
<text id="name" textSize="16sp" textColor="#000000" text="姓名: {{name}}"/>
<text id="age" textSize="16sp" textColor="#000000" text="年龄: {{age}}岁"/>
</vertical>
</list>
</frame>
);
var items = [
{name: "小明", age: 18}, {name: "小红", age: 30},
{name: "小东", age: 19}, {name: "小强", age: 31},
{name: "小满", age: 20}, {name: "小一", age: 32},
{name: "小和", age: 21}, {name: "小二", age: 1},
{name: "小贤", age: 22}, {name: "小三", age: 2},
{name: "小伟", age: 23}, {name: "小四", age: 3},
{name: "小黄", age: 24}, {name: "小五", age: 4},
{name: "小健", age: 25}, {name: "小六", age: 5},
{name: "小啦", age: 26}, {name: "小七", age: 6},
{name: "小哈", age: 27}, {name: "小八", age: 7},
{name: "小啊", age: 28}, {name: "小九", age: 8},
{name: "小啪", age: 29}, {name: "小十", age: 9}
];
ui.list.setDataSource(items);
ui.list.on("item_click", function(i, item, itemView, listView){
toast("被点击的人名字为: " + item.name + ",年龄为: " + item.age);
});

View File

@ -27,6 +27,6 @@ ui.layout(
</scroll>
);
ui.change_img.click(()=>{
ui.change_img.on("click", ()=>{
ui.rounded_img.setSource("http://www.autojs.org/assets/uploads/profile/1-profilecover.jpeg");
});

View File

@ -2,8 +2,8 @@
ui.layout(
<vertical padding="16">
<checkbox text="复选框"/>
<checkbox checked="true" text="勾选的复选框"/>
<checkbox id="cb1" text="复选框"/>
<checkbox id="cb2" checked="true" text="勾选的复选框"/>
<radiogroup>
<radio text="单选框1"/>
<radio text="单选框2"/>
@ -15,4 +15,13 @@ ui.layout(
<radio text="勾选的单选框3" checked="true"/>
</radiogroup>
</vertical>
);
);
ui.cb1.on("check", (checked)=>{
if(checked){
toast("第一个框被勾选了");
}else{
toast("第一个框被取消勾选了");
}
});

View File

@ -11,6 +11,10 @@ ui.layout(
</vertical>
);
ui.click_me.click(()=>{
ui.click_me.on("click", ()=>{
toast("我被点啦");
});
ui.click_me.on("long_click", ()=>{
toast("我被长按啦");
});

File diff suppressed because one or more lines are too long

View File

@ -1,10 +0,0 @@
package com.stardust.scriptdroid;
/**
* Created by Stardust on 2017/7/7.
*/
public final class Constants {
public static final String APP_ID = "1105513627";
public static final String SPLASH_POS_ID = "3050728349211259";
}

View File

@ -1,89 +0,0 @@
package com.stardust.scriptdroid.autojs;
import android.app.Application;
import android.content.Context;
import com.stardust.autojs.core.console.GlobalStardustConsole;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.autojs.runtime.exception.ScriptException;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.BuildConfig;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.pluginclient.DevPluginService;
import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
/**
* Created by Stardust on 2017/4/2.
*/
public class AutoJs extends com.stardust.autojs.AutoJs {
private static AutoJs instance;
public static AutoJs getInstance() {
return instance;
}
public static void initInstance(Context context) {
instance = new AutoJs(context);
}
private AutoJs(final Context context) {
super(context);
getScriptEngineService().registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener());
}
@Override
protected Console createGlobalConsole() {
return new GlobalStardustConsole(getUiHandler()) {
@Override
public String println(int level, CharSequence charSequence) {
String log = super.println(level, charSequence);
DevPluginService.getInstance().log(log);
return log;
}
};
}
public void ensureAccessibilityServiceEnabled() {
if (AccessibilityService.getInstance() != null) {
return;
}
String errorMessage = null;
if (AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp())) {
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
} else {
if (Pref.shouldEnableAccessibilityServiceByRoot()) {
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) {
errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout);
}
} else {
errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission);
}
}
if (errorMessage != null) {
AccessibilityServiceTool.goToAccessibilitySetting();
throw new ScriptException(errorMessage);
}
}
@Override
protected AccessibilityConfig createAccessibilityConfig() {
AccessibilityConfig config = super.createAccessibilityConfig();
if (BuildConfig.CHANNEL.equals("coolapk")) {
config.addWhiteList("com.coolapk.market");
}
return config;
}
@Override
protected Application getApplication() {
return App.getApp();
}
}

View File

@ -1,19 +0,0 @@
package com.stardust.scriptdroid.tool;
import com.stericson.RootShell.RootShell;
/**
* Created by Stardust on 2018/1/26.
*/
public class RootTool {
public static boolean isRootAvailable() {
try {
return RootShell.isRootAvailable();
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}

View File

@ -1,137 +0,0 @@
package com.stardust.scriptdroid.ui.edit;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toolbar;
import com.stardust.app.OnActivityResultDelegate;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_CONTENT;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_PATH;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_READ_ONLY;
/**
* Created by Stardust on 2017/1/29.
*/
@EActivity(R.layout.activity_edit)
public class EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost {
private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator();
@ViewById(R.id.editor_view)
EditorView mEditor;
private EditorMenu mEditorMenu;
public static void editFile(Context context, String path) {
editFile(context, null, path);
}
public static void editFile(Context context, String name, String path) {
context.startActivity(new Intent(context, EditActivity_.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(EXTRA_PATH, path)
.putExtra(EXTRA_NAME, name));
}
public static void viewContent(Context context, String name, String content) {
context.startActivity(new Intent(context, EditActivity_.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(EXTRA_CONTENT, content)
.putExtra(EXTRA_NAME, name)
.putExtra(EXTRA_READ_ONLY, true));
}
@AfterViews
void setUpViews() {
mEditor.handleIntent(getIntent());
mEditorMenu = new EditorMenu(mEditor);
setUpToolbar();
}
private void setUpToolbar() {
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditor.getName());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_editor, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return mEditorMenu.onOptionsItemSelected(item);
}
@Override
public void onActionModeStarted(ActionMode mode) {
Menu menu = mode.getMenu();
MenuItem item = menu.getItem(menu.size() - 1);
menu.add(item.getGroupId(), R.id.action_delete_line, 10000, R.string.text_delete_line);
menu.add(item.getGroupId(), R.id.action_copy_line, 20000, R.string.text_copy_line);
super.onActionModeStarted(mode);
}
@Override
public void onBackPressed() {
if (!mEditor.onBackPressed()) {
super.onBackPressed();
}
}
@Override
public void finish() {
if (mEditor.isTextChanged()) {
showExitConfirmDialog();
return;
}
super.finish();
}
private void showExitConfirmDialog() {
new ThemeColorMaterialDialogBuilder(this)
.title(R.string.text_alert)
.content(R.string.edit_exit_without_save_warn)
.positiveText(R.string.text_cancel)
.negativeText(R.string.text_save_and_exit)
.neutralText(R.string.text_exit_directly)
.onNegative((dialog, which) -> {
mEditor.saveFile();
EditActivity.super.finish();
})
.onNeutral((dialog, which) -> EditActivity.super.finish())
.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@NonNull
@Override
public OnActivityResultDelegate.Mediator getOnActivityResultDelegateMediator() {
return mMediator;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mMediator.onActivityResult(requestCode, resultCode, data);
}
}

View File

@ -1,106 +0,0 @@
package com.stardust.scriptdroid.ui.settings;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.stardust.theme.ThemeColorManagerCompat;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Stardust on 2017/5/10.
*/
public class PaintView extends View {
private List<Path> mPaths = new ArrayList<>();
private Path mCurrentPath;
private Paint mPaint;
public PaintView(Context context) {
super(context);
init();
}
public PaintView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public PaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public PaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setColor(ThemeColorManagerCompat.getColorPrimary());
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(5);
setWillNotDraw(false);
setClickable(true);
setBackgroundColor(Color.TRANSPARENT);
}
@Override
protected void onDraw(Canvas canvas) {
for (Path path : mPaths) {
canvas.drawPath(path, mPaint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getY();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
onTouchDown(x, y);
return true;
case MotionEvent.ACTION_MOVE:
onTouchMove(x, y);
return true;
case MotionEvent.ACTION_UP:
onTouchUp(x, y);
return true;
}
return super.onTouchEvent(event);
}
private void onTouchDown(float x, float y) {
if (mCurrentPath != null) {
mCurrentPath.close();
mPaths.add(mCurrentPath);
invalidate();
}
mCurrentPath = new Path();
mCurrentPath.moveTo(x, y);
}
private void onTouchMove(float x, float y) {
mCurrentPath.moveTo(x, y);
}
private void onTouchUp(float x, float y) {
mCurrentPath.close();
mPaths.add(mCurrentPath);
mCurrentPath = null;
invalidate();
}
}

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid;
package org.autojs.autojs;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
@ -10,20 +10,21 @@ import android.widget.ImageView;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.flurry.android.FlurryAgent;
import com.google.android.gms.ads.MobileAds;
import com.raizlabs.android.dbflow.config.DatabaseConfig;
import com.raizlabs.android.dbflow.config.FlowConfig;
import com.raizlabs.android.dbflow.config.FlowManager;
import com.raizlabs.android.dbflow.runtime.DirectModelNotifier;
import com.squareup.leakcanary.LeakCanary;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.core.ui.inflater.ImageLoader;
import com.stardust.autojs.core.ui.inflater.util.Drawables;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.autojs.key.GlobalKeyObserver;
import com.stardust.scriptdroid.network.GlideApp;
import com.stardust.scriptdroid.storage.database.TimedTaskDatabase;
import com.stardust.scriptdroid.timing.TimedTaskScheduler;
import com.stardust.scriptdroid.tool.CrashHandler;
import com.stardust.scriptdroid.ui.error.ErrorReportActivity;
import org.autojs.autojs.autojs.AutoJs;
import org.autojs.autojs.autojs.key.GlobalKeyObserver;
import org.autojs.autojs.network.GlideApp;
import org.autojs.autojs.storage.database.TimedTaskDatabase;
import org.autojs.autojs.timing.TimedTaskScheduler;
import org.autojs.autojs.tool.CrashHandler;
import org.autojs.autojs.ui.error.ErrorReportActivity;
import com.stardust.theme.ThemeColor;
import com.stardust.theme.ThemeColorManager;
import com.stardust.util.UiHandler;
@ -40,7 +41,6 @@ public class App extends MultiDexApplication {
private static final String TAG = "App";
private static WeakReference<App> instance;
private UiHandler mUiHandler;
public static App getApp() {
return instance.get();
@ -48,8 +48,8 @@ public class App extends MultiDexApplication {
public void onCreate() {
super.onCreate();
GlobalAppContext.set(this);
instance = new WeakReference<>(this);
mUiHandler = new UiHandler(this);
setUpStaticsTool();
setUpDebugEnvironment();
init();
@ -65,10 +65,6 @@ public class App extends MultiDexApplication {
private void setUpDebugEnvironment() {
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(ErrorReportActivity.class));
}
@ -81,9 +77,12 @@ public class App extends MultiDexApplication {
ThemeColorManager.setDefaultThemeColor(new ThemeColor(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent)));
ThemeColorManager.init(this);
AutoJs.initInstance(this);
GlobalKeyObserver.getSingleton();
if (Pref.isRunningVolumeControlEnabled()) {
GlobalKeyObserver.init();
}
setupDrawableImageLoader();
TimedTaskScheduler.setupRepeating(this);
MobileAds.initialize(this, Constants.ADMOB_APP_ID);
}
private void setupDrawableImageLoader() {
@ -140,7 +139,4 @@ public class App extends MultiDexApplication {
}
public UiHandler getUiHandler() {
return mUiHandler;
}
}

View File

@ -0,0 +1,18 @@
package org.autojs.autojs;
/**
* Created by Stardust on 2017/7/7.
*/
public final class Constants {
public static final String LOG_TAG_ADMOB = "Admob";
public static final String ADMOB_APP_ID = "ca-app-pub-5495978608535144~9896346219";
public static final String ADMOB_SPLASH_BANNER_ID = "ca-app-pub-5495978608535144/3281269730";
public static final String ADMOB_INTERSTITIAL_ID = "ca-app-pub-5495978608535144/7282625313";
public static final String ADMOB_APK_BUILDER_REWARD_ID = "ca-app-pub-5495978608535144/2977306962";
public static final String ADMOB_BANNER_TEST_ID = "ca-app-pub-3940256099942544/6300978111";
public static final String ADMOB_INTERSTITIAL_TEST_ID = "ca-app-pub-3940256099942544/1033173712";
public static final String ADMOB_REWARD_VIDEO_TEST_ID = "ca-app-pub-3940256099942544/5224354917";
}

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid;
package org.autojs.autojs;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextAction;

View File

@ -1,11 +1,14 @@
package com.stardust.scriptdroid;
package org.autojs.autojs;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import org.autojs.autojs.autojs.key.GlobalKeyObserver;
import java.util.concurrent.TimeUnit;
/**
@ -13,7 +16,7 @@ import java.util.concurrent.TimeUnit;
*/
public class Pref {
private static final SharedPreferences DISPOSABLE_BOOLEAN = App.getApp().getSharedPreferences("DISPOSABLE_BOOLEAN", Context.MODE_PRIVATE);
private static final SharedPreferences DISPOSABLE_BOOLEAN = GlobalAppContext.get().getSharedPreferences("DISPOSABLE_BOOLEAN", Context.MODE_PRIVATE);
private static final String KEY_SERVER_ADDRESS = "Still love you...17.5.14";
private static final String KEY_SHOULD_SHOW_ANNUNCIATION = "Sing about all the things you forgot, things you are not";
private static final String KEY_FIRST_SHOW_AD = "En, Today is 17.7.7, but, I'm still love you so....";
@ -24,9 +27,12 @@ public class Pref {
private static SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
public void onSharedPreferenceChanged(SharedPreferences p, String key) {
if (key.equals(getString(R.string.key_guard_mode))) {
AccessibilityConfig.setIsUnintendedGuardEnabled(sharedPreferences.getBoolean(getString(R.string.key_guard_mode), false));
AccessibilityConfig.setIsUnintendedGuardEnabled(p.getBoolean(getString(R.string.key_guard_mode), false));
} else if ((key.equals(getString(R.string.key_use_volume_control_record)) || key.equals(getString(R.string.key_use_volume_control_running)))
&& p.getBoolean(key, false)) {
GlobalKeyObserver.init();
}
}
};
@ -36,7 +42,7 @@ public class Pref {
}
private static SharedPreferences def() {
return PreferenceManager.getDefaultSharedPreferences(App.getApp());
return PreferenceManager.getDefaultSharedPreferences(GlobalAppContext.get());
}
private static boolean getDisposableBoolean(String key, boolean defaultValue) {
@ -64,7 +70,7 @@ public class Pref {
}
private static String getString(int id) {
return App.getApp().getString(id);
return GlobalAppContext.getString(id);
}
public static boolean isFirstUsing() {
@ -163,7 +169,12 @@ public class Pref {
def().edit().putInt(KEY_EDITOR_TEXT_SIZE, value).apply();
}
public static int getEditorTextSize(int defVlaue) {
return def().getInt(KEY_EDITOR_TEXT_SIZE, defVlaue);
public static int getEditorTextSize(int defValue) {
return def().getInt(KEY_EDITOR_TEXT_SIZE, defValue);
}
public static String getScriptDirPath() {
return def().getString(getString(R.string.key_script_dir_path),
getString(R.string.default_value_script_dir_path));
}
}

View File

@ -1,10 +1,10 @@
package com.stardust.scriptdroid.accessibility;
package org.autojs.autojs.accessibility;
import android.util.SparseArray;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.scriptdroid.R;
import org.autojs.autojs.R;
import com.stardust.util.SparseArrayEntries;
import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_CLICKED;

View File

@ -1,9 +1,9 @@
package com.stardust.scriptdroid.accessibility;
package org.autojs.autojs.accessibility;
import android.accessibilityservice.AccessibilityServiceInfo;
import com.stardust.scriptdroid.Pref;
import org.autojs.autojs.Pref;
/**
* Created by Stardust on 2017/8/14.

View File

@ -0,0 +1,123 @@
package org.autojs.autojs.autojs;
import android.app.Application;
import android.content.Context;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.core.console.GlobalStardustConsole;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.autojs.runtime.exception.ScriptException;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import org.autojs.autojs.App;
import org.autojs.autojs.BuildConfig;
import org.autojs.autojs.Pref;
import org.autojs.autojs.R;
import org.autojs.autojs.pluginclient.DevPluginService;
import org.autojs.autojs.ui.log.LogActivity_;
import org.autojs.autojs.ui.settings.SettingsActivity;
import org.autojs.autojs.ui.settings.SettingsActivity_;
import com.stardust.view.accessibility.AccessibilityService;
import org.autojs.autojs.tool.AccessibilityServiceTool;
/**
* Created by Stardust on 2017/4/2.
*/
public class AutoJs extends com.stardust.autojs.AutoJs {
private static AutoJs instance;
public static AutoJs getInstance() {
return instance;
}
public static void initInstance(Application application) {
instance = new AutoJs(application);
}
private AutoJs(final Application application) {
super(application);
getScriptEngineService().registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener());
}
@Override
protected Console createGlobalConsole() {
return new GlobalStardustConsole(getUiHandler()) {
@Override
public String println(int level, CharSequence charSequence) {
String log = super.println(level, charSequence);
DevPluginService.getInstance().log(log);
return log;
}
};
}
public void ensureAccessibilityServiceEnabled() {
if (AccessibilityService.getInstance() != null) {
return;
}
String errorMessage = null;
if (AccessibilityServiceTool.isAccessibilityServiceEnabled(GlobalAppContext.get())) {
errorMessage = GlobalAppContext.getString(R.string.text_auto_operate_service_enabled_but_not_running);
} else {
if (Pref.shouldEnableAccessibilityServiceByRoot()) {
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) {
errorMessage = GlobalAppContext.getString(R.string.text_enable_accessibility_service_by_root_timeout);
}
} else {
errorMessage = GlobalAppContext.getString(R.string.text_no_accessibility_permission);
}
}
if (errorMessage != null) {
AccessibilityServiceTool.goToAccessibilitySetting();
throw new ScriptException(errorMessage);
}
}
@Override
public void waitForAccessibilityServiceEnabled() {
if (AccessibilityService.getInstance() != null) {
return;
}
String errorMessage = null;
if (AccessibilityServiceTool.isAccessibilityServiceEnabled(GlobalAppContext.get())) {
errorMessage = GlobalAppContext.getString(R.string.text_auto_operate_service_enabled_but_not_running);
} else {
if (Pref.shouldEnableAccessibilityServiceByRoot()) {
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) {
errorMessage = GlobalAppContext.getString(R.string.text_enable_accessibility_service_by_root_timeout);
}
} else {
errorMessage = GlobalAppContext.getString(R.string.text_no_accessibility_permission);
}
}
if (errorMessage != null) {
AccessibilityServiceTool.goToAccessibilitySetting();
if (!org.autojs.autojs.accessibility.AccessibilityService.waitForEnabled(-1)) {
throw new ScriptInterruptedException();
}
}
}
@Override
protected AccessibilityConfig createAccessibilityConfig() {
AccessibilityConfig config = super.createAccessibilityConfig();
if (BuildConfig.CHANNEL.equals("coolapk")) {
config.addWhiteList("com.coolapk.market");
}
return config;
}
@Override
protected ScriptRuntime createRuntime() {
ScriptRuntime runtime = super.createRuntime();
runtime.putProperty("class.settings", SettingsActivity_.class);
runtime.putProperty("class.console", LogActivity_.class);
return runtime;
}
}

View File

@ -1,17 +1,18 @@
package com.stardust.scriptdroid.autojs;
package org.autojs.autojs.autojs;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.execution.ScriptExecution;
import com.stardust.autojs.execution.ScriptExecutionListener;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import org.autojs.autojs.App;
import org.autojs.autojs.R;
/**
* Created by Stardust on 2017/5/3.
*/
public class ScriptExecutionGlobalListener implements ScriptExecutionListener {
private static final String ENGINE_TAG_START_TIME = "com.stardust.scriptdroid.autojs.Goodbye, World";
private static final String ENGINE_TAG_START_TIME = "org.autojs.autojs.autojs.Goodbye, World";
@Override
public void onStart(ScriptExecution execution) {
@ -29,7 +30,7 @@ public class ScriptExecutionGlobalListener implements ScriptExecutionListener {
return;
double seconds = (System.currentTimeMillis() - millis) / 1000.0;
AutoJs.getInstance().getScriptEngineService().getGlobalConsole()
.verbose(App.getApp().getString(R.string.text_execution_finished), execution.getSource().toString(), seconds);
.verbose(GlobalAppContext.getString(R.string.text_execution_finished), execution.getSource().toString(), seconds);
}
@Override

View File

@ -1,13 +1,14 @@
package com.stardust.scriptdroid.autojs.build;
package org.autojs.autojs.autojs.build;
import android.graphics.Bitmap;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.apkbuilder.ApkBuilder;
import com.stardust.autojs.apkbuilder.ManifestEditor;
import com.stardust.autojs.apkbuilder.util.StreamUtils;
import com.stardust.autojs.project.ProjectConfig;
import com.stardust.pio.PFiles;
import com.stardust.scriptdroid.App;
import org.autojs.autojs.App;
import java.io.File;
import java.io.FileInputStream;
@ -98,7 +99,7 @@ public class AutoJsApkBuilder extends ApkBuilder {
@Override
public AutoJsApkBuilder prepare() throws IOException {
if (mProgressCallback != null) {
App.getApp().getUiHandler().post(() -> mProgressCallback.onPrepare(AutoJsApkBuilder.this));
GlobalAppContext.post(() -> mProgressCallback.onPrepare(AutoJsApkBuilder.this));
}
return (AutoJsApkBuilder) super.prepare();
}
@ -179,7 +180,7 @@ public class AutoJsApkBuilder extends ApkBuilder {
@Override
public AutoJsApkBuilder build() throws IOException {
if (mProgressCallback != null) {
App.getApp().getUiHandler().post(() -> mProgressCallback.onBuild(AutoJsApkBuilder.this));
GlobalAppContext.post(() -> mProgressCallback.onBuild(AutoJsApkBuilder.this));
}
mManifestEditor.commit();
if (mAppConfig.icon != null) {
@ -196,7 +197,7 @@ public class AutoJsApkBuilder extends ApkBuilder {
@Override
public AutoJsApkBuilder sign() throws Exception {
if (mProgressCallback != null) {
App.getApp().getUiHandler().post(() -> mProgressCallback.onSign(AutoJsApkBuilder.this));
GlobalAppContext.post(() -> mProgressCallback.onSign(AutoJsApkBuilder.this));
}
return (AutoJsApkBuilder) super.sign();
}
@ -204,7 +205,7 @@ public class AutoJsApkBuilder extends ApkBuilder {
@Override
public AutoJsApkBuilder cleanWorkspace() {
if (mProgressCallback != null) {
App.getApp().getUiHandler().post(() -> mProgressCallback.onClean(AutoJsApkBuilder.this));
GlobalAppContext.post(() -> mProgressCallback.onClean(AutoJsApkBuilder.this));
}
return (AutoJsApkBuilder) super.cleanWorkspace();
}

View File

@ -1,16 +1,19 @@
package com.stardust.scriptdroid.autojs.key;
package org.autojs.autojs.autojs.key;
import android.util.Log;
import android.view.KeyEvent;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.core.inputevent.InputEventObserver;
import com.stardust.autojs.core.inputevent.ShellKeyObserver;
import com.stardust.event.EventDispatcher;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.autojs.AutoJs;
import org.autojs.autojs.Pref;
import org.autojs.autojs.autojs.AutoJs;
import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.view.accessibility.OnKeyListener;
import javax.microedition.khronos.opengles.GL;
/**
* Created by Stardust on 2017/8/14.
*/
@ -25,7 +28,7 @@ public class GlobalKeyObserver implements OnKeyListener, ShellKeyObserver.KeyLis
private static final EventDispatcher.Event<OnVolumeDownListener> VOLUME_DOWN_EVENT = OnVolumeDownListener::onVolumeDown;
private static final String LOG_TAG = "GlobalKeyObserver";
private static final long EVENT_TIMEOUT = 200;
private static GlobalKeyObserver sSingleton = new GlobalKeyObserver();
private static GlobalKeyObserver sSingleton;
private EventDispatcher<OnVolumeDownListener> mVolumeDownEventDispatcher = new EventDispatcher<>();
private boolean mVolumeDownFromShell, mVolumeDownFromAccessibility;
private boolean mVolumeUpFromShell, mVolumeUpFromAccessibility;
@ -35,15 +38,18 @@ public class GlobalKeyObserver implements OnKeyListener, ShellKeyObserver.KeyLis
.addListener(this);
ShellKeyObserver observer = new ShellKeyObserver();
observer.setKeyListener(this);
InputEventObserver.getGlobal().addListener(observer);
InputEventObserver.getGlobal(GlobalAppContext.get()).addListener(observer);
}
public static GlobalKeyObserver getSingleton() {
if (sSingleton == null) {
sSingleton = new GlobalKeyObserver();
}
return sSingleton;
}
public static void init() {
//do nothing
getSingleton();
}
public void onVolumeUp() {

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.autojs.record;
package org.autojs.autojs.autojs.record;
import android.content.Context;
import android.os.Looper;
@ -6,16 +6,16 @@ import android.view.ContextThemeWrapper;
import android.widget.Toast;
import com.stardust.app.DialogUtils;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.core.record.Recorder;
import com.stardust.autojs.core.record.inputevent.InputEventRecorder;
import com.stardust.autojs.core.record.inputevent.InputEventToAutoFileRecorder;
import com.stardust.autojs.core.record.inputevent.InputEventToRootAutomatorRecorder;
import com.stardust.autojs.core.record.inputevent.TouchRecorder;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.ui.common.ScriptOperations;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
import org.autojs.autojs.Pref;
import org.autojs.autojs.R;
import org.autojs.autojs.ui.common.ScriptOperations;
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
import com.stardust.util.ClipboardUtil;
@ -106,7 +106,7 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener {
@Override
public void onStart() {
if (Pref.isRecordToastEnabled())
App.getApp().getUiHandler().toast(R.string.text_start_record);
GlobalAppContext.toast(R.string.text_start_record);
for (Recorder.OnStateChangedListener listener : mOnStateChangedListeners) {
listener.onStart();
}
@ -150,13 +150,13 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener {
if (Looper.myLooper() == Looper.getMainLooper()) {
showRecordHandleDialog(script);
} else {
App.getApp().getUiHandler().post(() -> showRecordHandleDialog(script));
GlobalAppContext.post(() -> showRecordHandleDialog(script));
}
}
private void handleRecordedFile(final String path) {
if (Looper.myLooper() != Looper.getMainLooper()) {
App.getApp().getUiHandler().post(() -> handleRecordedFile(path));
GlobalAppContext.post(() -> handleRecordedFile(path));
return;
}
new ScriptOperations(mContext, null)

View File

@ -1,11 +1,13 @@
package com.stardust.scriptdroid.build;
package org.autojs.autojs.build;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import com.stardust.BuildConfig;
import com.stardust.pio.UncheckedIOException;
import org.autojs.autojs.BuildConfig;
import org.autojs.autojs.ui.build.BuildActivity;
import com.stardust.util.DeveloperUtils;
import java.io.IOException;
@ -20,7 +22,7 @@ public class ApkBuilderPluginHelper {
private static final String PLUGIN_PACKAGE_NAME = "org.autojs.apkbuilderplugin";
private static final String TEMPLATE_APK_PATH = "template.apk";
public static boolean checkPlugin(Context context) {
public static boolean isPluginAvailable(Context context) {
return DeveloperUtils.checkSignature(context, PLUGIN_PACKAGE_NAME);
}
@ -37,4 +39,19 @@ public class ApkBuilderPluginHelper {
throw new RuntimeException(e);
}
}
public static int getPluginVersion(Context context) {
try {
PackageInfo info = context.getPackageManager().getPackageInfo(PLUGIN_PACKAGE_NAME, 0);
return info.versionCode;
} catch (PackageManager.NameNotFoundException e) {
return -1;
}
}
public static int getSuitablePluginVersion() {
return BuildConfig.VERSION_CODE - 200;
}
}

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external;
package org.autojs.autojs.external;
import android.app.IntentService;
import android.content.Intent;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external;
package org.autojs.autojs.external;
import android.content.Context;
import android.content.Intent;
@ -9,9 +9,9 @@ import com.stardust.autojs.script.JavaScriptFileSource;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.autojs.script.SequenceScriptSource;
import com.stardust.autojs.script.StringScriptSource;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.storage.file.StorageFileProvider;
import com.stardust.scriptdroid.model.script.PathChecker;
import org.autojs.autojs.autojs.AutoJs;
import org.autojs.autojs.storage.file.StorageFileProvider;
import org.autojs.autojs.model.script.PathChecker;
import java.io.File;
@ -51,7 +51,7 @@ public class ScriptIntents {
}
config.executePath(new File(path).getParent());
} else {
config.executePath(StorageFileProvider.DEFAULT_DIRECTORY_PATH);
config.executePath(StorageFileProvider.getDefaultDirectoryPath());
}
if (source == null) {
return false;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external.open;
package org.autojs.autojs.external.open;
import android.content.Intent;
import android.os.Bundle;
@ -6,9 +6,9 @@ import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.widget.Toast;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.edit.EditActivity;
import com.stardust.scriptdroid.R;
import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.edit.EditActivity;
import org.autojs.autojs.R;
/**
* Created by Stardust on 2017/2/2.

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external.open;
package org.autojs.autojs.external.open;
import android.content.Intent;
import android.net.Uri;
@ -8,9 +8,9 @@ import android.text.TextUtils;
import android.widget.Toast;
import com.stardust.pio.PFiles;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.common.ScriptOperations;
import com.stardust.scriptdroid.R;
import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.common.ScriptOperations;
import org.autojs.autojs.R;
import java.io.FileNotFoundException;
import java.io.InputStream;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external.open;
package org.autojs.autojs.external.open;
import android.app.Activity;
import android.content.Intent;
@ -9,9 +9,9 @@ import android.widget.Toast;
import com.stardust.autojs.script.StringScriptSource;
import com.stardust.pio.PFiles;
import com.stardust.scriptdroid.external.ScriptIntents;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.model.script.Scripts;
import org.autojs.autojs.external.ScriptIntents;
import org.autojs.autojs.R;
import org.autojs.autojs.model.script.Scripts;
import java.io.FileNotFoundException;
import java.io.InputStream;

View File

@ -1,11 +1,11 @@
package com.stardust.scriptdroid.external.shortcut;
package org.autojs.autojs.external.shortcut;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import com.stardust.scriptdroid.tool.BitmapTool;
import org.autojs.autojs.tool.BitmapTool;
/**
* Created by Stardust on 2017/1/20.

View File

@ -1,13 +1,13 @@
package com.stardust.scriptdroid.external.shortcut;
package org.autojs.autojs.external.shortcut;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import com.stardust.scriptdroid.model.script.PathChecker;
import com.stardust.scriptdroid.external.ScriptIntents;
import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.model.script.Scripts;
import org.autojs.autojs.model.script.PathChecker;
import org.autojs.autojs.external.ScriptIntents;
import org.autojs.autojs.model.script.ScriptFile;
import org.autojs.autojs.model.script.Scripts;
/**
* Created by Stardust on 2017/1/23.

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external.shortcut;
package org.autojs.autojs.external.shortcut;
import android.content.Context;
import android.content.Intent;

View File

@ -1,12 +1,12 @@
package com.stardust.scriptdroid.external.tasker;
package org.autojs.autojs.external.tasker;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import com.stardust.scriptdroid.external.ScriptIntents;
import com.stardust.scriptdroid.external.open.RunIntentActivity;
import org.autojs.autojs.external.ScriptIntents;
import org.autojs.autojs.external.open.RunIntentActivity;
import com.twofortyfouram.locale.sdk.client.receiver.AbstractPluginSettingReceiver;
/**

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external.tasker;
package org.autojs.autojs.external.tasker;
import android.content.Intent;
import android.os.Bundle;
@ -8,19 +8,19 @@ import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.external.ScriptIntents;
import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.storage.file.StorageFileProvider;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.main.scripts.ScriptListView;
import org.autojs.autojs.R;
import org.autojs.autojs.external.ScriptIntents;
import org.autojs.autojs.model.script.ScriptFile;
import org.autojs.autojs.storage.file.StorageFileProvider;
import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.main.scripts.ScriptListView;
import com.twofortyfouram.locale.sdk.client.ui.activity.AbstractAppCompatPluginActivity;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_CONTENT;
import static org.autojs.autojs.ui.edit.EditorView.EXTRA_CONTENT;
/**
@ -43,7 +43,7 @@ public class TaskPrefEditActivity extends AbstractAppCompatPluginActivity {
private void initScriptListRecyclerView() {
mStorageFileProvider = StorageFileProvider.getExternalStorageProvider();
ScriptListView scriptList = (ScriptListView) findViewById(R.id.script_list);
scriptList.setStorageFileProvider(mStorageFileProvider, new ScriptFile(StorageFileProvider.DEFAULT_DIRECTORY));
scriptList.setStorageFileProvider(mStorageFileProvider, new ScriptFile(StorageFileProvider.getDefaultDirectory()));
scriptList.setOnScriptFileClickListener((view, file) -> {
mSelectedScriptFilePath = file.getPath();
finish();

View File

@ -1,11 +1,11 @@
package com.stardust.scriptdroid.external.tasker;
package org.autojs.autojs.external.tasker;
import android.app.Activity;
import android.content.Intent;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.edit.EditorView;
import org.autojs.autojs.R;
import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.edit.EditorView;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
@ -14,10 +14,10 @@ import org.androidannotations.annotations.ViewById;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_CONTENT;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_RUN_ENABLED;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_SAVE_ENABLED;
import static org.autojs.autojs.ui.edit.EditorView.EXTRA_CONTENT;
import static org.autojs.autojs.ui.edit.EditorView.EXTRA_NAME;
import static org.autojs.autojs.ui.edit.EditorView.EXTRA_RUN_ENABLED;
import static org.autojs.autojs.ui.edit.EditorView.EXTRA_SAVE_ENABLED;
/**
* Created by Stardust on 2017/4/5.
@ -48,13 +48,8 @@ public class TaskerScriptEditActivity extends BaseActivity {
@Override
public void finish() {
mEditorView.getEditor().getText().subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, s));
TaskerScriptEditActivity.super.finish();
}
});
setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, mEditorView.getEditor().getText()));
TaskerScriptEditActivity.super.finish();
}
}

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external.widget;
package org.autojs.autojs.external.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
@ -10,9 +10,9 @@ import android.util.Log;
import android.widget.RemoteViews;
import com.stardust.pio.PFiles;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.external.ScriptIntents;
import com.stardust.scriptdroid.external.open.RunIntentActivity;
import org.autojs.autojs.R;
import org.autojs.autojs.external.ScriptIntents;
import org.autojs.autojs.external.open.RunIntentActivity;
import java.util.HashSet;
import java.util.Set;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.external.widget;
package org.autojs.autojs.external.widget;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
@ -7,11 +7,11 @@ import android.support.annotation.Nullable;
import android.view.Menu;
import android.view.MenuItem;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.storage.file.StorageFileProvider;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.main.scripts.ScriptListView;
import org.autojs.autojs.R;
import org.autojs.autojs.model.script.ScriptFile;
import org.autojs.autojs.storage.file.StorageFileProvider;
import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.main.scripts.ScriptListView;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
@ -44,7 +44,7 @@ public class ScriptWidgetSettingsActivity extends BaseActivity {
mStorageFileProvider = StorageFileProvider.getExternalStorageProvider();
ScriptListView scriptList = (ScriptListView) findViewById(R.id.script_list);
scriptList.setStorageFileProvider(mStorageFileProvider);
scriptList.setCurrentDirectory(new ScriptFile(StorageFileProvider.DEFAULT_DIRECTORY));
scriptList.setCurrentDirectory(new ScriptFile(StorageFileProvider.getDefaultDirectory()));
scriptList.setOnScriptFileClickListener((view, file) -> {
mSelectedScriptFilePath = file.getPath();
finish();

View File

@ -1,10 +1,11 @@
package com.stardust.scriptdroid.external.widget;
package org.autojs.autojs.external.widget;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.stardust.scriptdroid.App;
import com.stardust.app.GlobalAppContext;
import org.autojs.autojs.App;
import java.util.HashSet;
import java.util.LinkedList;
@ -22,7 +23,7 @@ public class ScriptWidgets {
private static final String LOG_TAG = "ScriptWidgets";
private static SharedPreferences widgets = App.getApp().getSharedPreferences("ScriptWidgets", Context.MODE_PRIVATE);
private static SharedPreferences widgets = GlobalAppContext.get().getSharedPreferences("ScriptWidgets", Context.MODE_PRIVATE);
private static final Pattern ID_PATTERN = Pattern.compile("[a-zA-Z]+_([0-9])+");
static String getPathForAppWidgetId(int id) {

View File

@ -1,9 +1,9 @@
package com.stardust.scriptdroid.model.autocomplete;
package org.autojs.autojs.model.autocomplete;
import android.text.Editable;
import com.stardust.scriptdroid.model.indices.Property;
import com.stardust.scriptdroid.ui.widget.SimpleTextWatcher;
import org.autojs.autojs.model.indices.Property;
import org.autojs.autojs.ui.widget.SimpleTextWatcher;
import java.util.List;
import java.util.concurrent.ExecutorService;

View File

@ -1,12 +1,12 @@
package com.stardust.scriptdroid.model.autocomplete;
package org.autojs.autojs.model.autocomplete;
import android.content.Context;
import android.widget.EditText;
import com.stardust.scriptdroid.model.indices.Module;
import com.stardust.scriptdroid.model.indices.Modules;
import com.stardust.scriptdroid.model.indices.Property;
import com.stardust.scriptdroid.ui.widget.SimpleTextWatcher;
import org.autojs.autojs.model.indices.Module;
import org.autojs.autojs.model.indices.Modules;
import org.autojs.autojs.model.indices.Property;
import org.autojs.autojs.ui.widget.SimpleTextWatcher;
import java.util.ArrayList;
import java.util.Collections;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.model.autocomplete;
package org.autojs.autojs.model.autocomplete;
/**
* Created by Stardust on 2018/2/3.

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.model.autocomplete;
package org.autojs.autojs.model.autocomplete;
import java.util.ArrayList;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.model.autocomplete;
package org.autojs.autojs.model.autocomplete;
import android.support.annotation.NonNull;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.model.autocomplete;
package org.autojs.autojs.model.autocomplete;
import java.util.Arrays;

View File

@ -1,5 +1,5 @@
package com.stardust.scriptdroid.model.editor;
package org.autojs.autojs.model.editor;
import com.google.gson.annotations.SerializedName;

View File

@ -1,5 +1,5 @@
package com.stardust.scriptdroid.model.editor;
package org.autojs.autojs.model.editor;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.model.editor;
package org.autojs.autojs.model.editor;
import com.google.gson.annotations.SerializedName;

View File

@ -1,4 +1,4 @@
package com.stardust.scriptdroid.model.editor;
package org.autojs.autojs.model.editor;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;

Some files were not shown because too many files have changed in this diff Show More