auto.js の基本操作を超完全に網羅しており、現在は autoX.js の制御方法となっています。2023年7月15日更新!(第4章/4章)

02_auto.jsの基本操作 1/4

アンドロイドのジェスチャー

左上隅をクリックします

"auto";

setScreenMetrics(1080, 1920);   // 屏幕分辨率1080*1920

click(100, 150);

通知シェードを引き出す

"auto";

//表示从位置(500, 10)滑动到位置(500, 1000), 持续两秒
swipe(500, 10, 500, 1000, 2000);

3本の指でこねる

"auto";
setScreenMetrics(1080, 1920);
//如果你使用的是MIUI,此脚本运行后会出现桌面多屏幕编辑
home();
sleep(1500);
gestures([350, [800, 300], [500, 1000]],
         [350, [300, 1500], [500, 1000]],
         [350, [300, 300], [500, 1000]]);

3本指でスライド

"auto";
/**
 * 同时模拟三个手势:
 * 从(300, 400)到(300, 1400)
 * 从(600, 400)到(600, 1400)
 * 从(900, 400)到(900, 1400)
 * 每一个的时长都为350毫秒
 */
gestures([350, [300, 400], [300, 1400]],
         [350, [600, 400], [600, 1400]],
         [350, [900, 400], [900, 1400]]
);

2本の指でピンチする

"auto";

setScreenMetrics(1080, 1920);

//如果你使用的是MIUI,此脚本运行后会出现桌面编辑
home();
sleep(1500);
gestures([500, [800, 300], [500, 1000]],
         [500, [300, 1500], [500, 1000]]);

心のジェスチャー

"auto";

toast("开启开发者选项-指针位置或者在画画软件才能查看效果");

setScreenMetrics(1080, 1920);

var points = [10000];
var interval = 0.1;
var x0 = 600;
var y0 = 1000;
var a = 120;

for(var t = 0; t < 2 * Math.PI; t += interval){
    
    
    var x = x0 + a * (2 * Math.cos(t) - Math.cos(2 * t));
    var y = y0 + a * (2 * Math.sin(t) - Math.sin(2 * t));
    points.push([parseInt(x), parseInt(y)]);
}

gesture.apply(null, points);

解凍する

例1

//压缩文件路径(必须是完整路径)
var filePath = "/sdcard/脚本.7z";
//目录路径(必须是完整路径)
var dirPath = "/sdcard/脚本";
//压缩类型
//支持的压缩类型包括:zip 7z bz2 bzip2 tbz2 tbz gz gzip tgz tar wim swm xz txz。
var type = "7z";
//压缩密码
var password = "password"

//7z加密压缩(若文件已存在则跳过)
//zips.A(type, filePath, dirPath, password)

//压缩
switch (zips.A(type, filePath, dirPath)) {
    
    
    case 0:
        toastLog("压缩成功!文件已保存为: " + filePath)
        break;
    case 1:
        toastLog("压缩结束,存在非致命错误(例如某些文件正在被使用,没有被压缩)")
        break;
    case 2:
        toastLog("致命错误")
        break;
    case 7:
        toastLog("命令行错误")
        break;
    case 8:
        toastLog("没有足够内存")
        break;
    case 255:
        toastLog("用户中止操作")
        break;
    default: toastLog("未知错误")
}

例 2

// 准备工作,创建文件夹与文件,以便后续用于压缩
// 创建两个文件夹与三个文件
$files.create("/sdcard/脚本/zip_test/");
$files.create("/sdcard/脚本/zip_out/");
$files.write("/sdcard/脚本/zip_test/1.txt", "Hello, World");
$files.write("/sdcard/脚本/zip_test/2.txt", "GoodBye, World");
$files.write("/sdcard/脚本/zip_test/3.txt", "Autox.js");

// 1. 压缩文件夹
// 要压缩的文件夹路径
let dir = '/sdcard/脚本/zip_test/';
// 压缩后的文件路径
let zipFile = '/sdcard/脚本/zip_out/未加密.zip';
$files.remove(zipFile);
$zip.zipDir(dir, zipFile);

// 2.加密压缩文件夹
let encryptedZipFile = '/sdcard/脚本/zip_out/加密.zip';
$files.remove(encryptedZipFile);
$zip.zipDir(dir, encryptedZipFile, {
    
    
    password: 'Autox.js'
});

