Autojs模块:悬浮窗

哔哩哔哩:https://www.bilibili.com/video/BV1SMfqYuEVY/

悬浮窗基础


悬浮窗在脚本停止运行时会自动关闭,因此,要保持悬浮窗不被关闭,可以用一个空的setInterval来实现,例如:

setInterval(()=>{}, 1000);

1、创建和关闭悬浮窗


floaty.window(layout)

  • 创建并显示一个悬浮窗
  • 返回一个FloatyWindow对象。var w = floaty.window( <frame gravity="center"> <text id="text">悬浮文字</text> </frame> ); ​ setTimeout(()=>{ w.close(); }, 2000);
  • 因为脚本运行的线程不是UI线程,而所有对控件的修改操作需要在UI线程执行,此时需要用ui.runui.run(function(){ w.text.setText("文本"); });

floaty.rawWindow(layout)

  • 创建并显示一个原始悬浮窗,返回一个FloatyRawWindow对象
  • floaty.window()函数不同的是,该悬浮窗不会增加任何额外设施(例如调整大小、位置按钮),您可以根据自己需要编写任何布局。
  • 而且,该悬浮窗支持完全全屏,可以覆盖状态栏,因此可以做护眼模式之类的应用var w = floaty.rawWindow( <frame gravity="center"> <text id="text">悬浮文字</text> </frame> ); ​ w.setPosition(500, 500); ​ setTimeout(()=>{ w.close(); }, 2000);

floaty.closeAll()

  • 关闭所有悬浮窗

2、FloatyWindow对象


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

FloatyWindow.setAdjustEnabled(enabled)

  • 是否启用悬浮窗调整(大小、位置)
  • ture启用 false不启用

FloatyWindow.setPosition(x, y)

  • 设置悬浮窗位置

FloatyWindow.getX()

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

FloatyWindow.getY()

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

FloatyWindow.setSize(width, height)

  • 设置悬浮窗宽高。

FloatyWindow.getWidth()

  • 返回悬浮窗宽度。

FloatyWindow.getHeight()

  • 返回悬浮窗高度。

FloatyWindow.close()

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

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

FloatyWindow.exitOnClose()

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

3、FloatyRawWindow对象


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

FloatyRawWindow.setTouchable(touchable)

  • touchable {Boolean} 是否可触摸
  • true可触摸悬浮窗 false 不可触摸悬浮窗var w = floaty.rawWindow( <frame gravity="center" bg="#44ffcc00"/> ); ​ w.setSize(-1, -1); w.setTouchable(false); ​ setTimeout(()=>{ w.close(); }, 4000);

FloatyRawWindow.setPosition(x, y)

  • 设置悬浮窗位置

FloatyRawWindow.getX()

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

FloatyRawWindow.getY()

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

FloatyRawWindow.setSize(width, height)

  • 设置悬浮窗宽高。
  • 如果设置为-1,则为占满全屏;

FloatyRawWindow.getWidth()

  • 返回悬浮窗宽度。

FloatyRawWindow.getHeight()

  • 返回悬浮窗高度。

FloatyRawWindow.close()

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

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

FloatyRawWindow.exitOnClose()

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

– 示例代码


1、动态悬浮文字


var window = floaty.window(
    <frame gravity="center">
        <text id="text" textSize="16sp" textColor="#f44336"/>
    </frame>
);
​
window.exitOnClose();
​
window.text.click(()=>{
    window.setAdjustEnabled(!window.isAdjustEnabled());
});
​
setInterval(()=>{
    //对控件的操作需要在UI线程中执行
    ui.run(function(){
        window.text.setText(dynamicText());
    });
}, 1000);
​
function dynamicText(){
    var date = new Date();
    var str = util.format("时间: %d:%d:%d\n", date.getHours(), date.getMinutes(), date.getSeconds());
    str += util.format("内存使用量: %d%%\n", getMemoryUsage());
    str += "当前活动: " + currentActivity() + "\n";
    str += "当前包名: " + currentPackage();
    return str;
}
​
//获取内存使用率
function getMemoryUsage(){
    var usage = (100 * device.getAvailMem() / device.getTotalMem());
    //保留一位小数
    return Math.round(usage * 10) / 10;
}

2、护眼模式


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

3、悬浮窗输入框


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

4、悬浮窗运行脚本按钮简单版


