autojs优秀UI-自定义控件

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂


教程目的

本篇教程是一个自定义控件的教学演示, 无任何实际功能,

更没有提现功能, 那只是一个自定义按钮

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

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

效果展示



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);
    },
  })
);


声明

部分内容来自网络

本教程仅用于学习, 禁止用于其他用途

相关文章
|
5月前
|
C# 开发者 C++
一套开源、强大且美观的WPF UI控件库
一套开源、强大且美观的WPF UI控件库
406 0
|
XML 开发框架 编译器
基于Qt编写超精美自定义控件
无论是哪一门开发框架,如果涉及到UI这块,肯定需要用到自定义控件,越复杂功能越多的项目,自定义控件的数量就越多,最开始的时候可能每个自定义控件都针对特定的应用场景,甚至里面带了特定的场景的一些设置和处理,随着项目数量的增多,有些控件又专门提取出来共性,做成了通用的自定义控件,意味着控件主要做外观处理,用户根据不同的场景需要,设置不同的外观和规则,就这样搞来搞去搞到现在,已经超过了202个控件,慢慢的积累迭代和更新,历经超过9年的时间不断的完善,尤其是对不同Qt版本、不同编译器、不同操作系统的支持,其中Qt6改动比较大,很多方法或者类改名或者废弃了,需要用类似的方法处理,在改完整个自定义控件大全
116 0
基于Qt编写超精美自定义控件
WPF常用UI库和图标库(MahApps、HandyControl、LiveCharts)
WPF有很多开源免费的UI库,本文主要介绍常见的MahApps、HandyControl两个UI库;在开发过程中经常会涉及到图表的开发,本文主要介绍LiveCharts开源图表库。
|
XML 编解码 数据可视化
第三讲 UI控件使用
第三讲 UI控件使用
177 0
第三讲 UI控件使用
|
前端开发 Android开发
autojs自定义控件-移动背景
我们把背景看成一个小球, 小球可以在某个空间内自由移动, 他需要一个目标的坐标信息, 然后需要一个从当前的起点, 到目标点的移动规则, 小球也可以在移动的时候变换形态, 比如圆形, 椭圆, 圆角矩形等
14517 0
|
XML Android开发 数据格式
autojs自定义控件色轮
牙叔教程 简单易懂
232 0
|
开发工具 C语言 索引
Qt编写自定义控件36-图片浏览器
一、前言 本控件主要用来作为一个简单的图片浏览器使用,可以上下翻页显示图片,图片还可以开启过度效果比如透明度渐变,应用场景有查看报警图片运行图片等。此控件非本人原创,来源于网络,我只是修正了好多处BUG,并完善了各种操作方式。
1150 0