1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
//build:20240315
//公用的一些函数、常量、枚举等
import { uiClass } from '../dxmodules/libvbar-m-dxui.so'
import logger from './dxLogger.js'
const ui = new uiClass();
// 初始化ui组件
ui.init()
 
let utils = {}
utils.GG = NativeObject.APP.NativeComponents
utils.ENUM = utils.GG.NativeEnum
utils.LAYER = {
    "MAIN": 0,
    "SYS": 1,
    "TOP": 2
}
utils.EVENT = {
    "CLICK": 7,
    "LONG_PRESSED": 5,
    "SHORT_PRESSED": 4,
    "PRESSING": utils.ENUM.LV_EVENT_PRESSING,
    "FOCUSED": utils.ENUM.LV_EVENT_FOCUSED,
    "DEFOCUSED": utils.ENUM.LV_EVENT_DEFOCUSED,
    "VALUE_CHANGED": utils.ENUM.LV_EVENT_VALUE_CHANGED,
    "INSERT": utils.ENUM.LV_EVENT_INSERT,
    "REFRESH": utils.ENUM.LV_EVENT_REFRESH,
    "READY": utils.ENUM.LV_EVENT_READY,
    "CANCEL": utils.ENUM.LV_EVENT_CANCEL,
}
utils.TEXT_ALIGN = {
    "AUTO": 0,
    "LEFT": 1,
    "CENTER": 2,
    "RIGHT": 3
}
utils.STATE = {
    "DEFAULT": utils.ENUM.LV_STATE_DEFAULT,
    "CHECKED": utils.ENUM.LV_STATE_CHECKED,
    "FOCUSED": utils.ENUM.LV_STATE_FOCUSED,
    "FOCUS_KEY": utils.ENUM.LV_STATE_FOCUS_KEY,
    "EDITED": utils.ENUM.LV_STATE_EDITED,
    "HOVERED": utils.ENUM.LV_STATE_HOVERED,
    "PRESSED": utils.ENUM.LV_STATE_PRESSED,
    "SCROLLED": utils.ENUM.LV_STATE_SCROLLED,
    "DISABLED": utils.ENUM.LV_STATE_DISABLED,
}
utils.OBJ_FLAG = {
    "CLICKABLE": utils.ENUM.LV_OBJ_FLAG_CLICKABLE,
}
utils.ALIGN = {//相对参照对象的位置,带 OUT 的在参照对象的边界外
    "OUT_TOP_LEFT": utils.ENUM.LV_ALIGN_OUT_TOP_LEFT,
    "OUT_TOP_MID": utils.ENUM.LV_ALIGN_OUT_TOP_MID,
    "OUT_TOP_RIGHT": utils.ENUM.LV_ALIGN_OUT_TOP_RIGHT,
    "OUT_BOTTOM_LEFT": utils.ENUM.LV_ALIGN_OUT_BOTTOM_LEFT,
    "OUT_BOTTOM_MID": utils.ENUM.LV_ALIGN_OUT_BOTTOM_MID,
    "OUT_BOTTOM_RIGHT": utils.ENUM.LV_ALIGN_OUT_BOTTOM_RIGHT,
    "OUT_LEFT_TOP": utils.ENUM.LV_ALIGN_OUT_LEFT_TOP,
    "OUT_LEFT_MID": utils.ENUM.LV_ALIGN_OUT_LEFT_MID,
    "OUT_LEFT_BOTTOM": utils.ENUM.LV_ALIGN_OUT_LEFT_BOTTOM,
    "OUT_RIGHT_TOP": utils.ENUM.LV_ALIGN_OUT_RIGHT_TOP,
    "OUT_RIGHT_MID": utils.ENUM.LV_ALIGN_OUT_RIGHT_MID,
    "OUT_RIGHT_BOTTOM": utils.ENUM.LV_ALIGN_OUT_RIGHT_BOTTOM,
    "TOP_LEFT": utils.ENUM.LV_ALIGN_TOP_LEFT,
    "TOP_MID": utils.ENUM.LV_ALIGN_TOP_MID,
    "TOP_RIGHT": utils.ENUM.LV_ALIGN_TOP_RIGHT,
    "BOTTOM_LEFT": utils.ENUM.LV_ALIGN_BOTTOM_LEFT,
    "BOTTOM_MID": utils.ENUM.LV_ALIGN_BOTTOM_MID,
    "BOTTOM_RIGHT": utils.ENUM.LV_ALIGN_BOTTOM_RIGHT,
    "LEFT_MID": utils.ENUM.LV_ALIGN_LEFT_MID,
    "RIGHT_MID": utils.ENUM.LV_ALIGN_RIGHT_MID,
    "CENTER": utils.ENUM.LV_ALIGN_CENTER,
    "DEFAULT": utils.ENUM.LV_ALIGN_DEFAULT
}
utils.FLEX_ALIGN = {//flex布局,对齐方式
    "START": utils.ENUM.LV_FLEX_ALIGN_START,
    "END": utils.ENUM.LV_FLEX_ALIGN_END,
    "CENTER": utils.ENUM.LV_FLEX_ALIGN_CENTER,
    "SPACE_EVENLY": utils.ENUM.LV_FLEX_ALIGN_SPACE_EVENLY,
    "SPACE_AROUND": utils.ENUM.LV_FLEX_ALIGN_SPACE_AROUND,
    "SPACE_BETWEEN": utils.ENUM.LV_FLEX_ALIGN_SPACE_BETWEEN,
}
utils.FLEX_FLOW = {//flex布局,主侧轴
    "ROW": utils.ENUM.LV_FLEX_FLOW_ROW,
    "COLUMN": utils.ENUM.LV_FLEX_FLOW_COLUMN,
    "ROW_WRAP": utils.ENUM.LV_FLEX_FLOW_ROW_WRAP,
    "ROW_REVERSE": utils.ENUM.LV_FLEX_FLOW_ROW_REVERSE,
    "ROW_WRAP_REVERSE": utils.ENUM.LV_FLEX_FLOW_ROW_WRAP_REVERSE,
    "COLUMN_WRAP": utils.ENUM.LV_FLEX_FLOW_COLUMN_WRAP,
    "COLUMN_REVERSE": utils.ENUM.LV_FLEX_FLOW_COLUMN_REVERSE,
    "COLUMN_WRAP_REVERSE": utils.ENUM.LV_FLEX_FLOW_COLUMN_WRAP_REVERSE,
}
utils.GRAD = {//渐变色方向
    "NONE": utils.ENUM.LV_GRAD_DIR_NONE,
    "VER": utils.ENUM.LV_GRAD_DIR_VER,
    "HOR": utils.ENUM.LV_GRAD_DIR_HOR,
}
utils.KEYBOARD = {//键盘模式
    "TEXT_LOWER": utils.ENUM.LV_KEYBOARD_MODE_TEXT_LOWER,
    "TEXT_UPPER": utils.ENUM.LV_KEYBOARD_MODE_TEXT_UPPER,
    "SPECIAL": utils.ENUM.LV_KEYBOARD_MODE_SPECIAL,
    "NUMBER": utils.ENUM.LV_KEYBOARD_MODE_NUMBER,
    "K26": "K26",
    "K9": "K9",
}
utils.FONT_STYLE = {
    "NORMAL": utils.ENUM.FT_FONT_STYLE_NORMAL,
    "ITALIC": utils.ENUM.FT_FONT_STYLE_ITALIC,
    "BOLD": utils.ENUM.FT_FONT_STYLE_BOLD,
}
utils.BUTTONS_STATE = {
    "HIDDEN": utils.ENUM.LV_BTNMATRIX_CTRL_HIDDEN,//按钮矩阵中的某个按钮是否隐藏
    "NO_REPEAT": utils.ENUM.LV_BTNMATRIX_CTRL_NO_REPEAT,//按钮矩阵中的按钮是否可以重复按下,不会重复触发按键事件
    "DISABLED": utils.ENUM.LV_BTNMATRIX_CTRL_DISABLED,//按钮矩阵中的某个按钮是否禁用
    "CHECKABLE": utils.ENUM.LV_BTNMATRIX_CTRL_CHECKABLE,//按钮矩阵中的按钮是否可选中
    "CHECKED": utils.ENUM.LV_BTNMATRIX_CTRL_CHECKED,//按钮矩阵中的某个按钮是否已被选中,在界面上呈现为被选中状态
    "CLICK_TRIG": utils.ENUM.LV_BTNMATRIX_CTRL_CLICK_TRIG,//按钮矩阵中的按钮是否可以通过点击触发
    "POPOVER": utils.ENUM.LV_BTNMATRIX_CTRL_POPOVER,//矩阵中的某个按钮是否弹出,被点击后会显示更多的选项或内容
    "RECOLOR": utils.ENUM.LV_BTNMATRIX_CTRL_RECOLOR//矩阵中的按钮是否可重新着色
}
//样式起作用的部分
utils.STYLE_PART = {
    "MAIN": 0, //对象当前样式起作用
    "ITEMS": 327680//对象内部子项起作用,比如buttonMatrix里的按钮组
}
//文本超出控件显示的模式
utils.LABEL_LONG_MODE = {
    "WRAP": utils.ENUM.LV_LABEL_LONG_WRAP,//文本长的时候换行
    "DOT": utils.ENUM.LV_LABEL_LONG_DOT,//文本长的时候用...替代
    "SCROLL": utils.ENUM.LV_LABEL_LONG_SCROLL,//文本长的时候自动滚动
    "SCROLL_CIRCULAR": utils.ENUM.LV_LABEL_LONG_SCROLL_CIRCULAR,//文本长的时候循环滚动
    "CLIP": utils.ENUM.LV_LABEL_LONG_CLIP,//文本长的时候自动截断
}
// 实现0-100映射为0-255
utils.OPA_MAPPING = function (value) {
    return Math.round((value / 100) * 255);
}
/**
* 校验数字是否为空,是否为number
* @param {number} n 必填
* @param {err} 错误信息,非必填,填了会抛出Error
*/
utils.validateNumber = function (n, err) {
    return _valid(n, 'number', err)
}
/**
* 校验对象是否为空,是否为object
* @param {object} o 必填
* @param {err} 错误信息,非必填,填了会抛出Error
*/
utils.validateObject = function (o, err) {
    return _valid(o, 'object', err)
}
/**
 * 校验ui对象的构建参数
 * @param {array} all 必填,所有对象引用
 * @param {string} id 不能为空,必填
 * @param {object} parent 非必填,缺省是0
 */