// 3. 压缩单个文件
let zipSingleFie = '/sdcard/脚本/zip_out/单文件.zip'
$files.remove(zipSingleFie);
$zip.zipFile('/sdcard/脚本/zip_test/1.txt', zipSingleFie);

// 4. 压缩多个文件
let zipMultiFile = '/sdcard/脚本/zip_out/多文件.zip';
$files.remove(zipMultiFile);
let fileList = ['/sdcard/脚本/zip_test/1.txt', '/sdcard/脚本/zip_test/2.txt']
$zip.zipFiles(fileList, zipMultiFile);

// 5. 解压文件
$zip.unzip('/sdcard/脚本/zip_out/未加密.zip', '/sdcard/脚本/zip_out/未加密/');

// 6. 解压加密的zip
$zip.unzip('/sdcard/脚本/zip_out/加密.zip', '/sdcard/脚本/zip_out/加密/', {
    
    
    password: 'Autox.js'
});

// 7. 从压缩包删除文件
let z = $zip.open('/sdcard/脚本/zip_out/多文件.zip');
z.removeFile('1.txt');

// 8. 为压缩包增加文件
z.addFile('/sdcard/脚本/zip_test/3.txt');

ローカルストレージ

配列と複雑なオブジェクトを保存する

var storage = storages.create("Auto.js例子:复杂数据");
var arr = [1, 4, 2, 5];
var obj = {
    
    
    name: "Auto.js",
    url: "www.autojs.org"
};
//保存
storage.put("arr", arr);
storage.put("obj", obj);

console.show();
//取出
log("arr = ", storage.get("arr"));
log("obj = ", storage.get("obj"));

整数ログイン簡易データの保存

var storage = storages.create("Auto.js例子:简单数据");
var a = 1234;
var b = true;
var str = "hello";
//保存
storage.put("a", a);
storage.put("b", b);
storage.put("str", str);

console.show();
//取出
log("a = " + storage.get("a"));
log("b = " + storage.get("b"));
log("str = " + storage.get("str"));

メモ付き

"ui";
ui.layout(
    <vertical padding="16">
        <horizontal>
            <text textColor="black" textSize="18sp" layout_weight="1">随手记</text>
            <button id="save" text="保存" w="auto" style="Widget.AppCompat.Button.Borderless.Colored"/>
        </horizontal>
        <input id="content" h="*" gravity="top"/>
    </vertical>
);
var storage = storages.create("Auto.js例子:随手记");
var content = storage.get("content");
if(content != null){
    
    
    ui.content.setText(content);
}
ui.save.click(()=>{
    
    
    storage.put("content", ui.content.text());
});

センサー

共通センサー情報を印刷する

//忽略不支持的传感器,即使有传感器不支持也不抛出异常
sensors.ignoresUnsupportedSensor = true;

sensors.on("unsupported_sensor", function(sensorName, sensorType){
    
    
    log("不支持的传感器: %s 类型: %d", sensorName, sensorType);
});

//加速度传感器
sensors.register("accelerometer").on("change", (event, ax, ay, az)=>{
    
    
    log("x方向加速度: %d\ny方向加速度: %d\nz方向加速度: %d", ax, ay, az);
});
//方向传感器
sensors.register("orientation").on("change", (event, dx, dy, dz)=>{
    
    
    log("绕x轴转过角度: %d\n绕y轴转过角度: %d\n绕z轴转过角度: %d", dx, dy, dz);
});
//陀螺仪传感器
sensors.register("gyroscope").on("change", (event, wx, wy, wz)=>{
    
    
    log("绕x轴角速度: %d\n绕y轴角速度: %d\n绕z轴角速度: %d", wx, wy, wz);
});
//磁场传感器
sensors.register("magnetic_field").on("change", (event, bx, by, bz)=>{
    
    
    log("x方向磁场强度: %d\ny方向磁场强度: %d\nz方向磁场强度: %d", bx, by, bz);
});
//重力传感器
sensors.register("magnetic_field").on("change", (event, gx, gy, gz)=>{
    
    
    log("x方向重力: %d\ny方向重力: %d\nz方向重力: %d", gx, gy, gz);
});
//线性加速度传感器
sensors.register("linear_acceleration").on("change", (event, ax, ay, az)=>{
    
    
    log("x方向线性加速度: %d\ny方向线性加速度: %d\nz方向线性加速度: %d", ax, ay, az);
});
//温度传感器
sensors.register("ambient_temperature").on("change", (event, t)=>{
    
    
    log("当前温度: %d", t);
});
//光线传感器
sensors.register("light").on("change", (event, l)=>{
    
    
    log("当前光的强度: %d", l);
});
//压力传感器
sensors.register("pressure").on("change", (event, p)=>{
    
    
    log("当前压力: %d", p);
});
//距离传感器
sensors.register("proximity").on("change", (event, d)=>{
    
    
    log("当前距离: %d", d);
});
//湿度传感器
sensors.register("relative_humidity").on("change", (event, rh)=>{
    
    
    log("当前相对湿度: %d", rh);
});

