Android自定义键盘(KeyboardView)

news2024/11/29 8:40:44

目录

  • 1.场景:
  • 2.想法:
  • 3.开始实现:
        • 《一》 在res包下创建xml目录,Keyboard标签来定义键盘布局:
        • 《二》创建IKeyboardView类并继承KeyboardView类,设置键盘布局(数字和字母)
        • 《三》 处理自定义键盘按键的点击事件以及预览,并实现数字和字母键盘(包括大小写)之间的切换
        • 《四》 绑定EditText,并且屏蔽系统键盘(实现点击切换绑定多个EditText)
        • 《五》. 使用
  • 4.KeyboardView,keyboard,Key,Row属性解释:
  • 5.完整代码
  • 6.注意事项
  • 6.结尾

1.场景:

项目中有定制的设备需要放在室外,用户使用时使用系统自带的键盘肯能没有那么方便,所以就需要使用到了自定义键盘

(结尾附上完整代码可以直接使用,不想看过程的可以直接跳过)

2.想法:

封装成一个比较通用的,当成一个View一样来使用


**实现自定义键盘思路:**
 1. 在res包下创建xml目录,Keyboard标签来定义键盘布局
 2. 创建IKeyboardView类并继承KeyboardView,设置键盘布局(数字和字母)
 3. 处理自定义键盘按键的点击事件以及预览,并实现数字和字母键盘(包括大小写)之间的切换
 4. 绑定EditText,并且屏蔽系统键盘(实现点击切换绑定多个EditText5. 使用

3.开始实现:

《一》 在res包下创建xml目录,Keyboard标签来定义键盘布局:

创建keyboard_num.xml文件(数字键盘布局)

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:keyHeight="7%p"
    android:horizontalGap="0.0px"
    android:verticalGap="0.0px">
    <Row android:verticalGap="1%p">
        <Key
            android:codes="113"
            android:keyLabel="q"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="119"
            android:keyLabel="w"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="101"
            android:keyLabel="e"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="114"
            android:keyLabel="r"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="116"
            android:keyLabel="t"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="121"
            android:keyLabel="y"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="117"
            android:keyLabel="y"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="105"
            android:keyLabel="i"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="111"
            android:keyLabel="o"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="112"
            android:keyLabel="p"
            android:horizontalGap="1.81%p">

        </Key>
    </Row>
    <Row android:verticalGap="1%p">
        <Key
            android:codes="97"
            android:keyLabel="a"
            android:keyWidth="9%p"
            android:horizontalGap="5.5%p">

        </Key>
        <Key
            android:codes="115"
            android:keyLabel="s"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="100"
            android:keyLabel="d"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="102"
            android:keyLabel="f"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="103"
            android:keyLabel="g"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="104"
            android:keyLabel="h"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="106"
            android:keyLabel="j"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="107"
            android:keyLabel="k"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="108"
            android:keyLabel="l"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
    </Row>
    <Row android:verticalGap="1%p">
        <Key
            android:codes="-1"
            android:keyLabel="大写"
            android:keyWidth="17%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="122"
            android:keyLabel="z"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="120"
            android:keyLabel="x"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="99"
            android:keyLabel="c"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="118"
            android:keyLabel="v"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="98"
            android:keyLabel="b"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="110"
            android:keyLabel="n"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="109"
            android:keyLabel="m"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="-5"
            android:isRepeatable="true"
            android:keyWidth="17%p"
            android:horizontalGap="1%p">

        </Key>
    </Row>
    <Row>
        <Key
            android:codes="-2"
            android:keyLabel="123"
            android:keyWidth="20%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="32"
            android:keyLabel="space"
            android:keyWidth="48%p"
            android:horizontalGap="5%p">

        </Key>
        <Key
            android:codes="-4"
            android:keyLabel="完成"
            android:keyWidth="20%p"
            android:horizontalGap="5%p">

        </Key>
    </Row>
</Keyboard>

创建keyboard_letter.xml文件(字母键盘布局)

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:keyHeight="7%p"
    android:horizontalGap="0.0px"
    android:verticalGap="0.0px">
    <Row android:verticalGap="1%p">
        <Key
            android:codes="113"
            android:keyLabel="q"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="119"
            android:keyLabel="w"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="101"
            android:keyLabel="e"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="114"
            android:keyLabel="r"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="116"
            android:keyLabel="t"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="121"
            android:keyLabel="y"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="117"
            android:keyLabel="y"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="105"
            android:keyLabel="i"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="111"
            android:keyLabel="o"
            android:horizontalGap="1.81%p">

        </Key>
        <Key
            android:codes="112"
            android:keyLabel="p"
            android:horizontalGap="1.81%p">

        </Key>
    </Row>
    <Row android:verticalGap="1%p">
        <Key
            android:codes="97"
            android:keyLabel="a"
            android:keyWidth="9%p"
            android:horizontalGap="5.5%p">

        </Key>
        <Key
            android:codes="115"
            android:keyLabel="s"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="100"
            android:keyLabel="d"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="102"
            android:keyLabel="f"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="103"
            android:keyLabel="g"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="104"
            android:keyLabel="h"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="106"
            android:keyLabel="j"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="107"
            android:keyLabel="k"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="108"
            android:keyLabel="l"
            android:keyWidth="9%p"
            android:horizontalGap="1%p">

        </Key>
    </Row>
    <Row android:verticalGap="1%p">
        <Key
            android:codes="-1"
            android:keyLabel="大写"
            android:keyWidth="17%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="122"
            android:keyLabel="z"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="120"
            android:keyLabel="x"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="99"
            android:keyLabel="c"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="118"
            android:keyLabel="v"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="98"
            android:keyLabel="b"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="110"
            android:keyLabel="n"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="109"
            android:keyLabel="m"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="-5"
            android:isRepeatable="true"
            android:keyWidth="17%p"
            android:horizontalGap="1%p">

        </Key>
    </Row>
    <Row>
        <Key
            android:codes="-2"
            android:keyLabel="123"
            android:keyWidth="20%p"
            android:horizontalGap="1%p">

        </Key>
        <Key
            android:codes="32"
            android:keyLabel="space"
            android:keyWidth="48%p"
            android:horizontalGap="5%p">

        </Key>
        <Key
            android:codes="-4"
            android:keyLabel="完成"
            android:keyWidth="20%p"
            android:horizontalGap="5%p">

        </Key>
    </Row>
</Keyboard>

《二》创建IKeyboardView类并继承KeyboardView类,设置键盘布局(数字和字母)

public class IKeyBoardView extends KeyboardView implements KeyboardView.OnKeyboardActionListener {

    public IIKeyBoardView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public IKeyBoardView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public IIKeyBoardView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    /**
     * 数字键盘
     */
    private Keyboard keyboardNumber;
    /**
     * 字母键盘
     */
    private Keyboard keyboardLetter;
    //绑定的输入框
    private EditText mEditText;

    /**
     * 是否发生键盘切换
     */
    private boolean changeLetter = false;

    /**
     * 是否为大写
     */
    private boolean isCapital = false;
     private List<Integer> noLists = new ArrayList<>();


    private int[] arrays = new int[]{Keyboard.KEYCODE_SHIFT, Keyboard.KEYCODE_MODE_CHANGE,
            Keyboard.KEYCODE_CANCEL, Keyboard.KEYCODE_DONE, Keyboard.KEYCODE_DELETE,
            Keyboard.KEYCODE_ALT, 32};

    //初始化
    private void init(){
        keyboardNumber = new Keyboard(getContext(), R.xml.keyboard_num);
        keyboardLetter = new Keyboard(getContext(), R.xml.keyboard_letter);
        //设置一些不需要预览的键位
        for (int i = 0; i < arrays.length; i++) {
            noLists.add(arrays[i]);
        }
        //默认使用数字键盘
        setKeyboard(keyboardNumber);
        //是否启用预览
        setPreviewEnabled(true);
        //键盘动作监听
        setOnKeyboardActionListener(this);
    }

    @Override
    public void onPress(int primaryCode) {

    }

    @Override
    public void onRelease(int primaryCode) {

    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {

    }

    @Override
    public void onText(CharSequence text) {

    }

    @Override
    public void swipeLeft() {

    }

    @Override
    public void swipeRight() {

    }

    @Override
    public void swipeDown() {

    }

    @Override
    public void swipeUp() {

    }
}

《三》 处理自定义键盘按键的点击事件以及预览,并实现数字和字母键盘(包括大小写)之间的切换

核心代码onKey方法(设置键盘输入)

//在onKey回调中的代码
Editable editable = mEditText.getText();
        int start = mEditText.getSelectionStart();
        switch (primaryCode) {
            case Keyboard.KEYCODE_DELETE://删除
                if (editable != null && editable.length() > 0 && start > 0) {
                    editable.delete(start - 1, start);
                }
                break;
            case Keyboard.KEYCODE_MODE_CHANGE://字母键盘与数字键盘切换
                    changeKeyBoard(!changeLetter);
                break;
            case Keyboard.KEYCODE_DONE://完成
                changeKeyBoard(!changeLetter);
                break;
            case Keyboard.KEYCODE_SHIFT://大小写切换
                changeCapital(!isCapital);
                setKeyboard(keyboardLetter);
                break;
            default:
                    editable.insert(start, Character.toString((char) primaryCode));
                break;
        }

还有几个必要的方法附上

	/**
     * 切换键盘大小写
     */
    private void changeCapital(boolean b) {
            isCapital = b;
            List<Keyboard.Key> lists = keyboardLetter.getKeys();
            for (Keyboard.Key key : lists) {
                if (key.label != null && isKey(key.label.toString())) {
                    if (isCapital) {
                        key.label = key.label.toString().toUpperCase();
                        key.codes[0] = key.codes[0] - 32;
                    } else {
                        key.label = key.label.toString().toLowerCase();
                        key.codes[0] = key.codes[0] + 32;
                    }
                } else if (key.label != null && key.label.toString().equals("小写")) {
                    key.label = "大写";
                } else if (key.label != null && key.label.toString().equals("大写")) {
                    key.label = "小写";
                }
            }
    }

 	/**
     * 判断此key是否正确,且存在 * * @param key * @return
     */
    private boolean isKey(String key) {
        String lowercase = "abcdefghijklmnopqrstuvwxyz";
        if (lowercase.indexOf(key.toLowerCase()) > -1) {
            return true;
        }
        return false;
    }

	/**
     * 切换键盘类型
     */
    private void changeKeyBoard(boolean b) {
        changeLetter = b;
        if (b) {
            setKeyboard(keyboardLetter);
        } else {
            setKeyboard(keyboardNumber);
        }
    }

/**
     * 判断是否需要预览Key
     *
     * @param primaryCode keyCode
     */
    private void canShowPreview(int primaryCode) {
        if (noLists.contains(primaryCode)) {
            setPreviewEnabled(false);
        } else {
            setPreviewEnabled(true);
        }
    }

	//设置需要绑定的EditView
	public void setmEditText(EditText mEditText) {
        this.mEditText = mEditText;
    }

《四》 绑定EditText,并且屏蔽系统键盘(实现点击切换绑定多个EditText)

这块我屏蔽键盘的方式是比较粗暴的,直接在EditTextView当中设置了屏蔽焦点,这样的同时会让EditTextView丢失光标

public class IEditText extends AppCompatEditText {
    private IKeyboardView mIKeyboardView;
    public IEditText(@NonNull Context context) {
        super(context);
        init();
    }

    public IEditText(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public IEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setInputType(InputType.TYPE_NULL);
    }

    //绑定键盘
    public void setmIKeyboardView(IKeyboardView mIKeyboardView) {
        this.mIKeyboardView = mIKeyboardView;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //按下时绑定当前的EditText
        if (event.getAction() == MotionEvent.ACTION_DOWN){
            if (mIKeyboardView!=null){
                mIKeyboardView.setEditText(this);
            }
        }
        return super.onTouchEvent(event);
    }
    
}

《五》. 使用

例如:两个EditTextView一个自定义键盘,因为太简单我就不放出布局代码了(占位置) 就看看咱是如何绑定的

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity:";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);


        //默认绑定一个EditTextView
        binding.viewKeyboard.setEditText(binding.ed1);
        //点击时切换绑定键盘
        binding.ed1.setmIKeyboardView(binding.viewKeyboard);
        binding.ed2.setmIKeyboardView(binding.viewKeyboard);
    }

}

