EasyClick 原生UI連載目錄
- EasyClick 原生UI教程
- EasyClick 原生UI連載二十八懸浮按鈕自動貼邊
- 效果圖
- xml布局
- ui.js
- main.js 這里是重點
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://www.uj5u.com/yidong/281669.html
標籤:其他
上一篇:Android 實作歡迎界面