//30秒后退出程序
setTimeout(exit, 30 * 1000);

よく使用されるセンサー情報を表示する

"ui";

ui.layout(
    <scroll>
        <vertical>
            <text id="accelerometer" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="orientation" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="gyroscope" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="magnetic_field" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="gravity" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="linear_acceleration" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="ambient_temperature" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="light" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="pressure" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="proximity" margin="12dp" textSize="16sp" textColor="#000000"/>
            <text id="relative_humidity" margin="12dp" textSize="16sp" textColor="#000000"/>
        </vertical>
    </scroll>
);

//忽略不支持的传感器,即使有传感器不支持也不抛出异常
sensors.ignoresUnsupportedSensor = true;

sensors.on("unsupported_sensor", function(sensorName, sensorType){
    
    
    log(util.format("不支持的传感器: %s 类型: %d", sensorName, sensorType));
});

//加速度传感器
sensors.register("accelerometer", sensors.delay.ui).on("change", (event, ax, ay, az)=>{
    
    
    ui.accelerometer.setText(util.format("x方向加速度: %d\ny方向加速度: %d\nz方向加速度: %d", ax, ay, az));
});
//方向传感器
sensors.register("orientation", sensors.delay.ui).on("change", (event, dx, dy, dz)=>{
    
    
    ui.orientation.setText(util.format("绕x轴转过角度: %d\n绕y轴转过角度: %d\n绕z轴转过角度: %d", dx, dy, dz));
});
//陀螺仪传感器
sensors.register("gyroscope", sensors.delay.ui).on("change", (event, wx, wy, wz)=>{
    
    
    ui.gyroscope.setText(util.format("绕x轴角速度: %d\n绕y轴角速度: %d\n绕z轴角速度: %d", wx, wy, wz));
});
//磁场传感器
sensors.register("magnetic_field", sensors.delay.ui).on("change", (event, bx, by, bz)=>{
    
    
    ui.magnetic_field.setText(util.format("x方向磁场强度: %d\ny方向磁场强度: %d\nz方向磁场强度: %d", bx, by, bz));
});
//重力传感器
sensors.register("gravity", sensors.delay.ui).on("change", (event, gx, gy, gz)=>{
    
    
    ui.gravity.setText(util.format("x方向重力: %d\ny方向重力: %d\nz方向重力: %d", gx, gy, gz));
});
//线性加速度传感器
sensors.register("linear_acceleration", sensors.delay.ui).on("change", (event, ax, ay, az)=>{
    
    
    ui.linear_acceleration.setText(util.format("x方向线性加速度: %d\ny方向线性加速度: %d\nz方向线性加速度: %d", ax, ay, az));
});
//温度传感器
sensors.register("ambient_temperature", sensors.delay.ui).on("change", (event, t)=>{
    
    
    ui.ambient_temperature.setText(util.format("当前温度: %d", t));
});
//光线传感器
sensors.register("light", sensors.delay.ui).on("change", (event, l)=>{
    
    
    ui.light.setText(util.format("当前光的强度: %d", l));
});
//压力传感器
sensors.register("pressure", sensors.delay.ui).on("change", (event, p)=>{
    
    
    ui.pressure.setText(util.format("当前压力: %d", p));
});
//距离传感器
sensors.register("proximity", sensors.delay.ui).on("change", (event, d)=>{
    
    
    ui.proximity.setText(util.format("当前距离: %d", d));
});
//湿度传感器
sensors.register("relative_humidity", sensors.delay.ui).on("change", (event, rh)=>{
    
    
    ui.relative_humidity.setText(util.format("当前相对湿度: %d", rh));
});

