精华内容
下载资源
问答
  • axure制作的模仿手机键盘输入的原型,仅供参考
  • 电脑键盘怎么连接手机导语:移动电话,或称为无线电话,通常称为手机,原本只是一种通讯工具,早期又有大哥大的俗称,是可以在较广范围内使用的便携式电话终端,最早是由美国贝尔实验室在1940年制造的战地移动电话机...

    电脑键盘怎么连接手机

    导语:移动电话,或称为无线电话,通常称为手机,原本只是一种通讯工具,早期又有大哥大的俗称,是可以在较广范围内使用的便携式电话终端,最早是由美国贝尔实验室在1940年制造的战地移动电话机发展而来。那么,电脑键盘怎么连接手机呢?一起来看看吧!

    d4288b125aded8fe265b3d82d5555691.png

    电脑键盘怎么连接手机

    工具:

    手机 otg线 鼠标 键盘 U盘

    步骤:

    1、首先,确保智能手机有OTG功能,OTG是On-The-Go的意思,是近年发展起来的'技术,主要应用于各种不同的设备或移动设备间的联接,进行数据交换。特别是便携式移动设备、移动电话、消费类设备。手机的OTG功能可以实现外接鼠标、键盘和U盘的功能。

    2、现在来看看怎么连接吧,以小米2S手机为例,需要一根适用于该手机的OTG线,线的一端可以插到手机上,另一端可以连接其他设备。

    3、连接鼠标到手机,注意初次使用一定要先将无线鼠标接收器或有限鼠标USB插入到otg线上,再连接到手机上,防止可能初次识别不到。等识别后,界面上会出现箭头。

    4、鼠标键的使用,鼠标键跟手机上的功能键对应,左键单击为选中状态,可以出现选择对话框;双击鼠标滚轮为手机上的Home键,返回到初始界面;单击鼠标右键为返回键,按中滚轮左右拖动可进行界面的切换,

    5、学会了鼠标的使用,可以再连接键盘试一试,连接到键盘后,会出现选择输入法和选择键盘布局,选择一种输入法,并选择键盘布局。

    6、选择键盘布局的时候,会出现连接键盘的型号,以所使用的这款键盘为例,单击键盘。

    7、单击键盘后,选择一种键盘布局,如常见的US,可以根据自己使用的语言情况来选择。

    9、现在就可以写短信息看看了,非常方便使用,打字速度很快,这对写word 制作PPT是很有帮助的。

    10、除了连接鼠标和键盘,还可以连接U盘,将U盘插入上后,会显示USB存储设备已连接,单击该对话框,单击左上角存储设备的下拉箭头,就出现了USB存储器,就可查看上面的内容了。

    11、通过这根otg线,就可以把一个手机变成一个PC了,可以试试哦。

    【电脑键盘怎么连接手机】相关文章:

    展开全文
  • layui手机车牌号码键盘代码是一款基于jQuery跟layui制作手机端车牌号码输入弹出键盘选择,支持新能源汽车车牌输入格式代码。
  • jQuery移动端手机键盘输入车牌号代码基于jquery.1.7.1.min.js制作,模拟手机键盘输入各省市的车牌号,写的粗糙,更多地方可进一步优化精简。
  • jQuery移动端手机键盘输入车牌号代码基于jquery.1.7.1.min.js制作,模拟手机键盘输入各省市的车牌号,写的粗糙,更多地方可进一步优化精简。
  • layui手机车牌号码键盘代码是一款基于jQuery跟layui制作手机端车牌号码输入弹出键盘选择,支持新能源汽车车牌输入格式代码。
  • 基于Windows CE的7×3手机键盘驱动实现、电子技术,开发板制作交流
  • Android制作拨号键盘

    2017-09-14 18:37:21
    Android编程实现的一个拨号的功能,里面有手机类似的拨号键盘,能够打开联系人列表,能够实现基本的数字拨号,能够拨打电话。
  • 不想用手机自带的数字键盘制作一个符合自己要求的数字键盘只能输入小数点后2位,样式可根据自身的需要进行调试。
  • 从0开始制作机械键盘

    千次阅读 2016-09-26 23:49:33
    机械键盘,造轮子,还是造键盘? 是的,没错,我要重新开始造轮子。 最开始萌生此想法的原因是想把一个USB接口的键盘改造成蓝牙键盘(别问我为什么不直接买一个)。想改的前提有两个:一是笔者用的是笔记本,...

    机械键盘,造轮子,还是造键盘?

     

    是的,没错,我要重新开始造轮子。

    最开始萌生此想法的原因是想把一个USB接口的键盘改造成蓝牙键盘(别问我为什么不直接买一个)。想改的前提有两个:一是笔者用的是笔记本,总会碰到USB接口不够用的尴尬局面;二是笔者之前从事蓝牙设备的开发工作,具备将键盘改造成蓝牙接口的能力。

    后来由于种种原因,想法被搁置了。正好最近有个朋友有需求要做一个键盘的转接板,是直接从原始的矩阵键盘接口转到USB接口,就是下面这货。

     

    好吧,离蓝牙接口还有段距离,不过能做成USB的,那就一定做成蓝牙的。

    言归正传,开始动手吧。

     

    一、硬件篇

    无非就是个矩阵键盘嘛,嗯,看一下这货的资料,14*8,好家伙,线挺多的,这是全尺寸键盘的节奏?不过IO口多还真不是问题,市面上MCU那么多,随便选就好了。找个易用的又带有USB接口的并且比较熟悉的,关键是手头上就有的,非stm32莫属了。

    后面仔细一看,发现实物和上图的FPC引脚数对不上 ==!,没办法了,总不能拆了键盘去看键码吧……先搭个线完成功能吧。

    STM32F103C8T6,引脚够用,成本够低,开发环境成熟,资源丰富。

    下面是最小系统板,万能的XX上有卖,10+可以搞定,还包邮。

    IO分配好,PA0-PA7作为列(COL)输入,配置为下拉输入,PB0-PB5作为行(ROW)输出,默认为推挽输出。USB为PA11、PA12,PA9、PA10分别为TX、RX作调试用。

    硬件就这么多了。

     

    二、软件篇

    软件才是让人头大的东西。

    1、搭建工程

    不过好在ST官方还算给力,做出了一个叫做STM32CubeMX的东西,简直是想快速搭建工程配置外设者的福音。

    打开STM32CubeMX,新建工程,stm32_usb_kb。

    之所以选择C8而不是C6版本,是因为市场上C8的出货量大,再就是因为开发时可以选容量稍大的产品,到后期程序完善了、优化了,可以量产时候去用的更低容量的IC节省成本。

    点OK确定,然后来配置外设。

    首先配置RCC,选择使用外部高速时钟。

    再配置SYS,主要使用SWD作为程序的下载和调试接口,不选JTAG的原因是JTAG要占用多个IO(主要是把我要用的PB口占用了)。Timebase Source选SysTick,会要用到计时功能 。

    然后配置串口,这里选择USART1,配置成异步模式。

    再配置USB,勾选框框,MiddleWares的USB选择Human Interface Description

    然后在芯片的引脚上配置我们需要用到的引脚,PA及PAB口,直接在IO口上单击即可选择需要的功能。

    配置好的界面如下所示:

    这时发现Clock Configuration选项卡上出现X,这是因为修改了时钟源造成的,点进去,会提示是否选择自动配置,当然选yes了。

    切换到配置页面,配置GPIO,可以统一进行配置。

    点OK完成配置,然后在Project菜单中选择Generate Code

    配置好工程名,选择好存放位置,选择好IDE,然后确定。

    至此,一个最基本的带有USB功能的支持矩阵键盘扫描的工程诞生了。

     

    2、测试矩阵扫描的基本功能

    a)首先初始化一下IO口,没啥好说的。

    void matrix_init(void)
    {
    GPIO_InitTypeDef GPIO_InitStruct;
    
    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
    |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
    |GPIO_PIN_15|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
    |GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
    
    /*Configure GPIO pins : PA0 PA1 PA2 PA3
    PA4 PA5 PA6 PA7 */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
    |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    /*Configure GPIO pins : PB0 PB1 PB2 PB10
    PB11 PB12 PB13 PB14
    PB15 PB3 PB4 PB5
    PB6 PB7 PB8 PB9 */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
    |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
    |GPIO_PIN_15|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
    |GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    }

     

     

    b)按键扫描函数

    uint16_t KS_ScanForKeyPress(uint8_t iActiveLine)
    {
    uint32_t outputRegister = ((uint32_t)1<< iActiveLine );
    GPIOB->ODR = outputRegister;
    uint32_t scannedInput = (GPIOA->IDR & 0x000000FF);
    return scannedInput;
    }
    
    uint8_t KS_PrintScanLines(void)
    {
    uint16_t scannedInput;
    uint8_t keyScans = 0;
    
    for(uint8_t i = 0; i < 16; ++i)
    {
    scannedInput = KS_ScanForKeyPress(i);
    if (scannedInput > 0)
    {
    // detected a key press
    printf("Key press detected at %d/0x%04X\n", (i+1), scannedInput);
    ++keyScans;
    }
    }
    return keyScans;
    }

    c)测试

    int main(void)
    {
    uint8_t scanCode;
    
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();
    
    /* Configure the system clock */
    SystemClock_Config();
    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_USB_DEVICE_Init();
    
    /* USER CODE BEGIN 2 */
    printf("Hello, STM kb!\r\n");
    
    /* Infinite loop */
    while (1)
    {
    HAL_Delay(10);
    scanCode = KS_PrintScanLines();
    }
    }

     

    用每一行的线分别接触每一列的线,测试矩阵。

     

    3、处理按键的逻辑

    a)按键冲突问题

    买键盘的时候,经常会听到全键无冲、六键无冲等关键字,尤其对喜欢玩游戏的朋友来说。关于其概念,想要了解的可以自行百度,在这里只需要要知道相邻两行两列矩阵上的三个键按下可能会出现另外一个未按下键的键值即可(针对是没在矩阵上做过处理的键盘来讲,加了二极管的键盘不在此列)。程序上要处理这种情况,当然,现在薄膜键盘的矩阵设计在一般的办公场景及大部分游戏场景很难会出现多键冲突的情况。

    b)组合键处理

    如按下ctrl键后又点击C(点击:点下去,然后立马释放)、按下Ctrl+alt+……等等。

    c)功能键Fn

    大多笔电按键较少,无法将常用的按键一次性布局,往往会提供Fn+其它键实现一些不能布下键的功能,为实现这种功能,程序上要实现多套键码,动态切换。

    d)……(一些未想到的)

     

    说了这么多,却没有敲半句代码实现。

    虽然说是造轮子,但不是说从制造材料开始,那是原始人才会做的事。

    我不是代码的生产者,而是代码的搬运工。

    要善于借鉴前人的经验。

     

    打开github,输入关键字“USB keyboard”,有一堆开源项目。反复查看代码,发现这家伙的比较适合移植,有很多Demo,平台近似,提交比较活跃,文档写得也比较清楚。

    很多DIY机械键盘的实现也可用上此工程。

    https://github.com/tmk/tmk_keyboard

    里面有几篇文档值得关注一下,可以详细了解整个程序的结构及框架的实现。

    及工程根目录下的README,通读好处多多。

     

    4、移植到M3平台,MDK开发环境

    这里不多说,只与各位看官提提几个要注意的地方。

    a)github的工程是用GNU写的,在Keil MDK ARM编译器环境下要设置--gnu的编译选项,要么你就自己修改代码,如匿名结构体。

    b)一些语法上的修改,如case Fn1...Fn9: 在ANSI C下是没有这种写法的,需要自行更改。其次是Keil下没有0b00001111这种表示方法。

    c)代码移植选择tmk_core文件夹的内容即可,里面有avr平台的实现,可以对照改为STM32的实现,主要是初始化,定时器,串口输出。

    d)参照keyboard/hbkb的代码,自行实现Matrix.c中的矩阵扫描部分,config.h文件中一些宏的开启等。宏的话,参照此文件下的设置即可,如果要实现更加高级的功能,看官自行研究。keymap.c矩阵的修改。

    e)需要实现host_driver_t驱动,主要是报告描述,此结构位于report.h文件下。

     

    贴一个我用到的代码目录:

    建议:串口输出一定要实现好,对调试有莫大的帮助。(可在debug.c文件中开启要调试的部分)

    5、测试

    键码还没搞到手,先用单独的按键替代测试。接了按键“1”与ctrl键,输出正常,连接电脑也能正常打字,试试组合键也还行。

    按下“1”

    按下ctrl+1

    三、总结篇

    看似常用且简单的东西还是是有一些技术含量在里面的。

    1、以前没有好好写过矩阵键盘的扫描代码,现在写过了并且记忆深刻了;

    2、了解了一些与编译器相关的关键字,如__attirbute__ (weak);

    3、KEIL MDK ARM下支持GNU语法编译方法:project->options->C/C++下,添加--gnu

    a)keil中不支持GNU中的匿名结构体,需要在结构体前添加#pragma anon_unions或者在编译选项中添加--gnu

    b)“--gnu”实际上是在ARMCC中加入支持GNU扩展格式,当然实际上Keil是可以添加GCC的编译器的,通过keil菜单中“Project > Manage > Components, Environment, Books..”添加,前提是你得提前装好GCC编译器。官方原文:http://www.keil.com/arm/gnu.asp

    4、Keil环境中,用memset()对结构体“清零”时要注意四字节对齐,否则会出错。可在定义结构体的末尾(;前面)添加__attirbute__ ((aligned(4))),如uint8_t EXTERN_DHCPBUF[1024] __attribute__((aligned(4)));

    5、移植过来的代码与平台结合性不强,可以移植大部分平台上去了,也可以采取各种通讯接口及协议。蓝牙键盘的改造过程有望了。

     

    四、拖拉篇

    本来前三节写好就要发的,结果一直没拿到键码,拖到现在,于是有了这一节。

    很早之前就想买一把机械键盘玩玩了,无奈要不就是价格太贵,要不就是按键手感不符合。

    正好有了之前的基础,倒是有机会做一把键盘了。

    一般的机械键盘组成部分:轴(关键),键帽,卫星轴,键盘PCBA,底壳,如果用的是3脚的轴还需要按键的固定钢板。

    轴的分类不多说(主要是我也说不清楚 ==!),看好介绍,然后买个试轴器自己感受,再决定上手什么轴。X宝上大把的。

    用习惯了笔记本,发现小键盘区用得并不多,再就是希望尽可能的节省成本吧,决定做60键的键盘,小巧,方便携带出去装B。自己做好配列,60键还是足够用的。

    GitHub上找找,结果有开源的PCB,但自己用的IC不一样,还是得改改。

    链接在此:https://github.com/komar007/gh60

    下载后发现是KiCAD格式的,找遍若干方法,还是没能将其转换为AD的格式。最终没办法,自己重新画矩阵,重新画封装。

    当然,不是傻傻的去弄。

    提供一方法:

    AD由Gerber反向生成PCB:

    1)新建CAM文件,分别导入gerber和drill文件;

    2)必要时调整一下Layer Order,Tables->Layers Order;

    3)关键:Tools->Netlist->Extract;

    4)File->Export->Export to PCB;

    5)网络表是重命名的网络表,可以从原理图重新导入网络表。

    至此,得到可供“使用”的PCB,仅仅是用于提取封装、外形尺寸及定位。

    对比原设计,我的设计添加了些自己的东西,如添加了灯的接口:

    • 为每一排按键添加了独立的灯控制电路,限于MCU只有四个PWM口,只好把最后两排接到同一个PWM口上。这样,便可独立控制每一排灯了。
    • 为CAPS Lock添加了单独的灯,可以知道当前Caps的状态。
    • 将Mini USB接口换成了更常用的插件Micro USB(现在安卓手机大行其道,Micro USB线还是更常见一些)。
    • 留出了矩阵及灯的接口,方便用其它平台打造键盘,比如蓝牙,wifi等等。

    3D预览的PCB:

    实物:

     

     

     

    做得比较着急,还是出了一些问题,比如丝印上漏了个W,少打一个孔,少一电阻等等小问题……

    目前PCB的功能还只是能打字,还没有把灯及固件升级的功能做上去,等闲一点的时候再买材料完善了。

    等完善好了我会将PCB、原理图及固件源代码放到CSDN或Github上,欢迎有需要的人士下载或提出宝贵的建议~

     

     

     

    PS:本人踩过的坑也全部在本文写明,绝不藏私。如果真有愿意动手的朋友,相信也会迎难而上的。

    展开全文
  • 原生js制作虚拟键盘

    千次阅读 2017-10-19 16:42:32
    今天想起来群友说过之前面试支付宝遇到的一个面试题:问有没有封装过虚拟键盘。 就动手自己写个玩玩儿~原生js完成的,没有做兼容。 要注意的地方就是: * 字符实体和字符,innerHTML和innerText的区别 * 原生...

    版权声明:此文首发于我的个人站原生js制作虚拟键盘,转载请注明出处。

    今天想起来群友说过之前面试支付宝遇到的一个面试题:问有没有封装过虚拟键盘。
    就动手自己写个玩玩儿~

    原生js完成的,没有做兼容。
    要注意的地方就是:
    * 字符实体和字符,innerHTML和innerText的区别
    * 原生方法写$的addClass和removeClass

    效果如下图。
    虚拟键盘

    下面上代码:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" >
        <title>虚拟键盘</title>
        <style>
            #inputArea{position: absolute; top: 30%; left: 20%;}
            .keyboardBox{position: fixed; top: 50%; left: 20%; width: 708px; height: 256px; margin: 0; padding: 10px; background-color: #ccc; font-size: 16px;}
            .line{position: relative; height: 50px; line-height: 50px;}
            .keys, .keysCmd, .keys_d{box-sizing: border-box; float: left; width: 45px; height: 45px; line-height: 45px; margin: 0 0 3px 3px; border-radius: 4px; border: 1px solid #333; text-align: center; cursor: pointer; background-color: #fff;}
            .keys:hover, .keysCmd:hover, .keys_d:hover{box-shadow: 0px 0px 3px #333 inset;}
            .keys:active, .keysCmd:active, .keys_d:active{background-color: #dedede;}
            .active{background-color: #dedede; box-shadow: 0px 0px 3px #333 inset;}
            .keys_d{height: 45px; line-height: 20px;}
            .key_enter{width: 102px;}
            .k-w-50{width: 50px;}
            .k-w-70{width: 70px;}
            .k-w-75{width: 75px;}
            .k-w-80{width: 80px;}
            .k-w-100{width: 100px;}
            .k-w-120{width: 120px;}
            .k-w-704{width: 704px;}
            .gap{margin-left: 30px;}
            .gap_t{margin-top: 10px;}
            .line .l-h-40{line-height: 40px;}
            .f-s-14{font-size: 14px;}
            .t-a-l{padding-left: 15px; text-align: left;}
        </style>
    </head>
    <body>
    <textarea name="inputArea" id="inputArea" cols="80" rows="10" placeholder="点击虚拟键盘输入"></textarea>
    
    <div class="keyboardBox" id="keyboard">
        <div class="line gap_t">
            <div class="keys_d t-a-l" data-kid="192"><div>~</div><div>`</div></div>
            <div class="keys_d t-a-l" data-kid="49"><div>!</div><div>1</div></div>
            <div class="keys_d t-a-l" data-kid="50"><div>@</div><div>2</div></div>
            <div class="keys_d t-a-l" data-kid="51"><div>#</div><div>3</div></div>
            <div class="keys_d t-a-l" data-kid="52"><div>$</div><div>4</div></div>
            <div class="keys_d t-a-l" data-kid="53"><div>%</div><div>5</div></div>
            <div class="keys_d t-a-l" data-kid="54"><div>^</div><div>6</div></div>
            <div class="keys_d t-a-l" data-kid="55"><div>&amp;</div><div>7</div></div>
            <div class="keys_d t-a-l" data-kid="56"><div>*</div><div>8</div></div>
            <div class="keys_d t-a-l" data-kid="57"><div>(</div><div>9</div></div>
            <div class="keys_d t-a-l" data-kid="48"><div>)</div><div>0</div></div>
            <div class="keys_d t-a-l" data-kid="189"><div>_</div><div>-</div></div>
            <div class="keys_d t-a-l" data-kid="187"><div>+</div><div>=</div></div>
            <div class="keysCmd k-w-80 l-h-40 f-s-14" data-kid="8">Backspace</div>
        </div>
        <div class="line">
            <div class="keysCmd k-w-50" data-kid="9">Tab</div>
            <div class="keys" data-kid="81">Q</div>
            <div class="keys" data-kid="87">W</div>
            <div class="keys" data-kid="69">E</div>
            <div class="keys" data-kid="82">R</div>
            <div class="keys" data-kid="84">T</div>
            <div class="keys" data-kid="89">Y</div>
            <div class="keys" data-kid="85">U</div>
            <div class="keys" data-kid="73">I</div>
            <div class="keys" data-kid="79">O</div>
            <div class="keys" data-kid="80">P</div>
            <div class="keys_d t-a-l" data-kid="219"><div>{</div><div>[</div></div>
            <div class="keys_d t-a-l" data-kid="221"><div>}</div><div>]</div></div>
            <div class="keys_d k-w-75 t-a-l" data-kid="220"><div>|</div><div>\</div></div>
        </div>
        <div class="line">
            <div class="keysCmd k-w-70 f-s-14" data-kid="20">CapsLock</div>
            <div class="keys" data-kid="65">A</div>
            <div class="keys" data-kid="83">S</div>
            <div class="keys" data-kid="68">D</div>
            <div class="keys" data-kid="70">F</div>
            <div class="keys" data-kid="71">G</div>
            <div class="keys" data-kid="72">H</div>
            <div class="keys" data-kid="74">J</div>
            <div class="keys" data-kid="75">K</div>
            <div class="keys" data-kid="76">L</div>
            <div class="keys_d t-a-l" data-kid="186"><div>:</div><div>;</div></div>
            <div class="keys_d t-a-l" data-kid="222"><div>"</div><div>'</div></div>
            <div class="keysCmd key_enter" data-kid="13">Enter</div>
        </div>
        <div class="line">
            <div class="keysCmd k-w-100" data-kid="16">Shift</div>
            <div class="keys" data-kid="90">Z</div>
            <div class="keys" data-kid="88">X</div>
            <div class="keys" data-kid="67">C</div>
            <div class="keys" data-kid="86">V</div>
            <div class="keys" data-kid="66">B</div>
            <div class="keys" data-kid="78">N</div>
            <div class="keys" data-kid="77">M</div>
            <div class="keys_d t-a-l" data-kid="188"><div><</div><div>,</div></div>
            <div class="keys_d t-a-l" data-kid="190"><div>></div><div>.</div></div>
            <div class="keys_d t-a-l" data-kid="191"><div>?</div><div>/</div></div>
            <div class="keysCmd k-w-120" data-kid="16">Shift</div>
        </div>
        <div class="line">
            <div class="keys k-w-704" data-kid="32">&nbsp;</div>
        </div>
    </div>
    <script type="text/javascript" src="keyboard.js"></script>
    <script>
    window.onload = function(){
        new keyboard().addKeyboard('inputArea');
    }
    </script>
    </body>
    </html>

    JS代码:

    //* keyboard.js
    
    var keyboard = (function(){
        var keyboardObj = document.getElementById('keyboard'), _inputID, _shiftStatus = false, _capsLock = false;
    
        // 显示虚拟键盘
        var _showKeyboard = function(){
            keyboardObj.style.display = 'block';
        }
        // 隐藏虚拟键盘
        var _hideKeyboard = function(){
            keyboardObj.style.display = 'none';
        }
    
        // 获取输入框的内容
        var _getInputContent = function(){
            var inputContent = document.getElementById(_inputID).innerText || document.getElementById(_inputID).textContent;
            return inputContent;
        }
        // 输入新内容
        var _inputNewContent = function(str){
            document.getElementById(_inputID).innerHTML = str;
        }
    
        // 添加classname
        function _addClass(obj, cls){
            var obj_class = obj.className,
            blank = obj_class != '' ? ' ' : '';
            var added = obj_class + blank + cls;
            obj.className = added;
    
        }
        // 删除classname
        function _removeClass(obj, cls){
            var obj_class = ' ' + obj.className + ' ';
            obj_class = obj_class.replace(/(\s+)/gi, ' ');
            var removed = obj_class.replace(' ' + cls + ' ', ' ');
            removed = removed.replace(/(^\s+)|(\s+$)/g, '');
            obj.className = removed;
        }
        // 为按钮添加active
        function _addActive(cls, keycode){
            var keys = document.getElementsByClassName(cls);
            for(var o of keys){
                if(o.getAttribute('data-kid') == keycode){
                    _addClass(o, 'active');
                }
            }
        }
        // 为按钮取消active
        function _removeActive(cls, keycode){
            var keys = document.getElementsByClassName(cls);
            for(var o of keys){
                if(o.getAttribute('data-kid') == keycode){
                    _removeClass(o, 'active');
                }
            }
        }
    
        // 添加shift状态
        var _addShift = function(){
            _addActive('keysCmd', 16);
            return _shiftStatus = true;
        }
        // 取消shift状态
        var _removeShift = function(){
            _removeActive('keysCmd', 16);
            return _shiftStatus = false;
        }
    
        // 添加CapsLock状态
        var _addCapsLock = function(){
            _addActive('keysCmd', 20);
            return _capsLock = true;
        }
        // 取消CapsLock状态
        var _removeCapsLock = function(){
            _removeActive('keysCmd', 20);
            return _capsLock = false;
        }
    
        // 给按钮绑定触发键盘事件的事件
        var _bindEvent = function(){
            // 字母按键
            var keys = keyboardObj.getElementsByClassName('keys');
            for(var o of keys){
                o.onclick = function(){
                    var strArr = _getInputContent().split('');
                    if(_shiftStatus){
                        _capsLock = !_capsLock;
                        _capsLock ? strArr.push(this.innerHTML.toUpperCase()) : strArr.push(this.innerHTML.toLowerCase());
                        _capsLock = !_capsLock;
                        _removeShift();
                    }
                    else{_capsLock ? strArr.push(this.innerHTML.toUpperCase()) : strArr.push(this.innerHTML.toLowerCase());}
                    _inputNewContent(strArr.join(''));
                }
            }
            // 数字及特殊符号按键
            var keys_d = document.getElementsByClassName('keys_d');
            for(var o of keys_d){
                o.onclick = function(){
                    var strArr = _getInputContent().split('');
                    var key1 = this.getElementsByTagName('div')[0].innerHTML;
                    var key2 = this.getElementsByTagName('div')[1].innerHTML;
                    if(_shiftStatus){
                        strArr.push(key1);
                        _removeShift();
                    }else{strArr.push(key2);}
                    _inputNewContent(strArr.join(''));
                }
            }
    
            // shift、capslock、enter、tab、backspace 按钮
            var keysCmd = document.getElementsByClassName('keysCmd');
            for(var o of keysCmd){
                o.onclick = function(){
                    var strArr = _getInputContent().split('');
                    var keyCode = this.getAttribute('data-kid');
                    if(keyCode == 8){
                        strArr.pop();
                        _inputNewContent(strArr.join(''));
                    }else if(keyCode == 9){
                        strArr.push('&nbsp;&nbsp;');
                        _inputNewContent(strArr.join(''));
                    }else if(keyCode == 13){
                        strArr.push('\n');
                        _inputNewContent(strArr.join(''));
                    }else if(keyCode == 16){
                        if(!_shiftStatus){_addShift();}else{_removeShift();}
                    }else if(keyCode == 20){
                        if(!_capsLock){_addCapsLock();}else{_removeCapsLock();}
                    }
                }
            }
        }
    
        var keyboard = function(){}
    
        // 输入框绑定键盘
        keyboard.prototype.addKeyboard = function(id){
            _inputID = id
            var inputObj = document.getElementById(id);
            inputObj.onclick = _showKeyboard();
            _bindEvent();
        }
    
        return keyboard;
    })()
    
    展开全文
  • 帮助您演示幻灯片的节点脚本,因此无需演示设备,只需访问网站即可部署和使用您的手机。 它仅适用于装有 Windows 和 NodeJS 的计算机(抱歉! )。 用法 将您的手机和用于演示的计算机连接到本地网络 (WiFi) 下载...
  • 由于来之前的老项目都是用的是原生键盘,有很多局限性,因为项目需要在微信公众号或者手机浏览器上,这些地方肯定不能用原生键盘,然后搞了花了点时间一个h5键盘,中途碰到了一些问题 1.采用什么加密方式,和后端...

    最近的项目都是做跟金融有关的,类似于理财 贷款 钱包等等吧!由于来之前的老项目都是用的是原生键盘,有很多局限性,因为项目需要在微信公众号或者手机浏览器上,这些地方肯定不能用原生键盘,然后搞了花了点时间一个h5键盘,中途碰到了一些问题

    1.采用什么加密方式,和后端协商了用RAS配合md5
    2.后端怎么给前端传递键盘值,然后传递什么样的加密结构数据给后端
    3.服务端部署服务单点还是集群,密码的失效时间
    讨论过后后端决定用采用图片库以动态的雪碧图方式把动态键盘数据给前端和图片密钥,并且把对应公钥传过来,前端通过接口获取到动态雪碧图通过js动态计算铺到键盘上,然后点击相应的键盘区域保存对应值最终整合成一个对象,通过RSA加密后传递给后台,生成最终的md5密码值给我,然后做其他接口交互操作,后续风控觉得还是不够安全,再次优化
    前端在做了一次数据处理

    前端之前是传递时对应键盘的数字,然后通过RAS加密传递给后台解密,修改成动态生成6个随机的offset

    然后一个一个赋值到对应的键盘上,一个坐标代表一个数字,每次输入值点击对应键盘就存储对应的坐标
    RAS前的数据结构(为啥有dataType这些值能,是因为考虑后续也可能出现字母键盘特殊字符等等,加了一些拓展字段

    RAS的加密结构数据是随机的偏移量和对应的点击的偏移量值

    RAS的那个加密串就不发了太长了。。。

    后端加密加强图片池加了图片密钥,一起通过图片发送过来pictureKey,而且密码雪碧图是有时间限制,接口调用报错限制,两种情况都是密码图片失效,需要再次获取新的

    期间还碰到前端的一些问题比如说用什么输入框,当时发懵用input发现手机原生键盘会弹出来,折腾了一会发现行不通,就写了个div css的模拟键盘,还有一些图片铺上去的兼容啊定位什么 ,最坑的是后面还加了一个新需求要可以重置密码需要输两次等等吧!踩了不少的坑,还少不了后端的配合。。。附上最终前端键盘代码,喜欢的点个赞,新手
    https://github.com/wxl035446/vue-h5-keyBoard.git

    后续在补上后端配置

     

    展开全文
  • 用js制作键盘

    千次阅读 2012-09-09 22:37:11
    软件盘 function ad(str) {  document.form1.p1.value = document.form1.p1.value + str; } 密码: 软件盘 a b c d e f g h i j k l m n o p q r s t u ...1 2 3 4 5
  • 本课程讲解用Unity实现游戏中常用的交互方法,包括键盘交互、鼠标交互,以及手机上的触摸交互和虚拟摇杆交互等,并且介绍了Unity发布Android应用所需配置。
  • 在微信小程序中做自己的数字键盘

    千次阅读 2020-01-31 10:30:00
    在微信小程序中做自己的数字键盘为什么要自制键盘?使用系统键盘带来的不便理想的自制键盘效果:怎样自制键盘键盘的效果 为什么要自制键盘? 我最近在开发一款微信小程序,现在需要用户输入一个数字。 使用系统...
  • 我们在制作网页时,如果使用了百分比,在安卓手机键盘弹出时会导致页面变形。比正常状态下的页面是长成这样的:   但是点击输入框弹出键盘时就变成了这个吊样:::   解决办法: $('body').height($('b....
  • 最近做项目,发现H5弹出数字键盘...所以必须自己制作一个假的弹出键盘,还要制作一个假的光标。 所以就花了1天时间写了一个完整的JS组件,里面用到了jquery. github地址如下: https://github.com/HiYuChen/CoolIn...
  • 下面是一系列文章, 讲怎么自己做一把蓝牙版的ergodone键盘. 背景 为什么要做这样一把键盘呢? 因为我是程序员, 也是vim的使用者, 现在在用的是mac系统, 更喜欢用键盘来进行一些操作, 不喜欢把手移动到鼠标上进行一些...
  • Android 自定义键盘 随机键盘

    千次阅读 2016-11-21 10:48:20
    之前上传的另外一个自定义键盘,并没有实现键盘弹出的时候,布局向上自动调整。(网络上所有的自定义键盘都没有添加自适应的功能,而且布局没这么好看,上一个例子资源链接为:...
  • 定制专属于自己的HHKB机械键盘

    万次阅读 2017-11-02 21:57:11
    源于一颗爱折腾的心——定制专属于自己的HHKB机械键盘,GH60简单入门教程本文只是博主的一时兴起,作为一个初次接触定制化键盘的小白,踩了许多的坑,于是就想留下点什么。我会从接触定制化键盘开始讲起,相信我那会...
  • 本章节是制作教程,教你连接硬件,烧录程序,然后你就拥有一部YY手机了。 关于程序的原理,请参考我上传的源码,源码中有详细的注释(基础功能相关的程序请参考书籍,如USART等资源的使用)。后续章节中,也会有关于...
  • 自制虚拟键盘Demo

    千次阅读 2017-02-22 16:58:37
    最近调用系统键盘的时候有些时候系统的键盘并不满足需求,所以做了个小Demo 先看一下效果: 看一下核心代码: #include "skeyboard.h" SKeyboard::SKeyboard(QWidget *parent) : QWidget(parent) { for...
  • 越来越多的软件或硬件是闭源的,我们很难自己去定制化专属自己个性的手机。这个也是本项目的实现意义所在。 首先,她是一个电话 尽可能的开源 能独立组装和修理 没有隐私问题 允许用Python编写自己的应用程序 ...
  • 欢迎来到YY手机制作教程。通过本教程,我将一步一步指导你制作一部YY手机,并且提供有详细注释的源代码供你参考。你将得到一部具有如下功能的手机: ·发送英文短信 ·打电话、接电话 ·发送邮件 ·拍照并作为附件...
  • 原文出处: Freebuf黑客与极客 对于那些工作时需要与许多组合键打交道的人(比如经常使用Photo...本期的DIY将为大家带来一款可编程键盘,其制作过程非常简单,有兴趣的小伙伴可以一试。 DIY材料及工具:
  • 移动端输入手机号文本框获取焦点后弹出数字键盘,而非拼音键。 1、html代码: 代码复制区: &lt;input type="tel" placeholder="请输入您注册的手机号!" maxlength="11" ...
  • 在通常情况下我们使用android手机或者平板连接外接键盘,默认的外接键盘映射值都是美式键盘,或者说是标准键盘,然而全世界并非只是用这一种键盘,在意大利,日本等国还拥有自己独特的键盘,因此就需要设置他们自己...
  • 自适应的自定义车牌号输入键盘, jQuery基于layui制作手机端车牌号码输入弹出键盘选择,支持新能源汽车车牌输入格式代码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,793
精华内容 5,517
关键字:

如何制作自己的手机键盘