/*
软件作者:https://xuhss.com/oxox/pro
*/
//定义悬浮窗控制模块,命名为(悬块)。
function 悬块(window, view) {
//判断是否缺少构造参数。
if (!window || !view) {
//缺少构造参数,抛出错误。
throw "缺参数";
};
//记录按键被按下时的触摸坐标
this.x = 0, this.y = 0;
//记录按键被按下时的悬浮窗位置
this.windowX, this.windowY;
//按下时长超过此值则执行长按等动作
this.downTime = 500;
//记录定时执行器的返回id
this.Timeout = 0;
//创建点击长按事件
this.Click = function() {};
this.LongClick = function() {};
//可修改点击长按事件
this.setClick = function(fun) {
//判断参数类型是否为函数?
if (typeof fun == "function") {
this.Click = fun;
};
};
this.setLongClick = function(fun, ji) {
//判断参数类型是否为函数?
if (typeof fun == "function") {
this.LongClick = fun;
//判断参数是否可为设置数字?
if (parseInt(ji) <= 1000) {
this.downTime = parseInt(ji);
};
};
};
view.setOnTouchListener(new android.view.View.OnTouchListener((view, event) => {
//判断当前触控事件,以便执行操作。
switch (event.getAction()) {
//按下事件。
case event.ACTION_DOWN:
//按下记录各种坐标数据。
this.x = event.getRawX();
this.y = event.getRawY();
this.windowX = window.getX();
this.windowY = window.getY();
//创建一个定时器用来定时执行长按操作。
this.Timeout = setTimeout(() => {
this.LongClick();
this.Timeout = 0;
}, this.downTime);
return true;
//移动事件。
case event.ACTION_MOVE:
//移动距离过大则判断为移动状态
if (Math.abs(event.getRawY() - this.y) > 5 && Math.abs(event.getRawX() - this.x) > 5) {
//移动状态清除定时器
if (this.Timeout) {
//定时器存在则清除定时器。
clearTimeout(this.Timeout);
this.Timeout = 0;
};
//移动手指时调整悬浮窗位置
window.setPosition(this.windowX + (event.getRawX() - this.x), this.windowY + (event.getRawY() - this.y));
};
return true;
//抬起事件。
case event.ACTION_UP:
if (this.Timeout) {
//手指抬起时,定时器存在,说明没有移动和按下时间小于长按时间。
//清除定时器。
clearTimeout(this.Timeout);
this.Timeout = 0;
//执行点击事件。
this.Click();
};
return true;
};
//控件的触控事件函数必须要返回true。否则报错。
return true;
}));
};
auto();
console.show();
launchApp("QQ");
log("开始");
//创建并生成一个悬浮窗。
var window = floaty.window(
<vertical >
<button id="but_x"w="*" layout_weight="1" text="选图"/>
<button id="but" w="*" layout_weight="1" text="开始"/>
</vertical>
);
// <button id="but_d"w="*" layout_weight="1" text="读取"/>
//输出提示信息。
toastLog("长按悬浮窗关闭本脚本");
//空运行定时器保持脚本运行中,这是悬浮窗脚本所必需的。
setInterval(() => {}, 500);
//声明一个变量用来控制线程。
var thread = null;
var path;
//创建一个新的悬浮控制模块 ad 并带入参数(所要控制的悬浮窗和用来控制悬浮窗移动的控件)。
var ad = new 悬块(window, window.but);
//设置长按事件。
ad.setLongClick(function() {
//输出气泡信息。
toast("脚本已关闭");
//脚本停止代码。
exit();
});
//设置点击事件。
ad.setClick(function() {
//输出气泡信息。
toast("点击");
//变量值为空则代表线程没有开启。变量值不为空,则判断线程是不是正在运行。
if (thread ? !thread.isAlive() : true) { //线程没有运行。
ui.run(() => {
//在ui线程中修改按钮的文字
window.but.setText("停止");
});
//新建一个线程,赋值给变量thread
thread = threads.start(function() {
try {
Main();
} catch (e) {
toastLog(e);
};
//运行完毕修改按钮文字
ui.run(() => {
//在ui线程中修改按钮的文字
window.but.setText("开始");
});
});
} else {
thread.interrupt();
//中断线程;
ui.run(() => {
//在ui线程中修改按钮的文字
window.but.setText("开始");
});
};
});
window.but_x.click(function() {
threads.start(function() {
switch (dialogs.select("选择方式", ["媒体库", "文件"])) {
case 0:
var photosPath = getPhotosInfo(5).map(function(obj) {
return obj.filePath;
});
let i = dialogs.select("选择", photosPath);
if (i + 1) {
path = photosPath[i];
toastLog("已选");
};
break;
case 1:
let p = selectFile("/sdcard/", "", function(name) {
return name.endsWith(".jpg") || name.endsWith(".png") || files.isDir(files.join("/sdcard", name));
});
if (p) {
path = p;
toastLog("已选");
};
break;
};
});
});
toast("finish");
function Main() {
//这里是主要运行的内容
if (path) {
draw(path);
} else {
toastLog("未选图片");
};
};
function draw(path) {
var img = images.read(path);
img = images.resize(img, [128], "LANCZOS4");
img = images.grayscale(img)
img = images.adaptiveThreshold(img, 200, "MEAN_C", "BINARY", 25, 10);
img = images.adaptiveThreshold(img, 200, "MEAN_C", "BINARY", 3, 3);
//img = images.scale(img, 0.3, 0.3)
var bitmap = img.getBitmap();
var img_w = bitmap.getWidth();
var img_h = bitmap.getHeight();
var pixels = util.java.array("int", img_w * img_h);
bitmap.getPixels(pixels, 0, img_w, 0, 0, img_w, img_h);
// log(pixels)
笔画 = 画图(pixels, img_w, img_h)
//log(笔画)
//toastLog("图片读取完成,请打开涂鸦界面点击画画")
/*
img = images.grayscale(img);
img = images.adaptiveThreshold(img, 200, "MEAN_C", "BINARY", 25, 10);
img_w = img.getWidth()
img_h = img.getHeight()
img = images.rotate(img, 0);
*/
/*
if (Boolean(mode)) {
img = images.inRange(img, colors.rgb(0, 0, 0), colors.rgb(threshold, threshold, threshold)) //越大越暗
} else {
img = images.inRange(img, colors.rgb(threshold, threshold, threshold), colors.rgb(255, 255, 255)) //越大越暗
}
for (var i = 0; i < length - 1; i++) {
img_l = images.concat(img_l_o, img_l, "TOP")
}
img = images.concat(img, img_l)
*/
//images.save(img, "./img1.png");
//media.scanFile("./img1.png");
log("img", img_w, img_h);
//exit
[虚幻私塾】
- 粉丝: 337
- 资源: 1558
最新资源
- 基于java的数字化农家乐管理平台设计与实现.docx
- 基于java的旅游管理系统设计与实现.docx
- 基于java的微乐校园设计与实现.docx
- 基于java的小型医院医疗设备管理系统设计与实现.docx
- 基于java的小型企业客户关系管理系统设计与实现.docx
- STM32高频注入 STM32平台的高频注入,keil版本 高速阶段磁链观测,电机控制,高频注入 包括原理图,源代码 已移植量产使用,具有极高的参考价值
- 基于java的在线考试系统设计与实现.docx
- MATLAB 实现基于WOA(鲸鱼优化算法)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- Matlab实现基于PCA+DBO+K-means的数据聚类可视化的详细项目实例(含完整的程序,GUI设计和代码详解)
- STM32以太网串口透传,串口透传通信 STM32以太网CAN透传 STM32串口CAN透传 采用STM32作为主控,W5500以太网 包括CAN通信透传,485通信透传 USB转串口,OBD协议 包
- 鸢尾花数据集可视化代码
- MATLAB 实现基于ELM(极限学习机)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- · 功能说明:代码实现了基于YOLO模型的摔倒行为实时检测,当连续检测到摔倒的帧数超过设定阈值时触发报警 · · 过程说明:通过摄像头获取视频流帧数据,利用YOLO模型进行目标检测,统计摔倒行
- 单片机开发的高精度电压表,电流表, 可实现AD 采样基准电压,采样电阻,放大电路,显示 ADC 采样采用高精度四通道XPT 2046 基准电压采用4311增加量程 采样电阻0603并联电阻 放
- MATLAB 实现基于粒子群优化(PSO)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- javascript在链表的末尾插入一个节点,在末尾插入涉及遍历整个列表,直到我们到达最后一个节点
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