4.KeyboardView,keyboard,Key,Row属性解释:

  • Keyboard
    在这里插入图片描述
  • Row
    在这里插入图片描述
  • Key
    在这里插入图片描述
  • KeyboardView
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/1e5efd3bbb8248af91cf6beb1ab6b913.png

5.完整代码

https://gitee.com/li-weihao1010/keyboard

6.注意事项

在清单文件(AndroidManifest.xml)中,
activity标签下面不要使用该属性
android:hardwareAccelerated=“true”
不然会导致你键盘卡顿以及点击事件错位问题

6.结尾

如果大家觉得有哪里写得有问题,可以告诉我,一起学习
参考链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11:列表初始化、新增关键字和新增的默认成员函数

目录 一. 列表初始化 1.1 {}列表初始化的方法 1.2 列表初始化实现的原理 二. C11新增关键字 2.1 decltype -- 自动类型推断 2.2 nullptr -- 空指针 2.3 default -- 强制生成默认成员函数 2.4 delete -- 禁止生成默认成员函数 2.5 final -- 禁止类被继承/禁止虚函数被重…

自动化测试之PageObject设计模式

译文如下&#xff1a; PageObject 当您针对网页编写测试时&#xff0c;您需要参考该网页中的元素以单击链接并确定显示的内容。但是&#xff0c;如果您编写直接操作 HTML 元素的测试用例&#xff0c;则您的测试将无法应对 UI 中的频繁修改。PageObject对应于一个HTML网页、页…

