EasyClick 原生UI教程
讲师:Mr-老鬼,QQ:1156346325
EasyClick 原生UI教程电梯直达:
EasyClick 原生UI教程总纲
EasyClick 原生UI连载二十八悬浮按钮自动贴边
看这篇文章之前请了解下,下面的悬浮窗教程
EasyClick 原生UI连载 十二
原生UI之悬浮窗UI
EasyClick 原生UI连载十四
悬浮窗动态显示标识
EasyClick 原生UI连载二十二
XML悬浮窗按钮交互
这篇主要讲悬浮按钮框架
感谢群友 (丨零℃丨de☆)提供的图标资源
效果图
xml布局
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright(c) 2021,
~ 项目名称:悬浮按钮框架
~ 文件名称:float_home.xml
~ 创建时间:2021/4/28 下午9:31
~ 作者:laogui
-->
<LinearLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:android="http://schemas.android.com/apk/res/android"
xsi:noNamespaceSchemaLocation="layout.xsd"
android:layout_height="wrap_parent"
android:layout_width="wrap_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView android:layout_width="30dp"
android:layout_height="30dp"
android:gravity="center"
android:tag="logo"
android:padding="2dp" />
<TextView android:layout_height="30dp"
android:layout_width="30dp"
android:tag="tvStart"
android:visibility="gone"
android:padding="2dp"/>
<TextView android:layout_height="30dp"
android:layout_width="30dp"
android:tag="tvStop"
android:visibility="gone"
android:padding="2dp"/>
<TextView android:layout_height="30dp"
android:layout_width="30dp"
android:tag="tvReStart"
android:visibility="gone"
android:padding="2dp"/>
<TextView android:layout_height="30dp"
android:layout_width="30dp"
android:gravity="center"
android:tag="tvLog"
android:visibility="gone"
android:padding="2dp"/>
</LinearLayout>
ui.js
/*
* Copyright(c) 2021,
* 项目名称:悬浮按钮框架
* 文件名称:ui.js
* 创建时间:2021/4/28 下午9:31
* 作者:laogui
*/
function main() {
ui.layout("参数设置", "main.xml");
}
main();
main.js 这里是重点
详细的注释写在代码里了就不再重复解释了。
/*
* Copyright(c) 2021,
* 项目名称:619
* 文件名称:main.js
* 创建时间:2021/4/28 下午9:31
* 作者:laogui
*/
function main() {
//开始再这里编写代码了!!
toast("Hello World");
//如果自动化服务正常
if (!autoServiceStart(3)) {
logd("自动化服务启动失败,无法执行脚本")
exit();
return;
}
logd("开始执行脚本...")
//home();
// 测试用的 停止自动关闭悬浮按钮 实际项目不用这个
setStopCallback(function () {
logd("fdsafsad 我是停止回调");
floaty.close("123");
});
//悬浮按钮调用
floatXmlBtn();
//模拟运行任务
for (let i = 0, end = 100; i < end; i++) {
ui.run(1000, function () {
ui.toast("你大爷,我是悬浮窗按钮测试项目。。。。。。。")
})
sleep(1200);
logd("当前运行次数" + i);
}
toast("悬浮窗当前数值关闭!");
// 测试 运行结束关闭悬浮窗 实际项目 不用这个
floaty.close("123")
}
/**
* 自定义悬浮按钮函数
* 请勿随意修改!!!
* 作者:Mr、老鬼,QQ:1156346325
*/
function floatXmlBtn() {
let p = floaty.requestFloatViewPermission(1000)
logd("是否有浮窗权限: " + p);
sleep(1000)
// 防止 脚本停止 悬浮窗没关闭 ,又重新打开悬浮窗 这里 先关闭 再打开 否则会挂掉!!!
floaty.close("123")
sleep(1000);
//------------------- Android 动态代码 控制悬浮窗按钮点击事件 ---------------------------------
//------------------- 导入 Android包 -----------------------------------------------------
importPackage(android.widget);
importPackage(android.graphics);
importPackage(android.view);
importPackage(android.text);
//------------------- 显示xml 布局的悬浮窗 -------------------------------------------------
let floatView = floaty.showFloatXml("123", "float_home.xml", 0, 500);
//------------------- 获取xml 里面的子控件 view --------------------------------------------
let logoTV = floatView.findViewWithTag("logo");
let startJobFloatBtn = floatView.findViewWithTag("tvStart");
let stopJobFloatBtn = floatView.findViewWithTag("tvStop");
let logFloatBtn = floatView.findViewWithTag("tvLog");
let reStartJobFloatBtn = floatView.findViewWithTag("tvReStart");
//----------------------读取悬浮按钮图片资源-----------------------------------------
let logoBackground = ui.resResAsDrawable("myicon.png");
let startBackground = ui.resResAsDrawable("start.png");
let stopJobBackground = ui.resResAsDrawable("stop.png");
let reStartBackground = ui.resResAsDrawable("restores.png");
let logBookBackground = ui.resResAsDrawable("logbook.png");
//---------------------设置悬浮按钮图片-------------------------------------------
ui.run(200, function (view) {
logd(view);
logoTV.setBackgroundDrawable(logoBackground);
startJobFloatBtn.setBackgroundDrawable(startBackground);
stopJobFloatBtn.setBackgroundDrawable(stopJobBackground);
logFloatBtn.setBackgroundDrawable(logBookBackground);
reStartJobFloatBtn.setBackgroundDrawable(reStartBackground);
})
//------------------- 启动脚本按钮设置 监听点击事件 ---------------------------------------------------
startJobFloatBtn.setOnClickListener(function (v) {
logd(v);
startJobFloatBtn.setVisibility(View.GONE);// 脚本启动 运行脚本按钮不显示
sleep(100);
stopJobFloatBtn.setVisibility(View.VISIBLE);// 脚本启动 停止脚本按钮显示
sleep(100);
reStartJobFloatBtn.setVisibility(View.VISIBLE);// 脚本启动 重启脚本按钮显示
sleep(100);
logFloatBtn.setVisibility(View.VISIBLE);
ui.start();
})
//------------------- 停止脚本按钮设置 监听点击事件 ---------------------------------------------------
stopJobFloatBtn.setOnClickListener(function (v) {
logd(v);
startJobFloatBtn.setVisibility(View.VISIBLE);// 脚本停止 运行脚本按钮显示
stopJobFloatBtn.setVisibility(View.GONE);// 脚本停止 停止脚本按钮不显示
reStartJobFloatBtn.setVisibility(View.GONE);// 脚本停止 重启脚本按钮不显示
logFloatBtn.setVisibility(View.VISIBLE);
exit();
})
//---------------------重启脚本按钮设置 监听点击事件 ---------------------------------------------
reStartJobFloatBtn.setOnClickListener(function (v) {
logd(v);
startJobFloatBtn.setVisibility(View.GONE);// 脚本启动 运行脚本按钮不显示
stopJobFloatBtn.setVisibility(View.VISIBLE);// 脚本启动 停止脚本按钮显示
reStartJobFloatBtn.setVisibility(View.VISIBLE);// 脚本启动 重启脚本按钮显示
logFloatBtn.setVisibility(View.VISIBLE);
restartScript(null, true, 3)
})
//-------------------------- 日志显示与关闭按钮设置 监听事件------------------------------------------
let showLog = false;// 日志是否关闭标记
logFloatBtn.setOnClickListener(function (v) {
logd(v);
startJobFloatBtn.setVisibility(View.GONE);// 脚本启动 运行脚本按钮不显示
stopJobFloatBtn.setVisibility(View.VISIBLE);// 脚本启动 停止脚本按钮显示
reStartJobFloatBtn.setVisibility(View.VISIBLE);// 脚本启动 重启脚本按钮显示
logFloatBtn.setVisibility(View.VISIBLE);
if (showLog) {
closeLogWindow();
showLog = false;
}
showLog = showLogWindow();
})
//------------------- 触摸事件监听 请勿随意修改 已标注了可以修改的地方 -----------------------------
floatView.setOnTouchListener(function (view, event) {
switch (event.getAction()) {
case event.ACTION_DOWN:
// 这里是 按下 按钮的事件操作
// 可以添加你自己的事件 比如换背景图之类的 或者其他事件 这里我不需要做什么事
break;
case event.ACTION_MOVE:
// 这里是移动位置的事件操作
//--------------设置移动窗口时的悬浮按钮位置 务必使用线程操作 否则会ANR -------------------
thread.execAsync(function (view) {
floaty.updateX("123", event.getRawX());
floaty.updateY("123", event.getRawY())
floaty.updateSize("123", 150, 150)
startJobFloatBtn.setVisibility(View.GONE);
sleep(100);
stopJobFloatBtn.setVisibility(View.GONE);
sleep(100);
reStartJobFloatBtn.setVisibility(View.GONE);
sleep(100);
logFloatBtn.setVisibility(View.GONE);
})
break;
case event.ACTION_UP:
// 这里是按下弹起后的事件操作
//--------------设置还原悬浮窗口的位置 务必使用线程操作 否则会ANR -------------------
// 获取 触摸的时间
let touchTime = event.getEventTime() - event.getDownTime();
// 判断触摸时间是否大于200 大于为长按,拖动事件
if (touchTime > 200) {
thread.execAsync(function (view) {
floaty.updateX("123", 0);// 还原浮窗位置X坐标按需修改 这里默认左边贴边
floaty.updateY("123", device.getScreenHeight() / 2)// 还原浮窗位置Y坐标按需修改 这里默认屏幕高度一半位置
floaty.updateSize("123", 20, 150)
})
} else {
// 判断触摸时间是否大于200 小于为点击事件
if (logFloatBtn.getVisibility() === View.VISIBLE) {
startJobFloatBtn.setVisibility(View.GONE);
stopJobFloatBtn.setVisibility(View.GONE);
reStartJobFloatBtn.setVisibility(View.GONE);
logFloatBtn.setVisibility(View.GONE);
thread.execAsync(function (view) {
floaty.updateSize("123", 20, 150)// 更新浮窗按钮大小为20宽按需修改
})
} else {
thread.execAsync(function (view) {
floaty.updateSize("123", 500, 150)// 更新浮窗按钮大小为500宽按需修改
})
ui.run(200,function (view) {
startJobFloatBtn.setVisibility(View.GONE);
stopJobFloatBtn.setVisibility(View.VISIBLE);
reStartJobFloatBtn.setVisibility(View.VISIBLE);
logFloatBtn.setVisibility(View.VISIBLE);
})
}
}
break;
}
return false;
})
sleep(5 * 1000);
}
function autoServiceStart(time) {
for (var i = 0; i < time; i++) {
if (isServiceOk()) {
return true;
}
var started = startEnv();
logd("第" + (i + 1) + "次启动服务结果: " + started);
if (isServiceOk()) {
return true;
}
}
return isServiceOk();
}
main();
我是Mr-老鬼、QQ1156346325 。交流QQ群:620028786,647082990
------------------------------------------------版权声明------------------------------------------------------
本文版权所有~Mr-老鬼 ~转载请注明原文地址
免责声明:本文所有的教程仅限交流学习使用不得用于违法用途,造成的法律后果本人不承担责任。
转载:https://blog.csdn.net/qq_21460781/article/details/116263488
查看评论