小言_互联网的博客

EasyClick 原生UI连载二十八

673人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场