mirror of
https://github.com/TonyJiangWJ/Auto.js.git
synced 2026-06-24 21:33:16 +08:00
commit
7be59e0c46
BIN
.idea/caches/build_file_checksums.ser
Normal file
BIN
.idea/caches/build_file_checksums.ser
Normal file
Binary file not shown.
221
.idea/codeStyles/Project.xml
Normal file
221
.idea/codeStyles/Project.xml
Normal 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>
|
||||
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default (1)" />
|
||||
</state>
|
||||
</component>
|
||||
@ -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" />
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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.
@ -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"}}]
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.statics;
|
||||
package org.autojs.autojs.statics;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.mozilla.javascript.Context;
|
||||
@ -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
@ -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"><number></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"><string></a></li>
|
||||
</ul>
|
||||
</div><p>当前软件的版本名称,例如"3.0.0 Beta"。</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"><number></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"><string></a></li>
|
||||
</ul>
|
||||
</div><p>Auto.js版本名称,例如"3.0.0 Beta"。</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"><string></a> 应用名称</li>
|
||||
@ -189,6 +220,16 @@ app.sendEmail({
|
||||
subject: "这是一个邮件标题",
|
||||
text: "这是邮件正文"
|
||||
});
|
||||
</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"><string></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("console");
|
||||
</code></pre><h1>进阶: 意图Intent<span><a class="mark" href="#app_intent" id="app_intent">#</a></span></h1>
|
||||
<p>Intent(意图) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:</p>
|
||||
<ul>
|
||||
|
||||
119
app/src/main/assets/docs/canvas.html
Normal file
119
app/src/main/assets/docs/canvas.html
Normal 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&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项目 & 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>
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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("请选择一个选项", ["选项A", "
|
||||
</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"><Object></a> 对话框属性,用于配置对话框。</li>
|
||||
<li>返回 <span class="type"><Dialog></span></li>
|
||||
</ul>
|
||||
</div><p>创建一个可自定义的对话框,例如:</p>
|
||||
<pre><code>dialogs.build({
|
||||
//对话框标题
|
||||
title: "发现新版本",
|
||||
//对话框内容
|
||||
content: "更新日志: 新增了若干了BUG",
|
||||
//确定键内容
|
||||
positive: "下载",
|
||||
//取消键内容
|
||||
negative: "取消",
|
||||
//中性键内容
|
||||
neutral: "到浏览器下载",
|
||||
//勾选框内容
|
||||
checkBoxPrompt: "不再提示"
|
||||
}).on("positive", ()=>{
|
||||
//监听确定键
|
||||
toast("开始下载....");
|
||||
}).on("neutral", ()=>{
|
||||
//监听中性键
|
||||
app.openUrl("https://www.autojs.org");
|
||||
}).on("check", (checked)=>{
|
||||
//监听勾选框
|
||||
log(checked);
|
||||
}).show();
|
||||
</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"><string></a> 对话框标题</li>
|
||||
<li><code>titleColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 对话框标题的颜色</li>
|
||||
<li><code>buttonRippleColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 对话框按钮的波纹效果颜色</li>
|
||||
<li><code>icon</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <span class="type"><Image></span> 对话框的图标,是一个URL或者图片对象 </li>
|
||||
<li><code>content</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 对话框文字内容 </li>
|
||||
<li><code>contentColor</code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 对话框文字内容的颜色</li>
|
||||
<li><code>contentLineSpacing</code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></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"><Array></a> 对话框列表的选项</li>
|
||||
<li><code>itemsColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 对话框列表的选项的文字颜色</li>
|
||||
<li><code>itemsSelectMode</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></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"><number></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type"><Array></a> 对话框列表中???</li>
|
||||
<li><code>positive</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 对话框确定按钮的文字内容(最右边按钮)</li>
|
||||
<li><code>positiveColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 对话框确定按钮的文字颜色(最右边按钮)</li>
|
||||
<li><code>neutral</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 对话框中立按钮的文字内容(最左边按钮)</li>
|
||||
<li><code>neutralColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 对话框中立按钮的文字颜色(最左边按钮)</li>
|
||||
<li><code>negative</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 对话框取消按钮的文字内容(确定按钮左边的按钮)</li>
|
||||
<li><code>negativeColor</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 对话框取消按钮的文字颜色(确定按钮左边的按钮)</li>
|
||||
<li><code>checkBoxPrompt</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 勾选框文字内容</li>
|
||||
<li><code>checkBoxChecked</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type"><boolean></a> 勾选框是否勾选 </li>
|
||||
<li><code>progress</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type"><Object></a> 配置对话框进度条的对象:<ul>
|
||||
<li><code>max</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 进度条的最大值,如果为-1则为无限循环的进度条</li>
|
||||
<li><code>horizontal</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type"><boolean></a> 如果为true, 则对话框无限循环的进度条为水平进度条</li>
|
||||
<li><code>showMinMax</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type"><boolean></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"><boolean></a> 对话框是否可取消,如果为false,则对话框只能用代码手动取消</li>
|
||||
<li><code>canceledOnTouchOutside</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type"><boolean></a> 对话框是否在点击对话框以外区域时自动取消,默认为true</li>
|
||||
<li><code>inputHint</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 对话框的输入框的输入提示</li>
|
||||
<li><code>inputPrefill</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 对话框输入框的默认输入内容</li>
|
||||
</ul>
|
||||
<p>通过这些选项可以自定义一个对话框,并通过监听返回的Dialog对象的按键、输入事件来实现交互。下面是一些例子。</p>
|
||||
<p>模拟alert对话框:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "你好",
|
||||
content: "今天也要元气满满哦",
|
||||
positive: "好的"
|
||||
}).show();
|
||||
</code></pre><p>模拟confirm对话框:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "你好",
|
||||
content: "请问你是笨蛋吗?",
|
||||
positive: "是的",
|
||||
negative: "我是大笨蛋"
|
||||
}).on("positive", ()=>{
|
||||
alert("哈哈哈笨蛋");
|
||||
}).on("negative", ()=>{
|
||||
alert("哈哈哈大笨蛋");
|
||||
}).show();
|
||||
</code></pre><p>模拟单选框:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "单选",
|
||||
items: ["选项1", "选项2", "选项3", "选项4"],
|
||||
itemsSelectMode: "singleChoice",
|
||||
itemsSelectedIndex: 3
|
||||
}).on("item_select", (index, item)->{
|
||||
toast("您选择的是" + item);
|
||||
}).show();
|
||||
</code></pre><p>"处理中"对话框:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "下载中...",
|
||||
progress: {
|
||||
max: -1
|
||||
},
|
||||
cancelable: false
|
||||
}).show();
|
||||
|
||||
setTimeout(()=>{
|
||||
d.dismiss();
|
||||
}, 3000);
|
||||
</code></pre><p>输入对话框:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "请输入您的年龄",
|
||||
inputPrefill: "18"
|
||||
}).on("input", (input)=>{
|
||||
var age = parseInt(input);
|
||||
toastLog(age);
|
||||
}).show();
|
||||
</code></pre><p>使用这个函数来构造对话框,一个明显的不同是需要使用回调函数而不能像dialogs其他函数一样同步地返回结果;但也可以通过threads模块的方法来实现。例如显示一个输入框并获取输入结果为:</p>
|
||||
<pre><code>var input = threads.disposable();
|
||||
dialogas.build({
|
||||
title: "请输入您的年龄",
|
||||
inputPrefill: "18"
|
||||
}).on("input", text => {
|
||||
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"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>对话框显示时会触发的事件。例如:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "标题"
|
||||
}).on("show", (dialog)=>{
|
||||
toast("对话框显示了");
|
||||
}).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"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>对话框被取消时会触发的事件。一个对话框可能按取消按钮、返回键取消或者点击对话框以外区域取消。例如:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "标题",
|
||||
positive: "确定",
|
||||
negative: "取消"
|
||||
}).on("cancel", (dialog)=>{
|
||||
toast("对话框取消了");
|
||||
}).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"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>对话框消失时会触发的事件。对话框被取消或者手动调用<code>dialog.dismiss()</code>函数都会触发该事件。例如:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "标题",
|
||||
positive: "确定",
|
||||
negative: "取消"
|
||||
}).on("dismiss", (dialog)=>{
|
||||
toast("对话框消失了");
|
||||
}).show();
|
||||
|
||||
setTimeout(()=>{
|
||||
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"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>确定按钮按下时触发的事件。例如:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "标题",
|
||||
positive: "确定",
|
||||
negative: "取消"
|
||||
}).on("positive", (dialog)=>{
|
||||
toast("你点击了确定");
|
||||
}).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"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>取消按钮按下时触发的事件。例如:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "标题",
|
||||
positive: "确定",
|
||||
negative: "取消"
|
||||
}).on("negative", (dialog)=>{
|
||||
toast("你点击了取消");
|
||||
}).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"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>中性按钮按下时触发的事件。例如:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "标题",
|
||||
positive: "确定",
|
||||
negative: "取消",
|
||||
neutral: "稍后提示"
|
||||
}).on("positive", (dialog)=>{
|
||||
toast("你点击了稍后提示");
|
||||
}).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"><Dialog></span> 对话框</li>
|
||||
<li><code>action</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></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: "标题",
|
||||
positive: "确定",
|
||||
negative: "取消",
|
||||
neutral: "稍后提示"
|
||||
}).on("any", (action, dialog)=>{
|
||||
if(action == "positive"){
|
||||
toast("你点击了确定");
|
||||
}else if(action == "negative"){
|
||||
toast("你点击了取消");
|
||||
}
|
||||
}).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"><number></a> 被选中的项目索引,从0开始</li>
|
||||
<li><code>item</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type"><Object></a> 被选中的项目</li>
|
||||
<li><code>dialog</code> <span class="type"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>对话框列表(itemsSelectMode为"select")的项目被点击选中时触发的事件。例如:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "请选择",
|
||||
positive: "确定",
|
||||
negative: "取消",
|
||||
items: ["A", "B", "C", "D"],
|
||||
itemsSelectMode: "select"
|
||||
}).on("item_select", (index, item, dialog)=>{
|
||||
toast("您选择的是第" + (index + 1) + "项, 选项为" + item);
|
||||
}).show();
|
||||
</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"><number></a> 被选中的项目索引,从0开始</li>
|
||||
<li><code>item</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type"><Object></a> 被选中的项目</li>
|
||||
<li><code>dialog</code> <span class="type"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>对话框单选列表(itemsSelectMode为"singleChoice")的项目被选中并点击确定时触发的事件。例如:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "请选择",
|
||||
positive: "确定",
|
||||
negative: "取消",
|
||||
items: ["A", "B", "C", "D"],
|
||||
itemsSelectMode: "singleChoice"
|
||||
}).on("item_select", (index, item, dialog)=>{
|
||||
toast("您选择的是第" + (index + 1) + "项, 选项为" + item);
|
||||
}).show();
|
||||
</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"><Array></a> 被选中的项目的索引的数组</li>
|
||||
<li><code>items</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="type"><Array></a> 被选中的项目的数组</li>
|
||||
<li><code>dialog</code> <span class="type"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>对话框多选列表(itemsSelectMode为"multiChoice")的项目被选中并点击确定时触发的事件。例如:</p>
|
||||
<pre><code>var d = dialogs.build({
|
||||
title: "请选择",
|
||||
positive: "确定",
|
||||
negative: "取消",
|
||||
items: ["A", "B", "C", "D"],
|
||||
itemsSelectMode: "multiChoice"
|
||||
}).on("item_select", (indices, items, dialog)=>{
|
||||
toast(util.format("您选择的项目为%o, 选项为%o", indices, items);
|
||||
}).show();
|
||||
</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"><string></a> 输入框的内容</li>
|
||||
<li><code>dialog</code> <span class="type"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>带有输入框的对话框当点击确定时会触发的事件。例如:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "请输入",
|
||||
positive: "确定",
|
||||
negative: "取消",
|
||||
inputPrefill: ""
|
||||
}).on("input", (text, dialog)=>{
|
||||
toast("你输入的是" + 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"><string></a> 输入框的内容</li>
|
||||
<li><code>dialog</code> <span class="type"><Dialog></span> 对话框</li>
|
||||
</ul>
|
||||
</div><p>对话框的输入框的文本发生变化时会触发的事件。例如:</p>
|
||||
<pre><code>dialogs.build({
|
||||
title: "请输入",
|
||||
positive: "确定",
|
||||
negative: "取消",
|
||||
inputPrefill: ""
|
||||
}).on("input_change", (text, dialog)=>{
|
||||
toast("你输入的是" + text);
|
||||
}).show();
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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"><Array></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"><string></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"><string></a> 事件名称</li>
|
||||
<li><code>...args</code> <span class="type"><any></span> 事件参数</li>
|
||||
</ul>
|
||||
</div><p>向该脚本引擎发送一个事件,该事件可以在该脚本引擎对应的脚本的events模块监听到并在脚本主线程执行事件处理。</p>
|
||||
<p>例如脚本receiver.js的内容如下:</p>
|
||||
<pre><code>//监听say事件
|
||||
events.on("say", function(words){
|
||||
toastLog(words);
|
||||
});
|
||||
//保持脚本运行
|
||||
setInterval(()=>{}, 1000);
|
||||
</code></pre><p>同一目录另一脚本可以启动他并发送该事件:</p>
|
||||
<pre><code>//运行脚本
|
||||
var e = engines.execScriptFile("./receiver.js");
|
||||
//等待脚本启动
|
||||
sleep(2000);
|
||||
//向该脚本发送事件
|
||||
e.getEngine().emit("say", "你好");
|
||||
</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>
|
||||
|
||||
@ -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("home", function(event){
|
||||
<li><code>keyName</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></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"><boolean></a></li>
|
||||
<li><code>key</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 要屏蔽的按键</li>
|
||||
</ul>
|
||||
</div><p>设置按键屏蔽是否启用。所谓按键屏蔽指的是,屏蔽原有按键的功能,例如使得音量键不再能调节音量,但此时仍然能通过按键事件监听按键。</p>
|
||||
<p>如果不加参数key则会屏蔽所有按键。</p>
|
||||
<p>例如,调用<code>events.setKeyInterceptionEnabled(true)</code>会使系统的音量、Home、返回等键不再具有调节音量、回到主页、返回的作用,但此时仍然能通过按键事件监听按键。</p>
|
||||
<p>该函数通常于按键监听结合,例如想监听音量键并使音量键按下时不弹出音量调节框则为:</p>
|
||||
<pre><code>events.setKeyInterceptionEnabled("volume_up", true);
|
||||
events.observeKey();
|
||||
events.onKeyDown("volume_up", ()=>{
|
||||
log("音量上键被按下");
|
||||
});
|
||||
</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('event');
|
||||
</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("hello", "小明");
|
||||
</code></pre><p>在其他脚本中监听并处理:</p>
|
||||
<pre><code>events.broadcast.on("hello", function(name){
|
||||
toast("你好, " + name);
|
||||
});
|
||||
//保持脚本运行
|
||||
setInterval(()=>{}, 1000);
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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"><xml></span> | <span class="type"><View></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(()=>{
|
||||
<pre><code>ui.run(function(){
|
||||
w.text.setText("文本");
|
||||
});
|
||||
</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"><xml></span> | <span class="type"><View></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(
|
||||
<frame gravity="center">
|
||||
<text id="text">悬浮文字</text>
|
||||
</frame>
|
||||
);
|
||||
|
||||
w.setPosition(500, 500);
|
||||
|
||||
setTimeout(()=>{
|
||||
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"><boolean></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"><number></a> x</li>
|
||||
<li><code>x</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></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"><number></a> 宽度</li>
|
||||
<li><code>height</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></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"><Boolean></a> 是否可触摸</li>
|
||||
</ul>
|
||||
</div><p>设置悬浮窗是否可触摸,如果为true, 则悬浮窗将接收到触摸、点击等事件并且无法继续传递到悬浮窗下面;如果为false, 悬浮窗上的触摸、点击等事件将被直接传递到悬浮窗下面。处于安全考虑,被悬浮窗接收的触摸事情无法再继续传递到下层。</p>
|
||||
<p>可以用此特性来制作护眼模式脚本。</p>
|
||||
<pre><code>var w = floaty.rawWindow(
|
||||
<frame gravity="center" bg="#44ffcc00"/>
|
||||
);
|
||||
|
||||
w.setSize(-1, -1);
|
||||
w.setTouchable(false);
|
||||
|
||||
setTimeout(()=>{
|
||||
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"><number></a> x</li>
|
||||
<li><code>x</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></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"><number></a> 宽度</li>
|
||||
<li><code>height</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> 高度</li>
|
||||
</ul>
|
||||
</div><p>设置悬浮窗宽高。</p>
|
||||
<p>特别地,如果设置为-1,则为占满全屏;设置为-2则为根据悬浮窗内容大小而定。例如:</p>
|
||||
<pre><code>var w = floaty.rawWindow(
|
||||
<frame gravity="center" bg="#77ff0000">
|
||||
<text id="text">悬浮文字</text>
|
||||
</frame>
|
||||
);
|
||||
|
||||
w.setSize(-1, -1);
|
||||
|
||||
setTimeout(()=>{
|
||||
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>
|
||||
|
||||
@ -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 < 100; i++){
|
||||
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></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"><string></a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></a> Auto.js的版本或版本号</li>
|
||||
</ul>
|
||||
</div><p>表示此脚本需要Auto.js版本达到指定版本才能运行。例如<code>requiresAutojsVersion("3.0.0 Beta")</code>表示脚本需要在Auto.js 3.0.0 Beta以及以上运行。</p>
|
||||
<p>调用该函数时会判断运行脚本的Auto.js的版本号,如果没有达到要求则抛出异常。</p>
|
||||
<p>version参数可以是整数表示版本号,例如<code>requiresAutojsVersion(250)</code>;也可以是字符串格式表示的版本,例如"3.0.0 Beta", "3.1.0 Alpha4", "3.2.0"等。</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"><Array></a> 权限的字符串数组</li>
|
||||
</ul>
|
||||
</div><p>动态申请安卓的权限。例如:</p>
|
||||
<pre><code>//请求GPS权限
|
||||
runtime.requestPermissions(["access_fine_location"]);
|
||||
</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>
|
||||
|
||||
@ -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("www.baidu.com", {}, function(res, err){
|
||||
console.error(err);
|
||||
return;
|
||||
}
|
||||
log("code = " + r.statusCode);
|
||||
log("html = " + r.body.string());
|
||||
log("code = " + res.statusCode);
|
||||
log("html = " + res.body.string());
|
||||
});
|
||||
</code></pre><p>如果要增加HTTP头部信息,则在options参数中添加,例如:</p>
|
||||
<pre><code>console.show();
|
||||
var r = http.get("www.baidu.com", {
|
||||
headers: {
|
||||
"Accept-Language": "zh-cn,zh;q=0.5",
|
||||
"User-Agent: "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"
|
||||
'Accept-Language': 'zh-cn,zh;q=0.5',
|
||||
'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'
|
||||
}
|
||||
});
|
||||
log("code = " + r.statusCode);
|
||||
|
||||
@ -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 = "png", 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 = "png", 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 = "png", 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("#112233", "#112234"));
|
||||
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,是一个"32位整数"(虽然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"><image></span> 图片</li>
|
||||
<li><code>path</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 路劲</li>
|
||||
<li><code>img</code> <span class="type"><Image></span> 图片</li>
|
||||
<li>返回 <span class="type"><Image></span></li>
|
||||
</ul>
|
||||
</div><p>复制一张图片并返回新的副本。该函数会完全复制img对象的数据。</p>
|
||||
<h2>images.save(image, path[, format = "png", 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"><Image></span> 图片</li>
|
||||
<li><code>path</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 路径</li>
|
||||
<li><code>format</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></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"><number></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("/sdcard/1.png");
|
||||
images.save(img, "/sdcard/1.jpg", "jpg", 50);
|
||||
app.viewFile("/sdcard/1.jpg");
|
||||
</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"><string></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"><string></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"><string></a> 图片的Base64数据</li>
|
||||
<li>返回 <span class="type"><Image></span></li>
|
||||
</ul>
|
||||
</div><p>解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回<code>null</code>。</p>
|
||||
<h2>images.toBase64(img[, format = "png", 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"><image></span> 图片</li>
|
||||
<li><code>format</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></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"><number></a> 图片质量,为0~100的整数值</li>
|
||||
<li>返回 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></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"><byte[]></span> 字节数组</li>
|
||||
</ul>
|
||||
</div><p>解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回<code>null</code>。</p>
|
||||
<h2>images.toBytes(img[, format = "png", 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"><image></span> 图片</li>
|
||||
<li><code>format</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></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"><number></a> 图片质量,为0~100的整数值</li>
|
||||
<li>返回 <span class="type"><byte[]></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"><Image></span> 图片</li>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
177
app/src/main/assets/docs/media.html
Normal file
177
app/src/main/assets/docs/media.html
Normal 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&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项目 & 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("/sdcard/1.mp3");
|
||||
//让音乐播放完
|
||||
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"><string></a> 媒体文件路径</li>
|
||||
</ul>
|
||||
</div><p>扫描路径path的媒体文件,将它加入媒体库中;或者如果该文件以及被删除,则通知媒体库移除该文件。</p>
|
||||
<p>媒体库包括相册、音乐库等,因此该函数可以用于把某个图片文件加入相册。</p>
|
||||
<pre><code>//请求截图
|
||||
requestScreenCapture(false);
|
||||
//截图
|
||||
var im = captureScreen();
|
||||
var path = "/sdcard/screenshot.png";
|
||||
//保存图片
|
||||
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"><string></a> 音乐文件路径</li>
|
||||
<li><code>volume</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></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"><boolean></a> 是否循环播放,如果looping为<code>true</code>则循环播放,默认为<code>false</code></li>
|
||||
</ul>
|
||||
</div><p>播放音乐文件path。该函数不会显示任何音乐播放界面。如果文件不存在或者文件不是受支持的音乐格式,则抛出<code>UncheckedIOException</code>异常。</p>
|
||||
<pre><code>//播放音乐
|
||||
media.playMusic("/sdcard/1.mp3");
|
||||
//让音乐播放完
|
||||
sleep(media.getMusicDuration());
|
||||
</code></pre><p>如果要循环播放音乐,则使用looping参数:</p>
|
||||
<pre><code>
|
||||
</code></pre><p>//传递第三个参数为true以循环播放音乐
|
||||
media.playMusic("/sdcard/1.mp3", 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"><number></a> 毫秒数,表示音乐进度</li>
|
||||
</ul>
|
||||
</div><p>把当前播放进度调整到时间msec的位置。如果当前没有在播放音乐,则调用函数没有任何效果。</p>
|
||||
<p>例如,要把音乐调到1分钟的位置,为<code>media.musicSeekTo(60 * 1000)</code>。</p>
|
||||
<pre><code>//播放音乐
|
||||
media.playMusic("/sdcard/1.mp3");
|
||||
//调整到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"><boolean></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"><number></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"><number></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>
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
321
app/src/main/assets/docs/sensors.html
Normal file
321
app/src/main/assets/docs/sensors.html
Normal 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&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项目 & 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">事件: 'unsupported_sensor'</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">事件: 'change'</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#sensors_accuracy_change">事件: 'accuracy_change'</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("light").on("change", (event, light)=>{
|
||||
log("当前光强度为", 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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><number></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"><string></a> 传感器名称,常用的传感器名称如上面所述</li>
|
||||
<li><code>delay</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type" class="type"><number></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("gravity");
|
||||
if(sensor == null){
|
||||
toast("不支持重力传感器");
|
||||
exit();
|
||||
}
|
||||
//监听数据
|
||||
sensor.on("change", (gx, gy, gz)=>{
|
||||
log("重力加速度: %d, %d, %d", gx, gy, gz);
|
||||
});
|
||||
</code></pre><p>可以通过delay参数来指定传感器数据的更新频率,例如:</p>
|
||||
<pre><code>var sensor = sensors.register("gravity", 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("gravity").on("change", (gx, gy, gz)=>{
|
||||
log("重力加速度: %d, %d, %d", 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("gravity");
|
||||
if(sensor == null){
|
||||
exit();
|
||||
}
|
||||
//2秒后注销该监听器
|
||||
setTimeout(()=> {
|
||||
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"><boolean></a></li>
|
||||
</ul>
|
||||
</div><p>表示是否忽略不支持的传感器。如果该值被设置为<code>true</code>,则函数<code>sensors.register()</code>即使对不支持的传感器也会返回一个无任何数据的虚拟传感器监听,也就是<code>sensors.register()</code>不会返回<code>null</code>从而避免非空判断,并且此时会触发<code>sensors</code>的"unsupported_sensor"事件。</p>
|
||||
<pre><code>//忽略不支持的传感器
|
||||
sensors.ignoresUnsupportedSensor = true;
|
||||
//监听有不支持的传感器时的事件
|
||||
sensors.on("unsupported_sensor", function(sensorName){
|
||||
toastLog("不支持的传感器: " + sensorName);
|
||||
});
|
||||
//随便注册一个不存在的传感器。
|
||||
log(sensors.register("aaabbb"));
|
||||
</code></pre><h2>事件: 'unsupported_sensor'<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"><string></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>事件: 'change'<span><a class="mark" href="#sensors_change" id="sensors_change">#</a></span></h2>
|
||||
<div class="signature"><ul>
|
||||
<li><code>..args</code> <span class="type"><Any></span> 传感器参数</li>
|
||||
</ul>
|
||||
</div><p>当传感器数据改变时触发该事件;该事件触发的最高频繁由<code>sensors.register()</code>指定的delay参数决定。</p>
|
||||
<p>事件参数根据传感器类型不同而不同,具体参见本章最前面的列表。</p>
|
||||
<p>一个监听光线传感器和加速度传感器并且每0.5秒获取一个数据并最终写入一个csv表格文件的例子如下:</p>
|
||||
<pre><code>//csv文件路径
|
||||
cosnt csvPath = "/sdcard/sensors_data.csv";
|
||||
//记录光线传感器的数据
|
||||
var light = 0;
|
||||
//记录加速度传感器的数据
|
||||
var ax = 0;
|
||||
var ay = 0;
|
||||
var az = 0;
|
||||
//监听光线传感器
|
||||
sensors.register("light", sensors.delay.fastest)
|
||||
.on("change", l => {
|
||||
light = l;
|
||||
});
|
||||
//监听加速度传感器
|
||||
sensors.register("accelerometer", sensors.delay.fastest)
|
||||
.on("change", (ax0, ay0, az0) => {
|
||||
ax = ax0;
|
||||
ay = ay0;
|
||||
az = az0;
|
||||
});
|
||||
|
||||
var file = open(csvPath, "w");
|
||||
//写csv表格头
|
||||
file.writeline("light,ax,ay,az")
|
||||
//每0.5秒获取一次数据并写入文件
|
||||
setInterval(()=>{
|
||||
file.writeline(util.format("%d,%d,%d,%d", light, ax, ay, az));
|
||||
}, 500);
|
||||
//10秒后退出并打开文件
|
||||
setTimeout(()=>{
|
||||
file.close();
|
||||
sensors.unregsiterAll();
|
||||
app.viewFile(csvPath);
|
||||
}, 10 * 1000);
|
||||
</code></pre><h2>事件: 'accuracy_change'<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"><number></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>
|
||||
@ -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"><string></a> 要执行的命令</li>
|
||||
<li>root <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type"><Boolean></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"><Boolean></a> 是否以root权限运行一个shell进程。这将会影响其后使用该Shell对象执行的命令的权限</li>
|
||||
<li>root <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type"><Boolean></a> 是否以root权限运行一个shell进程,默认为false。这将会影响其后使用该Shell对象执行的命令的权限</li>
|
||||
</ul>
|
||||
</div><p>Shell对象的"构造函数"。</p>
|
||||
<pre><code>var sh = new Shell(true);
|
||||
|
||||
@ -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("ABC");
|
||||
<pre><code>var storage = storages.create("ABC");
|
||||
storage.put("a", 123);
|
||||
</code></pre><p>而在另一个脚本中是可以获取到ABC以及a的值的:</p>
|
||||
<pre><code>var storage = storages.create("ABC");
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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><img w="100" h="100" circle="true" bg="white" src="http://www.autojs.org/assets/uploads/profile/3-profileavatar.png" /></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之和。所谓"剩余高度",指的是垂直布局中减去没有指定layout_weight的控件的剩余高度。
|
||||
例如:</p>
|
||||
<pre><code>"ui";
|
||||
ui.layout(
|
||||
<vertical h="100dp">
|
||||
<text layout_weight="1" text="控件1" bg="#ff0000"/>
|
||||
<text layout_weight="1" text="控件2" bg="#00ff00"/>
|
||||
<text layout_weight="1" text="控件3" bg="#0000ff"/>
|
||||
</vertical>
|
||||
);
|
||||
</code></pre><p>在这个布局中,三个控件的layout_weight都是1,也就是他们的高度都会占垂直布局高度的1/3,都是33.3dp.
|
||||
再例如:</p>
|
||||
<pre><code>"ui";
|
||||
ui.layout(
|
||||
<vertical h="100dp">
|
||||
<text layout_weight="1" text="控件1" bg="#ff0000"/>
|
||||
<text layout_weight="2" text="控件2" bg="#00ff00"/>
|
||||
<text layout_weight="1" text="控件3" bg="#0000ff"/>
|
||||
</vertical>
|
||||
);
|
||||
</code></pre><p>在这个布局中,第一个控件高度为1/4, 第二个控件为2/4, 第三个控件为1/4.
|
||||
再例如:</p>
|
||||
<pre><code>"ui";
|
||||
ui.layout(
|
||||
<vertical h="100dp" weightSum="5">
|
||||
<text layout_weight="1" text="控件1" bg="#ff0000"/>
|
||||
<text layout_weight="2" text="控件2" bg="#00ff00"/>
|
||||
<text layout_weight="1" text="控件3" bg="#0000ff"/>
|
||||
</vertical>
|
||||
);
|
||||
</code></pre><p>在这个布局中,因为指定了weightSum为5, 因此第一个控件高度为1/5, 第二个控件为2/5, 第三个控件为1/5.
|
||||
再例如:</p>
|
||||
<pre><code>"ui";
|
||||
ui.layout(
|
||||
<vertical h="100dp">
|
||||
<text h="40dp" text="控件1" bg="#ff0000"/>
|
||||
<text layout_weight="2" text="控件2" bg="#00ff00"/>
|
||||
<text layout_weight="1" text="控件3" bg="#0000ff"/>
|
||||
</vertical>
|
||||
);
|
||||
</code></pre><p>在这个布局中,第一个控件并没有指定layout_weight, 而是指定高度为40dp, 因此不加入比例计算,此时布局剩余高度为60dp。第二个控件高度为剩余高度的2/3,也就是40dp,第三个控件高度为剩余高度的1/3,也就是20dp。</p>
|
||||
<p>垂直布局的layout_weight属性还可以用于控制他的子控件高度占满剩余空间,例如:</p>
|
||||
<pre><code>"ui";
|
||||
ui.layout(
|
||||
<vertical h="100dp">
|
||||
<text h="40dp" text="控件1" bg="#ff0000"/>
|
||||
<text h="40dp" text="控件2" bg="#00ff00"/>
|
||||
<text layout_weight="1" text="控件3" bg="#0000ff"/>
|
||||
</vertical>
|
||||
);
|
||||
</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><linear orientation="vertical"></linear></code>相当于<code><vertical></vertical></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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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("fast");
|
||||
</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"><string></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>
|
||||
|
||||
@ -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": "脚本引擎"
|
||||
}
|
||||
]
|
||||
@ -1,5 +1,5 @@
|
||||
auto();
|
||||
events.observeNotification();
|
||||
events.observeToast();
|
||||
events.onToast(function(toast){
|
||||
var pkg = toast.getPackageName();
|
||||
log("Toast内容: " + toast.getText() +
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
89
app/src/main/assets/sample/复杂界面/界面模板一.js
Normal file
89
app/src/main/assets/sample/复杂界面/界面模板一.js
Normal 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;
|
||||
}
|
||||
})
|
||||
@ -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());
|
||||
}
|
||||
59
app/src/main/assets/sample/复杂界面/音乐浏览器.js
Normal file
59
app/src/main/assets/sample/复杂界面/音乐浏览器.js
Normal 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
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
66
app/src/main/assets/sample/对话框/模拟更新下载对话框.js
Normal file
66
app/src/main/assets/sample/对话框/模拟更新下载对话框.js
Normal 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);
|
||||
}
|
||||
|
||||
33
app/src/main/assets/sample/悬浮窗/悬浮窗输入框.js
Normal file
33
app/src/main/assets/sample/悬浮窗/悬浮窗输入框.js
Normal 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);
|
||||
10
app/src/main/assets/sample/悬浮窗/护眼模式.js
Normal file
10
app/src/main/assets/sample/悬浮窗/护眼模式.js
Normal 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);
|
||||
@ -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());
|
||||
});
|
||||
|
||||
|
||||
|
||||
41
app/src/main/assets/sample/画布/函数图像简单版.js
Normal file
41
app/src/main/assets/sample/画布/函数图像简单版.js
Normal 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);
|
||||
}
|
||||
});
|
||||
99
app/src/main/assets/sample/画布/函数图像高级版.js
Normal file
99
app/src/main/assets/sample/画布/函数图像高级版.js
Normal 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;
|
||||
});
|
||||
183
app/src/main/assets/sample/画布/贪吃蛇.js
Normal file
183
app/src/main/assets/sample/画布/贪吃蛇.js
Normal 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);
|
||||
}
|
||||
231
app/src/main/assets/sample/画布/贪吃蛇重力感应版.js
Normal file
231
app/src/main/assets/sample/画布/贪吃蛇重力感应版.js
Normal file
File diff suppressed because one or more lines are too long
@ -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);
|
||||
});
|
||||
33
app/src/main/assets/sample/界面控件/列表控件.js
Normal file
33
app/src/main/assets/sample/界面控件/列表控件.js
Normal 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);
|
||||
});
|
||||
@ -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");
|
||||
});
|
||||
@ -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("第一个框被取消勾选了");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@ -11,6 +11,10 @@ ui.layout(
|
||||
</vertical>
|
||||
);
|
||||
|
||||
ui.click_me.click(()=>{
|
||||
ui.click_me.on("click", ()=>{
|
||||
toast("我被点啦");
|
||||
});
|
||||
|
||||
ui.click_me.on("long_click", ()=>{
|
||||
toast("我被长按啦");
|
||||
});
|
||||
48
app/src/main/assets/sample/界面控件/表格控件-内置图标查看器.js
Normal file
48
app/src/main/assets/sample/界面控件/表格控件-内置图标查看器.js
Normal file
File diff suppressed because one or more lines are too long
@ -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";
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
18
app/src/main/java/org/autojs/autojs/Constants.java
Normal file
18
app/src/main/java/org/autojs/autojs/Constants.java
Normal 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";
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid;
|
||||
package org.autojs.autojs;
|
||||
|
||||
import org.mozilla.javascript.Context;
|
||||
import org.mozilla.javascript.ContextAction;
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
@ -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.
|
||||
123
app/src/main/java/org/autojs/autojs/autojs/AutoJs.java
Normal file
123
app/src/main/java/org/autojs/autojs/autojs/AutoJs.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
|
||||
@ -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();
|
||||
}
|
||||
@ -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() {
|
||||
@ -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)
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.external;
|
||||
package org.autojs.autojs.external;
|
||||
|
||||
import android.app.IntentService;
|
||||
import android.content.Intent;
|
||||
@ -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;
|
||||
@ -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.
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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.
|
||||
@ -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.
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.external.shortcut;
|
||||
package org.autojs.autojs.external.shortcut;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
@ -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();
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
@ -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();
|
||||
@ -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) {
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.model.autocomplete;
|
||||
package org.autojs.autojs.model.autocomplete;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2018/2/3.
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.model.autocomplete;
|
||||
package org.autojs.autojs.model.autocomplete;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.model.autocomplete;
|
||||
package org.autojs.autojs.model.autocomplete;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.model.autocomplete;
|
||||
package org.autojs.autojs.model.autocomplete;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
package com.stardust.scriptdroid.model.editor;
|
||||
package org.autojs.autojs.model.editor;
|
||||
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
@ -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;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.stardust.scriptdroid.model.editor;
|
||||
package org.autojs.autojs.model.editor;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
@ -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
Loading…
Reference in New Issue
Block a user