utils.validateBuild = function (all, id, parent, type) {
    this.validateId(all, id)
    if (parent === 0 || parent === 1 || parent === 2) {
        return parent
    }
    if (!parent || !parent.obj) {
        throw new Error(type + ".build: 'parent' paramter should not be null")
    }
    return parent.obj
}
/**
 * 校验所有ui控件的id,不能重复
 * @param {array} all 
 * @param {string} id 
 */
utils.validateId = function (all, id) {
    this.validateString(id, "The 'id' parameter should not be null.")
    if (all[id]) {
        throw new Error("The id(" + id + ") already exists. Please set a different id value.")
    }
}
/**
* 校验字符串是否为空
* @param {string} s 必填
* @param {err} 错误信息,非必填,填了会抛出Error
*/
utils.validateString = function (s, err) {
    let res = _valid(s, 'string', err)
    if (!res) {
        return false
    }
    if (s.length <= 0) {
        if (err) {
            throw new Error(err)
        }
        return false
    }
    return true
}
/**
 * 解析不同类型的颜色值
 * @param {any} value 支持数字类型:0x34ffaa,字符串类型:'0x34ffaa',字符串类型:'#34ffaa'
 * @returns 
 */
utils.colorParse = function (value) {
    if (typeof value == 'string') {
        value = value.replace('#', '0x')
        value = parseInt(value, 16)
    }
    return value
}
/**
 * 获取触摸点的坐标
 * @returns {x:横坐标,y:纵坐标}
 */