5月26号软件资讯更新合集......

Windows Terminal 1.18 新功能预览&#xff1a;标签拖拽、上下文菜单... Windows Terminal 预览版已更新到 1.18 版本&#xff0c;带来多项实用内容&#xff0c;一起来看看这个版本的新东西&#xff1a; 标签撕裂&#xff08;拖拽功能&#xff09; Windows Terminal 已支持对…

安装Redis6

安装Redis 安装redis依赖 redis是基于C语言编写的&#xff0c;因此首选需要安装redis所需的gcc依赖 yum install -y gcc tcl 上传安装包并解压 我安装的是redis-6.2.6版本&#xff0c;并且放到了/usr/local/src目录下 - 进入/usr/local/src目录shellcd /usr/local/src解压 tar …

全球最受欢迎低代码平台排行榜出炉

低代码平台正在成为寻求快速有效地构建应用程序的企业的首选解决方案。这些平台减少了编码要求&#xff0c;使企业能够在降低成本的同时更快地完成应用程序开发项目。在本文中&#xff0c;将探索全球受欢迎的低代码平台排行榜。 该排名使用的标准包括易用性、成本效益、集成性、…

很后悔,才发现这个API管理神器

想必大家都注意到了&#xff0c;近半年国产API管理工具火了起来。这说明两个问题&#xff0c;第一&#xff0c;API管理的重要性被越来越多的开发者认识到了&#xff0c;研发团队对API管理的需求也越来越强了。第二&#xff0c;说明国产软件真是越来越厉害了&#xff0c;大家确实…

