autojs优秀UI

牙叔教程 简单易懂

教程目的

本篇教程是一个自定义控件的教学演示, 无任何实际功能,
更没有提现功能, 那只是一个自定义按钮

主要演示自动义控件和动画, 除此之外没有其他任何功能

再次强调, 本脚本只是UI演示, 无任何其他功能

效果展示

主界面
在这里插入图片描述

popWindow
在这里插入图片描述

视频演示

autojs版本

9.0.4

你将学到以下知识点

  • toast点九图的使用
  • 设置toast的显示位置
  • toast设置透明圆角背景
  • 裁剪canvas
  • 自定义控件checkbox
  • 自定义控件switch
  • 相对布局
  • 清空控件背景
  • 重写下拉框adapter
  • 通知栏沉浸式
  • 设置圆角背景
  • 设置渐变色背景
  • 手指移动悬浮窗
  • 悬浮窗自动吸附边缘
  • 悬浮窗设置圆环背景
  • 图片设置为圆形
  • 缩放控件
  • 属性动画
  • 测量控件尺寸
  • popWindow的弹出
  • 弹窗时背景渐明渐暗
  • 自定义进度条

脚本概况

  • 脚本有UI, 悬浮窗, 以及popWindow
  • UI中的重点是自定义控件switch和checkbox, 重点是canvas裁剪
  • UI是帧布局+相对布局+纵向布局
  • 悬浮窗会自动吸附屏幕边缘, 增加toast提示, 背景是点九图
  • popWindow是更新提示用的, 有个自定义的进图条动画

代码讲解

1. 导入类
importClass(android.view.View);
importClass(android.graphics.Color);
importClass(android.graphics.drawable.GradientDrawable);
importClass(android.text.Spannable);
importClass(android.text.SpannableStringBuilder);
importClass(android.text.style.ForegroundColorSpan);
importClass(android.graphics.LinearGradient);
importClass(android.graphics.Shader);
importClass(android.graphics.Bitmap);
importClass("android.graphics.BitmapFactory");
importClass(android.graphics.BitmapShader);
importClass(android.view.WindowManager);
importClass(android.widget.ArrayAdapter);
importClass(android.widget.AdapterView);
importClass(android.net.Uri);
importClass(java.util.ArrayList);
importClass(android.graphics.PaintFlagsDrawFilter);
importClass(android.graphics.Color);
importClass(android.animation.ObjectAnimator);
importClass(android.animation.AnimatorListenerAdapter);
importClass(android.util.TypedValue);
2. 重写下拉框adapter
function getSpinnerAdapter(dataList) {
  let adapter = JavaAdapter(android.widget.SpinnerAdapter, {
    getCount: function () {
      return dataList.length;
    },
    getItem: function (position) {
      return dataList[position];
    },
    getItemId: function (position) {
      return position;
    },
    getViewTypeCount: function () {
      return 1;
    },
    getItemViewType: function (pos) {
      return 0;
    },
    getDropDownView: function (position, convertView, parent) {
      log("getDropDownView");
      if (!convertView) {
        let boxXml = (
          <frame>
            <TextView id="_text" gravity="center" textColor="#000000" textSize="20sp" />
          </frame>
        );
        convertView = ui.inflate(boxXml);
      }
      let item = dataList[position];
      convertView.getChildAt(0).setText(item);
      return convertView;
    },
    getView: function (position, convertView, parent) {
      log("getView");
      if (!convertView) {
        let boxXml = (
          <horizontal>
            <text
              id="name"
              paddingLeft="3"
              android:layout_width="wrap_content"
              android:layout_height="match_parent"
              textColor="#ffffff"
              gravity="center"
              textSize="10sp"
            ></text>
            <img
              tint="#ffffff"
              padding="-18 0 0 0"
              android:layout_width="30dp"
              android:layout_height="match_parent"
              android:layout_gravity="center_vertical"
              src="@drawable/ic_arrow_drop_down_black_48dp"
            ></img>
          </horizontal>
        );
        convertView = ui.inflate(boxXml);
      }
      let item = dataList[position];
      convertView.name.setText(item);
      return convertView;
    },
  });
  return adapter;
}
3. 手指移动悬浮窗
function setOnTouchListener(floatyWindow, childView, clickAction) {
  childView.setOnTouchListener(function (view, event) {
    switch (event.getAction()) {
      case event.ACTION_DOWN:
        log("ACTION_DOWN");
        x = event.getRawX();
        y = event.getRawY();
        windowX = floatyWindow.getX();
        windowY = floatyWindow.getY();
        downTime = new Date().getTime();
        return true;
      case event.ACTION_MOVE:
        log("ACTION_MOVE");
        //移动手指时调整悬浮窗位置
        floatyWindow.setPosition(windowX + (event.getRawX() - x), windowY + (event.getRawY() - y));
        
        return true;
      case event.ACTION_UP:
        log("ACTION_UP");
        log("按下时长: " + (new Date().getTime() - downTime));
        //如果判断为长按,退出脚本
        if (new Date().getTime() - downTime > 3000 && event.getRawX() - x < 5 && event.getRawY() - y < 5) {
          exit();
        } else {
          //手指弹起时如果偏移很小则判断为点击
          if (Math.abs(event.getRawY() - y) < 5 && Math.abs(event.getRawX() - x) < 5) {
            clickAction();
          }
        }
        return true;
    }
    return true;
  });
}
4. 获取控件属性
function getViewAttr(ballView) {
  let parentView = ballView.getParent();
  let parentViewWidth = parentView.getWidth();
  let parentViewHeight = parentView.getHeight();
  let parentViewLeft = parentView.getLeft();
  let parentViewRight = parentView.getRight();
  let parentViewX = parentView.getX();
  let parentViewY = parentView.getY();
  let parentViewPaddingLeft = parentView.getPaddingLeft();
  let parentViewPaddingRight = parentView.getPaddingRight();

  let ballViewWidth = ballView.getWidth();
  let ballViewHeight = ballView.getHeight();
  let ballViewLeft = ballView.getLeft();
  let ballViewRight = ballView.getRight();
  let ballViewX = ballView.getX();
  let ballViewY = ballView.getY();

  let ball = {
    parentViewWidth: parentViewWidth,
    parentViewHeight: parentViewHeight,
    parentViewLeft: parentViewLeft,
    parentViewRight: parentViewRight,
    parentViewX: parentViewX,
    parentViewY: parentViewY,
    parentViewPaddingRight: parentViewPaddingRight,
    parentViewPaddingLeft: parentViewPaddingLeft,
    ballViewWidth: ballViewWidth,
    ballViewHeight: ballViewHeight,
    ballViewLeft: ballViewLeft,
    ballViewRight: ballViewRight,
    ballViewX: ballViewX,
    ballViewY: ballViewY,
  };
  return ball;
}
5. 设置圆角背景
function setBackgroundRoundedRectangle(view) {
  gradientDrawable = new GradientDrawable();
  gradientDrawable.setShape(GradientDrawable.RECTANGLE);
  gradientDrawable.setStroke(5, colors.parseColor(增量更新按钮颜色));
  gradientDrawable.setCornerRadius(10);
  gradientDrawable.setSize(50, 50);
  view.setBackground(gradientDrawable);
}
6. 设置PopWindow监听事件
mPopWindow.setOnDismissListener(
  new PopupWindow.OnDismissListener({
    onDismiss: function () {
      backgroundAlpha(1);
    },
  })
);

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