//30秒后退出程序
setTimeout(exit, 30 * 1000);

JavaAPIを呼び出す

/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/**
 * liveConnect.js: a simple demonstration of javascript-to-Java connectivity
 */

// Create a new StringBuffer. Note that the class name must be fully qualified
// by its package. Packages other than "java" must start with "Packages", i.e.,
// "Packages.javax.servlet...".
var sb = new java.lang.StringBuffer();

// Now add some stuff to the buffer.
sb.append("hi, mom");
sb.append(3); // this will add "3.0" to the buffer since all JS numbers
  // are doubles by default
sb.append(true);

// Now print it out. (The toString() method of sb is automatically called
// to convert the buffer to a string.)
// Should print "hi, mom3.0true".
print(sb);
openConsole();

タイマー

時限実行

toast("静等20秒,你会看到想看的...");

var i = 0;

setTimeout(function(){
    
    
    app.openUrl("http://music.163.com/#/song?id=109628&autoplay=true&market=baiduhd");
    exit();
}, 20 * 1000);

setInterval(function(){
    
    
    i++;
    toast(i * 5 + "秒");
}, 5000);


ループ実行

var i = 0;

setInterval(function(){
    
    
    i++;
    toast(i * 4 + "秒");
    if(i == 5){
    
    
        exit();
    }
}, 4000);

ダイアログボックス

メニュー

while(true){
    
    
    var i = dialogs.select("哲学的基本问题是", "社会和自然的关系问题", "思维与存在的关系问题", "政治和经济的关系问题", "实践和理论的关系问题");
    if(i == -1){
    
    
        toast("猜一下呗");
        continue;
    }
    if(i == 1){
    
    
        toast("答对辣");
        break;
    }else{
    
    
        toast("答错辣")
    }
}


単一ボックス

var sex = dialogs.singleChoice("请选择性别", ["男", "女", "基佬", "女装", "其他"], 2);
toast("选择了第" + (sex + 1) + "个选项");

チェックボックス

var i = dialogs.multiChoice("下列作品出自李贽的是", ["《焚书》", "《西湖寻梦》", "《高太史全集》", "《续焚烧书》", "《藏书》"]);
toast("选择了: " + i);
if(i.length == 2 && i.toString() == [0, 4].toString()){
    
    
    toast("答对辣");
}else{
    
    
    toast("答错辣");
}

簡単な計算機

var num1 = dialogs.input("请输入第一个数字");
var op = dialogs.singleChoice("请选择运算", ["加", "减", "乘", "除", "幂"]);
var num2 = dialogs.input("请输入第二个数字");
var result = 0;
switch(op){
    
    
case 0:
    result = num1 + num2;
    break;
case 1:
    result = num1 - num2;
    break;
case 2:
    result = num1 * num2;
    break;
case 3:
    result = num1 / num2;
    break;
case 4:
    result = Math.pow(num1, num2);
    break;
}
alert("运算结果", result);

アップデートのダウンロードをシミュレートするダイアログ

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);
}


確認ボックス

var handsome = confirm("你帅吗?");
if(handsome){
    
    
    toast("真不要脸!");
    toast("真不要脸!");
    toast("真不要脸!");
    alert("真不要脸!");
}else{
    
    
    toast("嗯");
}

入力ボックス

var name = rawInput("请输入名字");
alert("(•́へ•́╬)", "你好~ " + name);
var expr = dialogs.input("请输入简单的算式", "1+1");
alert("计算结果为 " + expr);

UI モードでのダイアログ ボックスの使用

"ui";

ui.layout(
    <vertical>
        <button id="callback" align="center">回调形式</button>
        <button id="promise" align="center">Promise形式</button>
        <button id="calc" align="center">简单计算器</button>
    </vertical>
);

ui.callback.click(()=>{
    
    
    dialogs.confirm("要弹出输入框吗?", "", function(b){
    
    
        if(b){
    
    
            dialogs.rawInput("输入", "", function(str){
    
    
                alert("您输入的是:" + str);
            });
        }else{
    
    
            ui.finish();
        }
    });
});

