Auto.js 文本带行号 编辑器

在这里插入图片描述

"ui";
//开发者 QQ 1105310045
//文本编辑器半成品
importClass(android.graphics.Typeface); //字体
importClass(java.lang.Character); //分中英文
ui.layout(
    <vertical>
        <horizontal>
            <text id="字"/>
            <button id="删除"text="删除"/>
            <input id="输入框"w="600px"/>
            <button id="写入"text="写入"/>
        </horizontal>
        <canvas id="board" w="*" h="*"/>
    </vertical>
);
dm = ""
threads.start(function() {
    var r = http.get("http://www.baidu.com");
    代码 = r.body.string()
    for (var i = 0; i < 12; i++) {
        代码 += 代码 + "\n"
    }
    dm = 代码.split("> <");
    toastLog(dm.length+"行")
})
//画笔
字位置 = 0
删位x = 0
横行 = 0
删行y = 0 //可以设置跳转行数
屏幕X = 0
屏幕Y = 0
坐标差x = 0
坐标差y = 0
画布x = 160
画布y = -(70 * 删行y)
按压时间 = 0
光标坐标 = [画布x, 70]
光标时间 = 0
行号 = 1
画布开关 = true
var paint = new Paint();
paint.setStrokeWidth(1);
var paint1 = new Paint(); //画光标
paint1.setStrokeWidth(5);
paint.setTextSize(50); //字体大小
paint.setTypeface(Typeface.MONOSPACE); //字体样式
ui.board.on("draw", function(canvas) {
    if (dm && 画布开关) {
        try {
            canvas.drawColor(-14868703);
            画代码和行号(canvas)
            画光标(canvas)
            //paint.setARGB(255,229,54,49)
            //canvas.drawText(删位x + " " + 字位置 + " " + Math.floor(删位x), 100, 50, paint);
        } catch (e) {
            log("报错了" + e)
        }
    }

});
ui.board.setOnTouchListener(function(view, event) {
    switch (event.getAction()) {
        case event.ACTION_DOWN:
            屏幕X = event.getX();
            屏幕Y = event.getY();
            按压时间 = 0
            zwz = 字位置
            gbzb = 光标坐标[0]
            hh = 行号
            return true;
        case event.ACTION_MOVE:
            移动a = event.getX();
            移动b = event.getY();
            坐标差x = 移动a - 屏幕X
            坐标差y = 移动b - 屏幕Y
            if (坐标差x > 15 || 坐标差x < -15 || 坐标差y > 15 || 坐标差y < -15) {
                画布x += 坐标差x * 1.3
                if (画布x > 160) {
                    画布x = 160
                }
                画布y += 坐标差y * 1.3
                if (画布y * 1.3 > 30) {
                    画布y = 0
                }
                屏幕X = 移动a
                屏幕Y = 移动b
            }
            按压时间++
            return true;
        case event.ACTION_UP:
            屏幕X = event.getX();
            屏幕Y = event.getY();
            删行y = Math.floor((Math.abs(画布y)) / 70)
            if (删行y > 40) {
                删行y -= 30
            } else {
                删行y = 0
            }
            行号 = Math.floor((Math.abs(画布y - 70) + 屏幕Y) / 70)
            光标坐标[1] = 行号 * 70
            计算横行光标()

            return true;
    }
    return true;
});

function 画代码和行号(canvas) {
    paint.setARGB(255, 197, 200, 198)
    for (let i = 1 + 删行y; i < 100 + 删行y; i++) {
        if (i > dm.length - 1) {
            break;
        }
        //画代码
        字宽 = 画布x
        for (let l = 0; l < dm[i - 1].length; l++) {

            if (字宽 > 1600) {
                break;
            }
            if (分中英文(dm[i - 1][l])) {
                if (字宽 > 160 - 10) {
                    canvas.drawText(dm[i - 1][l], 字宽, 画布y + i * 70, paint);
                }
                字宽 += 50
            } else {
                if (字宽 > 160 - 10) {
                    canvas.drawText(dm[i - 1][l], 字宽, 画布y + i * 70, paint);
                }
                字宽 += 30
            }
        }
        //画线
        canvas.drawLine(0, 画布y + i * 70 + 10, 3000, 画布y + i * 70 + 10, paint);
    }
    //行号背景颜色
    paint.setARGB(255, 37, 40, 44)
    canvas.drawRect(0, 0, 160, canvas.getHeight(), paint);
    paint.setARGB(255, 198, 200, 199)
    for (let i = 1 + 删行y; i < 100 + 删行y; i++) {
        if (i > dm.length - 1) {
            break;
        }
        //画行号
        canvas.drawText(i, 10, 画布y + i * 70, paint);
    }
}

