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


声明

部分内容来自网络

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

相关文章
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
57 1
|
XML 编解码 数据可视化
第三讲 UI控件使用
第三讲 UI控件使用
188 0
第三讲 UI控件使用
|
XML Android开发 数据格式
autojs自定义控件色轮
牙叔教程 简单易懂
243 0
|
开发工具 C语言
Qt编写自定义控件33-图片切换动画
一、前言 在很多看图软件中,切换图片的时候可以带上动画过渡或者切换效果,显得更人性化,其实主要还是炫一些,比如百叶窗、透明度变化、左下角飞入等,无论多少种效果,核心都是围绕QPainter来进行,将各种动画效果对应的图片的区域动态计算并绘制出来,配合以QPropertyAnimation动画属性产生线性插值,比如渐入飞入时候,可以中间快速两端慢速。
1044 1
|
开发工具 C语言
Qt编写自定义控件40-导航进度条
一、前言 导航进度条控件,其实就是支付宝、京东、淘宝订单页面的进度控件,提示当前第几步,总共有几步,然后当前进度特殊颜色显示,每个进度带有时间文字等信息,本控件特意将三种样式风格都集成进去了,京东订单流程样式/淘宝订单流程样式/支付宝订单流程样式,可以动态切换样式,控件自适应任何分辨率,可以自由调整自身大小以适应分辨率的改变,总步骤以及当前步骤都是自动计算占用区域比例,直接提供接口设置步骤对应的文字信息等,接口非常友好。
1346 0
|
开发工具 C语言 索引
Qt编写自定义控件36-图片浏览器
一、前言 本控件主要用来作为一个简单的图片浏览器使用,可以上下翻页显示图片,图片还可以开启过度效果比如透明度渐变,应用场景有查看报警图片运行图片等。此控件非本人原创,来源于网络,我只是修正了好多处BUG,并完善了各种操作方式。
1160 0
|
开发工具 C语言
Qt编写自定义控件32-等待进度条控件
一、前言 在各种各样的执行任务界面,有时候需要比较多的时间,需要给出一个直观的等待进度条表示当前正在执行的进度,而不至于懵逼在那里,用户不会觉得程序死了还是干嘛了。等待进度条有好几种办法,比如直接叫美工做好gif图,用QLabel配合QMovie来加载gif图片,这种方法最简单最省事,或者做好多张进度条的图片,采用定时贴图来实现,这些办法省事归省事,就是还不够灵活,写死了,比如有时候需要更换颜色或者换一种展示形式,又需要美工重新做图了,折磨的要死。
1931 0
|
开发工具 C语言
Qt编写自定义控件14-环形进度条
一、前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即当前进度90%,剩余的10%也需要设置成不同的颜色,还有一个重要的功能是,能够指定多个警戒值,一旦超过或者小于该值,则当前进度自动切换到预先设定的警戒值颜色,而不需要用户自己去判断警戒值去设置警戒颜色,用户只需要传入当前值即可,这个功能非常实用,还可以设置警戒判断的标准是超过值还是小于值报警。
1406 0
|
开发工具 C语言
Qt编写自定义控件17-按钮进度条
一、前言 按钮进度条,顾名思义,表面上长得像一个按钮,单击以后切换成进度条指示按钮单击动作执行的进度,主要用在一些需要直接在按钮执行动作显示对应进度的场景,在很多网页中经常看到这种效果,这个效果有个优点就是直接在原地显示进度条,不占用其他位置,然后提供各种颜色可以设置。
1259 0