ui.promise.click(()=>{
    
    
    dialogs.confirm("要弹出输入框吗")
        .then(function(b){
    
    
            if(b){
    
    
               return dialogs.rawInput("输入");
            }else{
    
    
                ui.finish();
            }
        }).then(function(str){
    
    
            alert("您输入的是:" + str);
        });
});


ui.calc.click(()=>{
    
    
    let num1, num2, op;
    dialogs.input("请输入第一个数字")
        .then(n => {
    
    
            num1 = n;
            return dialogs.singleChoice("请选择运算", ["加", "减", "乘", "除", "幂"]);
        })
        .then(o => {
    
    
            op = o;
            return dialogs.input("请输入第二个数字");
         })
        .then(n => {
    
    
            num2 = n;
            var result;
            switch(op){
    
    
                case 0:
                    result = num1 + num2;
                    break;
                case 1:
                    result = num1 - num2;
                    break;
                case 2:
                    result = num1 * num2;
                    break;
                case 3:
                    result = num1 / num2;
                    break;
                case 4:
                    result = Math.pow(num1, num2);
                    break;
            }
            alert("运算结果", result);
        });
});

マルチメディア

rootなしで画面録画

"ui";

importClass(android.content.Context);
importClass(android.hardware.display.DisplayManager);
importClass(android.media.MediaRecorder);
importClass(java.io.File);

runtime.requestPermissions(["WRITE_EXTERNAL_STORAGE", "READ_EXTERNAL_STORAGE", "RECORD_AUDIO"]);

mMediaProjectionManager = context.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
mMediaRecorder = new MediaRecorder();
mVirtualDisplay = null;
saveDir = "/sdcard";
saveWidth = device.width;
saveHeight = device.height;
saveTime = 10 * 1000; // 单位:毫秒
isRunning = false;

ui.layout(
    <vertical>
        <appbar>
            <toolbar title="免root屏幕录制" />
        </appbar>
        <Switch id="permissions" text="音频录制及存储权限" checked="true" gravity="center"/>
        <frame gravity="center">
            <text text="AutoX" gravity="center" />
        </frame>
        <button text="免root屏幕录制" style="Widget.AppCompat.Button.Colored" id="button" />
    </vertical>
);

ui.button.click(function () {
    
    
    if (isRunning) {
    
    
        stopRecord();
        ui.button.setText("免root屏幕录制");
    } else {
    
    
        activity.startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), 666);
    }
});
// 申请权限
ui.permissions.on("check", function (checked) {
    
    
    if (checked) {
    
    
        runtime.requestPermissions(["WRITE_EXTERNAL_STORAGE", "READ_EXTERNAL_STORAGE", "RECORD_AUDIO"]);
    } else {
    
    
        toastLog("权限不足!");
    }
});
ui.emitter.on("resume", function () {
    
    
    ui.permissions.checked = true;
});

// 获取屏幕录制授权
ui.emitter.on("activity_result", (requestCode, resultCode, data) => {
    
    
    mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
    if (mMediaProjection) {
    
    
        startRecord();
        ui.button.setText("视频录制中(点击停止)……");
        setTimeout(function () {
    
    
            stopRecord();
            ui.button.setText("免root屏幕录制");
        }, saveTime)
    }
});

events.on("exit", function () {
    
    
    stopRecord();
});

function startRecord() {
    
    
    if (mMediaProjection == null || isRunning) {
    
    
        return false;
    }
    file = new File(saveDir, "screen_record.mp4");
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mMediaRecorder.setOutputFile(file.getAbsolutePath());
    mMediaRecorder.setVideoSize(saveWidth, saveHeight);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mMediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);
    mMediaRecorder.setVideoFrameRate(30);
    try {
    
    
        mMediaRecorder.prepare();
    } catch (e) {
    
    
        toastLog(e);
    }
    mVirtualDisplay = mMediaProjection.createVirtualDisplay("免root屏幕录制", saveWidth, saveHeight, 1, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder.getSurface(), null, null);
    mMediaRecorder.start();
    isRunning = true;
    return true;
}

