autojs自定义组件

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂

组件例子

autojs自带参考示例->界面控件->自定义控件

最简单的组件

var MyView = (function () {
    //继承至ui.Widget
    util.extend(MyView, ui.Widget);
    function MyView() {
        ui.Widget.call(this);
    }
    MyView.prototype.render = function () {
        return <View></View>;
    };
    ui.registerWidget("my-view", MyView);
    return MyView;
})();

组件的状态

组件有自己的状态, 也有修改状态的方法,也有自己的生命周期

比如, 我们给组件添加一个状态:颜色

var MyView = (function () {
    //继承至ui.Widget
    util.extend(MyView, ui.Widget);
    function MyView() {
        ui.Widget.call(this);
        this.defineAttr(
            "my-view-color",
            (view, name, defaultGetter) => {
                return this._color;
            },
            (view, name, value, defaultSetter) => {
                this._color = value;
                view.attr("background", value);
            }
        );
    }
    MyView.prototype.render = function () {
        return <View></View>;
    };
    ui.registerWidget("my-view", MyView);
    return MyView;
})();
ui.layout(
    <vertical>
        <my-view my-view-color="#ff0000"></my-view>
    </vertical>
);

新增的代码是这个, 它的书写位置是自定义组件的构造函数 function MyView(){...}  里面;

他有三个参数:

  • 属性名字
  • getter
  • setter
this.defineAttr(
    "my-view-color",
    (view, name, defaultGetter) => {
        return this._color;
    },
    (view, name, value, defaultSetter) => {
        this._color = value;
        view.attr("background", value);
    }
);

外界获取组件的颜色

log(ui.myView.widget._color);

组件的生命周期

  • onViewCreated
  • onFinishInflation

添加生命周期

MyView.prototype.onViewCreated = function (view) {};
MyView.prototype.onFinishInflation = function (view) {};


我们打印一下, 看看谁先谁后

[ 'onViewCreated', 'onFinishInflation' ] 


看这名字像一颗种子种下了,然后长成了大树

给组件添加点击事件

每个组件的点击事件应该是独立的,因此我们在组件的构造函数中添加一个属性clickAction

function MyView() {
    ui.Widget.call(this);
    this.clickAction = function () {};
}


然后在 onViewCreated 或者 onFinishInflation 监听按钮点击, 然后触发点击事件clickAction

MyView.prototype.onFinishInflation = function (view) {
    let that = this;
    view.on("click", function () {
        that.clickAction();
    });
};


如果我们想在组件之外修改点击事件, 那么就要在组件里面, 去接受外面的修改行为;
我们给组件添加一个set方法, 去修改点击事件:

MyView.prototype.setClickAction = function (fn) {
    this.clickAction = fn;
};

外界调用组件的set方法

也许你会觉得应该这样写?

ui.myView.setClickAction(function () {
    toastLog("外界修改了my-view");
});


报错了