在这里插入图片描述

QQ群

747748653
在这里插入图片描述

完整源码

### Auto.js Pro 9.3.11 版本特性 Auto.js Pro 9.3.11 提供了一系列增强功能和支持,旨在提升用户体验和开发效率。该版本解除了布局识别限制以及打包后的某些限制[^2]。对于未root的手机,可以通过安装专属的布局识别APK来实现基本的布局识别功能,尽管无法查看控件深度。 #### 主要特点: - **兼容性**:完全支持所有auto.js、autojs pro9、autox.js各版本中的脚本代码,在云控应用上可以直接运行这些脚本[^1]。 - **布局识别优化**:特别针对未root设备进行了改进,允许通过特定方式执行布局识别操作,不过仍存在一定的局限性,比如不能获取完整的视图层次结构信息。 - **远程控制与管理**:提供强大的云端管理和监控能力,包括但不限于脚本编写、调试、分发等功能;还具备多台设备的同时操控能力和实时屏幕共享特性。 --- ### 安装指南 为了顺利安装并配置好Auto.js Pro 9.3.11环境,请按照如下说明进行设置: 1. 下载最新版的应用程序包文件(.apk),可以从官方渠道获得合法下载链接; 2. 将应用程序安装到目标Android设备上,并授予必要的权限请求; 3. 如果计划利用高级特性的如布局解析,则需额外安装专门设计用于辅助此过程的小工具——即上述提到过的专有布局识别插件; 4. 启动软件后登录账号(如果有的话),完成初始化向导即可开始探索其强大之处了! ```bash adb install path_to_your_apk_file.apk ``` > 注意事项:确保所使用的安卓操作系统满足最低要求,并且在整个过程中保持网络连接稳定以便顺利完成整个流程。 --- ### 使用教程概览 初次接触Auto.js Pro的新手开发者可能会觉得有些不知所措,这里给出一些基础指导帮助快速入门: - 学习JavaScript语法及其扩展库,因为这是编写自动化任务的主要编程语言之一; - 探索内置API文档,了解如何调用各种方法来进行UI交互、数据处理等常见需求; - 实践案例研究,尝试模仿已有的优秀作品或解决方案以加深理解; - 加入社区交流平台寻求更多灵感和技术支持资源。 例如,下面是一个简单的例子展示了怎样创建一个定时发送消息的任务: ```javascript // 设置间隔时间和接收者ID var interval = 60 * 1000; // 每分钟一次 var receiverId = "contact_id_here"; function sendMessage() { app.launchApp("Messages"); sleep(2000); var inputField = textContains("Enter message").findOne(); if (inputField != null){ inputField.setText("Hello from AutoJS!"); back(); sleep(500); click("Send"); } } setInterval(sendMessage, interval); ``` --- ### 更新日志摘要 关于具体的更新细节,虽然没有详细的变更记录可供查阅,但从现有资料可以推测出几个重要的改动方向: - 增强了对不同型号终端的支持范围,提高了跨平台适配性和稳定性; - 改进了性能表现特别是在复杂场景下的响应速度有所提高; - 解决了一些之前存在的安全漏洞问题从而加强整体安全性防护水平; - 对用户界面做了细微调整使得操作更加直观友好易于掌握。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙叔教程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值