《微服务实战》 第十八章 Redis查看配置文件和数据类型

前言 本章节讲解如何查看、修改Redis配置&#xff0c;介绍Redis类型。 1、查看配置 config get 配置名称 2、修改配置项 config set 配置项名称 配置项值 2.1、配置项说明 配置项参数说明daemonizeno/yes默认为 no&#xff0c;表示 Redis 不是以守护进程的方式运行&#xff…

论C站如何获得铁粉?过来人给出几点建议

哈喽&#xff0c;我是bug菌&#xff0c;一名想走&#x1f463;出大山改变命运的程序猿。周五啦&#xff0c;刚肝完需求的我&#xff0c;闲暇之时逛C站热榜&#xff0c;偶然刷到一条看到官方抛出的话题&#xff1a;"在C站如何获得铁粉&#xff1f;"&#xff0c;我寻思…

操作系统第五章——输入输出管理(上)

提示&#xff1a;初入红尘&#xff0c;不知人间疾苦&#xff0c;蓦然回首&#xff0c;已是苦中之人&#xff0c;这杯中酒三分&#xff0c;这酒中悲七分。关关难过关关过&#xff0c;夜夜难熬夜夜熬&#xff0c;愿这人世间所有爱恨情仇皆溶于酒&#xff0c;且将这红尘做酒&#…