TypeError: Cannot find function setClickAction in object android.view.View{18664b9 V.ED..C.. ......ID 0,0-0,0 #133a2cd}.


正确写法, 要在myView后面加一个 .widget

ui.myView.widget.setClickAction(function () {
    log("this is new clickAction");
});

统计使用了多少个组件

ui.layout(
    <vertical>
        <my-view id="myView" my-view-color="#ff0000"></my-view>
        <my-view id="myView2" my-view-color="#00ff00"></my-view>
        <my-view id="myView3" my-view-color="#0000ff"></my-view>
    </vertical>
);


这里使用了三个组件, 我们要获取组件的个数, 怎么获取?


我们在构造函数的上方添加一个变量 counter

let counter = 0;
function MyView() {}


再在onViewCreated 中修改counter, 新增一个组件, onViewCreated就会调用一次

MyView.prototype.onViewCreated = function (view) {
    counter++;
};


最后,我们把获取counter的方法挂到MyView上面

MyView.getCounter = function () {
    return counter;
};


获取组件个数

log(MyView.getCounter());

所有代码

"ui";
engines.all().map((ScriptEngine) => {
    if (engines.myEngine().toString() !== ScriptEngine.toString()) {
        ScriptEngine.forceStop();
    }
});
activity.window.addFlags(android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
importClass(android.view.View);
let arr = [];
var MyView = (function () {
    //继承至ui.Widget
    util.extend(MyView, ui.Widget);
    let counter = 0;
    function MyView() {
        ui.Widget.call(this);
        this.clickAction = function () {
            log("this is myView clickAction");
        };
        this.defineAttr(
            "my-view-color",
            (view, name, defaultGetter) => {
                return this._color;
            },
            (view, name, value, defaultSetter) => {
                this._color = value;
                view.attr("background", value);
            }
        );
    }
    MyView.prototype.setClickAction = function (fn) {
        this.clickAction = fn;
    };
    MyView.prototype.render = function () {
        return <View></View>;
    };
    MyView.prototype.onViewCreated = function (view) {
        counter++;
    };
    MyView.getCounter = function () {
        return counter;
    };
    MyView.prototype.onFinishInflation = function (view) {
        let that = this;
        view.on("click", function () {
            that.clickAction();
        });
    };
    ui.registerWidget("my-view", MyView);
    return MyView;
})();
ui.layout(
    <vertical>
        <my-view id="myView" my-view-color="#ff0000"></my-view>
        <my-view id="myView2" my-view-color="#00ff00"></my-view>
        <my-view id="myView3" my-view-color="#0000ff"></my-view>
    </vertical>
);
ui.myView.widget.setClickAction(function () {
    log("this is new clickAction");
});
log(MyView.getCounter());


环境
雷电模拟器: 4.0.63

Android版本: 7.1.2

Autojs版本: 8.8.20


名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程


声明

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





相关文章
|
Android开发
autojs下拉刷新
牙叔教程 简单易懂
823 0
|
7天前
|
JavaScript API 数据库
ant design vue + jeecgboot 实现本地上传视频及播放视频功能
ant design vue + jeecgboot 实现本地上传视频及播放视频功能
22 2
|
4月前
|
JavaScript 测试技术
【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发
【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发
|
2月前
|
JavaScript API
uniapp自定义导航栏方法
uniapp自定义导航栏方法
42 0
|
3月前
|
前端开发 API
uniapp中uview组件库丰富的LoadingIcon 加载动画
uniapp中uview组件库丰富的LoadingIcon 加载动画
65 0
|
6月前
|
API 开发者 索引
Flutter笔记:发布一个多功能轮播组件 awesome_carousel
awesome_carousel 模块是一个Flutter轮播图模块。可以实现包括自定义指示器、动画、滚动等等众多功能。能够指定相当多地细节(可以参考 API 部分了解)本文给出 awesome_carousel 模块的两个简单的用法示例。
78 0
|
容器
react-Ant Design框架项目中文字轮播与图片轮播的实现
在react-Ant Design框架项目中实现文字轮播和图片轮播,在这里记录一下,实现过程有一点小坑需要注意
484 0
react-Ant Design框架项目中文字轮播与图片轮播的实现
|
JavaScript 前端开发 开发工具
【笔记01】在 uniapp 安装 uview-ui
① 第一次参与工作期间,我用 vue 搭建制作公司的一个项目。一个前端同事甲(甘圆圆)问我为什么不用 uniapp 和 HBuilderX?还说用 uniapp 更加容易。在帮我处理某个 bug(用 vue 创建的项目需要引入 base.css 和 normalize.css,否则样式未清除)的使用坐离我比较近的另一个同事问我 bug 是否解决?我告诉她:通过引入 base.css 和 normalize.css 进行解决。她说:哦!原生的需要引入。 ② 原生的?难道我使用的 vue 非常 low 吗?鉴于两个同事都提到 vue 比较难,我开始了 uniapp 创建项目的过程。 ③ 该文章只是
843 1
【笔记01】在 uniapp 安装 uview-ui
|
Android开发
autojs一键换肤
牙叔教程 简单易懂
124 0
|
Android开发
autojs Material组件使用详解
autojs Material组件使用详解
356 0