function 画光标(canvas) {
    if (行号 + 1 > dm.length) {
        return
    }
    if (光标坐标[0] < 160) {
        return
    }
    paint1.setARGB(255, 198, 200, 199)
    //画光标
    if (光标时间 > 14) {
        canvas.drawLine(光标坐标[0], 画布y + 光标坐标[1] - 40, 光标坐标[0], 画布y + 光标坐标[1] + 5, paint1);
        if (光标时间 == 28) {
            光标时间 = 0
        }
    }
    光标时间++
    //选择行颜色
    paint.setARGB(50, 255, 255, 255)
    canvas.drawRect(0, 画布y + 光标坐标[1] - 60, 3000, 画布y + 光标坐标[1] + 10, paint);
}

function 计算横行光标() {
    if (行号 > dm.length) {
        return
    }
    删位x = Math.floor(Math.abs(画布x - 160))
    let 横行 = 160
    for (let i = 0; i < dm[行号 - 1].length; i++) {
        if (分中英文(dm[行号 - 1][i])) {
            横行 += 50
        } else {
            横行 += 30
        }
        if (横行 > 删位x + 屏幕X) {

            if (分中英文(dm[行号 - 1][i])) {
                横行 -= 50
            } else {
                横行 -= 30
            }

            光标坐标[0] = 横行 - 删位x
            字位置 = i
            ui..setText(dm[行号 - 1][字位置])
            return
        }
    }

    字位置 = dm[行号 - 1].length
    光标坐标[0] = 横行 - 删位x
}
ui.写入.click(() => {
    let s = ui.输入框.text()
    if (!s) {
        return
    }
    画布开关 = false
    dmx = dm
    if (s.includes("\n")) {
        let 行数 = 行号 - 1
        if (行数 < 0) {
            行数 = 0
        }
        if (字位置) {
            前段 = dmx[行数].slice(0, 字位置)
        } else {
            前段 = ""
        }
        log(dmx[行数], 行数)
        //exit()
        let 内容 = 前段 + s + dmx[行数].slice(字位置)
        let 数组 = 内容.split("\n")
        log(dmx)
        for (let i = 0; i < 数组.length; i++) {
            dmx.splice(i + 行数, 0, 数组[i]);
        }
        dmx.splice(行数 + 数组.length, 1);
        log(dmx)
    } else {
        if (字位置) {
            前段 = dmx[行号 - 1].slice(0, 字位置)
        } else {
            前段 = ""
        }
        dmx[行号 - 1] = 前段 + s + dmx[行号 - 1].slice(字位置)
        for (var i = 0; i < s.length; i++) {
            if (分中英文(s[i])) {
                光标坐标[0] += 50
            } else {
                光标坐标[0] += 30
            }
        }
        字位置 += s.length
    }
    ui.输入框.setText("")
    dm = dmx
    画布开关 = true
})
ui.删除.click(() => {
    let 长度 = dm[行号 - 1].length
    if (长度 == 1) {
        dm[行号 - 1] = ""
        字位置 = 0
        if (分中英文(dm[行号 - 1])) {
            光标坐标[0] -= 50
            //画布x+=50
        } else {
            光标坐标[0] -= 30
            //画布x+=30
        }
        return
    }
    if (字位置 > 0) {
        if (分中英文(dm[行号 - 1][字位置 - 1])) {
            光标坐标[0] -= 50
            //画布x+=50
        } else {
            光标坐标[0] -= 30
            //画布x+=30
        }
        dm[行号 - 1] = dm[行号 - 1].slice(0, 字位置 - 1) + dm[行号 - 1].slice(字位置)
        字位置--
    }

})

function 分中英文(c) {
    let ub = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM,.()/=,;{}[]<>-+|:_*%\\#$&!?^ " + "'" + '"'
    if (ub.includes(c)) {
        return false;
    }
    return true;

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值