MP4如何让去水印?python带你实现~

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 开发环境: 解释器版本: python 3.8 代码编辑器: pycharm 2021.2 模块使用: 内置模块&#xff08;无需安装&#xff09; os —> python系统编程的操作模块,提供了非常丰富的功能去处理文件和目录 sys —> 是与…

我是00后,我卷一点怎么了?

前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff0c;所以…

手动创建django项目和python虚拟环境

在使用pycharm创建django项目的时候&#xff0c;报错如下&#xff1a; C:\Users\12051\AppData\Local\Temp\tmplkz609ucpycharm-management\setuptools-40.8.0\setup.py install Traceback (most recent call last):File "C:\Users\12051\AppData\Local\Temp\tmpqphl…

合并两个有序链表(java)

leetcode 21题&#xff1a;合并两个有序链表 题目描述解题思路&#xff1a;链表的其它题型。 题目描述 leetcode21题&#xff1a;合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&…

IO多路转接

目录 一、select 1.1 select初识 1.2 select函数 1.3 scoket就绪条件 1.4 select基本工作流程 1.5 select服务器 1.6 select的优点 1.7 select的缺点 1.8 select的适用场景 二、poll 2.1 poll函数 2.2 poll服务器 2.3 poll的优点 && 缺点 三、epoll 3.1…

设备快线客户端软件V1.0用户手册

1.前言欢迎使用设备快线客户端软件产品。设备快线客户端软件简称DYClient,DYClient客户端是东用科技有限公司推出的一款用于远程维护的控制软件&#xff0c;主要为客户远程访问现场终端设备提供便捷的接入服务&#xff0c;并且通过DYClient客户端软件用户可以非常方便快捷的访问…

ChatGPT和软件测试实践与思考

前言 关于最近大火的ChatGPT相信各位也听过不同渠道听说过他的厉害&#xff0c;目前发展趋势比较火热&#xff0c;科技公司都有在考虑怎么使用ChatGPT进行提高研发效率以及办公效率&#xff0c;最近我所在的公司也有在要求大家使用ChatGPT进行改善工作效率&#xff0c;所以引发…

支持导入 Eolink 插件,别小看这个开源 API 管理工具了

Postcat 有多达 30 款支持数据迁移、主题、API 安全等方面的插件。 导入 Eolink 插件。 使用 导入功能有多个入口&#xff0c;你可以在 API 分组处点击加号导入 API&#xff1a; 也可以换种方式&#xff0c;在首页里导入Eolink 如果你日常会用到 api 管理工具的话&#xff0c…

【九章斩题录】C/C++:二维数组中的查找(JZ4)

精品题解 &#x1f449; 《九章刷题录》 &#x1f4dc; 目录&#xff1a; 「 法一 」暴力美学 「 法二 」十字分割法 「 法三 」逐行二分 JZ4 - 二维数组中的查找 &#x1f4da; 题目描述&#xff1a;在一个二维数组 array 中&#xff08;每个一维数组的长度相同&#xff…

[时间同步] vscode chatGPT提供的程序打包封装成api解决方案怎么样

背景 在完成gnss时间同步程序大部分需求串口配置、串口数据中找出推荐定位信息RMC解析UTC时间以及UTC时间更新系统时间等功能后&#xff0c;有个需求比较特别&#xff0c;需要客户来操作。当车辆在地库场景待时间过久后重新回到地面&#xff0c;一直在自走的系统时间与又定位好…

Three.js--》探索Three.js:学习和就业的完整指南

目录 three.js的学习建议 WebGL前端工程师工作待遇相关问题 本篇文章主要给大家介绍一下如何学习Web3D可视化&#xff0c;具体说就是怎么学习WebGL、Three.js、3D建模等。 three.js的学习建议 在过去互联网是人联网的时代&#xff0c;开发人和人之间的联系的Web应用&#x…