function stopRecord() {
    
    
    if (!isRunning) {
    
    
        return false;
    }
    mMediaRecorder.stop();
    mMediaRecorder.reset();
    mVirtualDisplay.release();
    mMediaProjection.stop();
    isRunning = false;
    toastLog("录制结束!");
    return true;
}


音楽プレーヤー

"ui";

ui.layout(
  <vertical>
    <text id="name" text="音乐播放器" textSize="22sp" textColor="#fbfbfe" bg="#00afff" w="*" gravity="center"></text>
    <button id="play">播放音乐</button>
    <button id="next">下一曲</button>
    <button id="pause">暂停</button>
  </vertical>
);
var musicDir = '/sdcard/Music';
if (!files.isDir(musicDir)) {
    
    
  toastLog(musicDir + "目录不存在!")
}
var musicFiles = files.listDir(musicDir, function (name) {
    
    
  return name.endsWith(".mp3") || name.endsWith(".wma") || name.endsWith(".wav")
});
var i = 0;
var musicPath = "";
if (musicFiles.length > 0) {
    
    
  musicPath = files.join(musicDir, musicFiles[i]);
  ui.name.setText(files.getNameWithoutExtension(musicPath));
} else {
    
    
  toastLog(musicDir + "目录下没有音频文件!")
}
ui.pause.click(function () {
    
    
  media.pauseMusic();
});
ui.next.click(function () {
    
    
  musicPath = files.join(musicDir, musicFiles[(i + 1) % musicFiles.length]);
  if (files.isFile(musicPath)) {
    
    
    ui.name.setText(files.getNameWithoutExtension(musicPath));
    media.playMusic(musicPath, 0.8);
  } else {
    
    
    toastLog(musicPath + "音频文件不存在!")
  }
}
);
ui.play.click(function () {
    
    
  if (media.isMusicPlaying()) {
    
    
    return true;
  } else {
    
    
    if (files.isFile(musicPath)) {
    
    
      ui.name.setText(files.getNameWithoutExtension(musicPath));
      media.playMusic(musicPath, 0.8);
    } else {
    
    
      toastLog(musicPath + "音频文件不存在!")
    }
  }
});
ui.emitter.on("pause", () => {
    
    
  if (media.isMusicPlaying()) {
    
    
    media.pauseMusic();
  }
});
ui.emitter.on("resume", () => {
    
    
  ui.post(function () {
    
    
    media.resumeMusic();
  }, 200);
});
events.on("exit", function () {
    
    
  media.stopMusic();
});

マルチスレッド化

可変視程実験

var running = true;

threads.start(function(){
    
    
    while(running){
    
    
        log("running = true");
    }
});

sleep(2000);
running = false;
console.info("running = false");

マルチスレッドのキー監視

auto();

threads.start(function(){
    
    
    //在子线程中调用observeKey()从而使按键事件处理在子线程执行
    events.observeKey();
    events.on("key_down", function(keyCode, events){
    
    
        //音量键关闭脚本
        if(keyCode == keys.volume_up){
    
    
            exit();
        }
    });
});

toast("音量上键关闭脚本");

events.on("exit", function(){
    
    
    toast("脚本已结束");
});

while(true){
    
    
    log("脚本运行中...");
    sleep(2000);
}

マルチスレッドの簡単な例


//启动一个线程
threads.start(function(){
    
    
    //在线程中每隔1秒打印"线程1"
    while(true){
    
    
        log("线程1");
        sleep(1000);
    }
});

//启动另一个线程
threads.start(function(){
    
    
    //在线程中每隔2秒打印"线程1"
    while(true){
    
    
        log("线程2");
        sleep(2000);
    }
});

//在主线程中每隔3秒打印"主线程"
for(var i = 0; i < 10; i++){
    
    
    log("主线程");
    sleep(3000);
}
//打印100次后退出所有线程
threads.shutDownAll();

スレッドの起動と停止


//启动一个无限循环的线程
var thread = threads.start(function(){
    
    
    while(true){
    
    
        log("子线程运行中...");
        sleep(1000);
    }
});


//5秒后关闭线程
sleep(5000);
thread.interrupt();


アトミック変数

var i = threads.atomic();

おすすめ

転載: blog.csdn.net/qq_37952052/article/details/131743625