var path = "/sdcard/脚本/test.js";
if(!files.exists(path)){
    toast("脚本文件不存在: " + path);
    exit();
}
var window = floaty.window(
    <frame>
        <button id="action" text="开始运行" w="90" h="40" bg="#77ffffff"/>
    </frame>
);
​
window.exitOnClose();
​
var execution = null;
​
window.action.click(()=>{
    if(window.action.getText() == '开始运行'){
        execution = engines.execScriptFile(path);
        window.action.setText('停止运行');
    }else{
        if(execution){
            execution.getEngine().forceStop();
        }
        window.action.setText('开始运行');
    }
});
​
window.action.longClick(()=>{
   window.setAdjustEnabled(!window.isAdjustEnabled());
   return true;
});
​
setInterval(()=>{}, 1000);
​

5、悬浮文字


var window = floaty.window(
    <frame gravity="center">
        <text id="text" text="点击可调整位置" textSize="16sp"/>
    </frame>
);
​
window.exitOnClose();
​
window.text.click(()=>{
    window.setAdjustEnabled(!window.isAdjustEnabled());
});
​
setInterval(()=>{}, 1000);

6、悬浮运行脚本按钮


var path = "/sdcard/脚本/test.js";
if(!files.exists(path)){
    toast("脚本文件不存在: " + path);
    exit();
}
var window = floaty.window(
    <frame>
        <button id="action" text="开始运行" w="90" h="40" bg="#77ffffff"/>
    </frame>
);
​
setInterval(()=>{}, 1000);
​
var execution = null;
​
//记录按键被按下时的触摸坐标
var x = 0, y = 0;
//记录按键被按下时的悬浮窗位置
var windowX, windowY;
//记录按键被按下的时间以便判断长按等动作
var downTime;
​
window.action.setOnTouchListener(function(view, event){
    switch(event.getAction()){
        case event.ACTION_DOWN:
            x = event.getRawX();
            y = event.getRawY();
            windowX = window.getX();
            windowY = window.getY();
            downTime = new Date().getTime();
            return true;
        case event.ACTION_MOVE:
            //移动手指时调整悬浮窗位置
            window.setPosition(windowX + (event.getRawX() - x),
                windowY + (event.getRawY() - y));
            //如果按下的时间超过1.5秒判断为长按,退出脚本
            if(new Date().getTime() - downTime > 1500){
                exit();
            }
            return true;
        case event.ACTION_UP:
            //手指弹起时如果偏移很小则判断为点击
            if(Math.abs(event.getRawY() - y) < 5 && Math.abs(event.getRawX() - x) < 5){
                onClick();
            }
            return true;
    }
    return true;
});
​
function onClick(){
    if(window.action.getText() == '开始运行'){
        execution = engines.execScriptFile(path);
        window.action.setText('停止运行');
    }else{
        if(execution){
            execution.getEngine().forceStop();
        }
        window.action.setText('开始运行');
    }
}

– 实战开发


1、回顾悬浮窗基础知识


2、使用悬浮窗显示日志(1)


3、使用悬浮窗显示日志(2)


// 向文本中添加内容
window.id.append(str + "\n");
​
// 添加文本的滚动效果
<ScrollView id="scroll" h="200">
    
</ScrollView>
​
window.scroll.scrollTo(0, window.textId.getHeight());

4、使用悬浮窗显示日志(3)


总是往上跑,是graty的缘故
修改颜色,修改背景
​
// 设置悬浮窗位置
window.setPosition(0, 500)
// 设置悬浮窗不可点击
window.setTouchable(false)

5、使用悬浮窗显示日志(4)


6、悬浮窗显示日志的组件


<com.stardust.autojs.core.console.ConsoleView id="console" h="*" />
​
​
window.console.setConsole(runtime.console);
let c = new android.util.SparseArray();
let Log = android.util.Log;
c.put(Log.DEBUG, new java.lang.Integer(colors.parseColor("#000000")));
// 设置console其他日志的颜色
c.put(Log.VERBOSE, new java.lang.Integer(colors.parseColor("#dfc0c0c0")));
c.put(Log.INFO, new java.lang.Integer(colors.parseColor("#ff64dd17")));
c.put(Log.WARN, new java.lang.Integer(colors.parseColor("#ff2962ff")));
c.put(Log.ERROR, new java.lang.Integer(colors.parseColor("#ffd50000")));
c.put(Log.ASSERT, new java.lang.Integer(colors.parseColor("#ffff534e")));
window.console.setColors(c);

7、类Autojs高级悬浮窗(1)


8、类Autojs高级悬浮窗(2)


9、类Autojs高级悬浮窗(3)


10、类Autojs高级悬浮窗(4)


11、类Autojs高级悬浮窗(5)


12、类Autojs高级悬浮窗(6)

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