utils.getTouchPoint = function () {
    let point = NativeObject.APP.NativeComponents.NativeIndev.lvIndevGetPoint()
    return point
}
/**
 * 提供动画
 * @param {object} obj 动画操作对象,可以是任意对象,回调参数获取
 * @param {number} start 区间开始值,一般和end搭配使用,回调参数获取,start在动画过程变化到end
 * @param {number} end 区间结束值
 * @param {function} cb 回调函数(obj, v)=>{},obj即动画操作对象,区间值(start-end)
 * @param {number} duration 动画持续时间,毫秒
 * @param {number} backDuration 可选,动画回放时间,毫秒,缺省不回放
 * @param {number} repeat 可选,动画重复次数,缺省1次
 * @param {string} mode 速率曲线,可选,缺省linear,内置功能:linear,ease_in,ease_out,ease_in_out,overshoot,bounce,step
 *  linear 线性动画
    step 在最后一步更改
    ease_in 开始缓慢
    ease_out 最后缓慢
    ease_in_out 在开始和结束时都很缓慢
    overshoot 超出最终值
    bounce 从最终值反弹一点(比如撞到墙)
 * @returns 动画实例,一定得保存到全局
 */
utils.anime = function (obj, start, end, cb, duration, backDuration, repeat, mode) {
    // 1、初始化动画
    let anim = NativeObject.APP.NativeComponents.NativeAnim.lvAnimInit()
    // 2、设置动画对象
    anim.lvAnimSetVar(obj)
    // 3、设置起始和结束值
    anim.lvAnimSetValues(start, end)
    //4、设置动画回调函数
    anim.lvAnimSetExecCb(cb)
    // 5、设置动画时间
    anim.lvAnimSetTime(duration)
    // 可选,设置动画回放时间,不设置就不回放
    if (backDuration) {
        anim.lvAnimSetPlaybackTime(backDuration)
    }
    // 可选,设置动画重复次数
    if (repeat) {
        anim.lvAnimSetRepeatCount(repeat)
    }
    // 可选,设置动画速率曲线
    if (mode) {
        anim.lvAnimSetPathCb(mode)
    }
    // 6、运行动画
    anim.lvAnimStart()
    return anim
}
//每个对象设置parent和children
utils.setParent = function (all, child, parent) {
    if (!all || parent == null || parent == undefined || !child) {
        return
    }
    if((typeof parent)=='number'){
 
    }
    const parentId = ((typeof parent)=='number')?'' + parent:parent.id//把0,1,2转成字符串
    if (!all[parentId]) {
        all[parentId] = { id: parentId }//根节点0,1,2
    }
    if (!all[parentId].children) {
        all[parentId].children = []
    }
    all[parentId].children.push(child.id)
    child.parent = parentId
    all[child.id] = child
}
function _valid(n, type, err) {
    if (n === undefined || n === null || (typeof n) != type) {
        if (err) {
            throw new Error(err)
        }
        return false
    }
    return true
}
export default utils