首页 文章 精选 留言 我的

精选列表

搜索[视频封装],共10004篇文章
优秀的个人博客,低调大师

Android 扫码枪监听封装

一、参考 1、常用keycode 一、简述 1、设备:扫码枪其实相当于一个物理输入设备,如果软键盘打开的话能明显感觉到其内容在输入 2、问题: 2.1、不能扫出中文来(可能和扫码枪设备,配置有关系) 2.2、在光标放到输入框有软键盘弹出的时候,扫码出来的字符顺序是混乱的(估计和硬件有关系) 2.3、没有合适的监听扫码结果的api 三、解决 为了解决以上问题另加上实现各种业务,故而研究下,有这么几点: 1、一定需要一个EditText(充当扫码枪输入的容器) 2、有弹出软键盘的,扫码内容可能会顺序不对和乱码,需要关闭软键盘,内容正确 3、扫码出来后,一般扫码枪是有标识符结束的,一般是键盘上的 keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==KeyEvent.ACTION_DOWN 返回当前扫码内容 4、最后会有KeyEvent.KEYCODE_DPAD_DOWN,到其他view上去 5、还没能解决如何设置timeout问题,让接口提示扫码失败  ̄□ ̄|| 代码 /** * Created by wujn on 2018/4/19. * Version : v1.0 * Function: android hardware device - Scanner * * 扫码枪:相当于软键盘使用的 * 1、一定需要一个EditText(充当扫码枪输入的容器) * 2、有弹出软键盘的,扫码内容可能会顺序不对和乱码,需要关闭软键盘,内容正确 * 3、扫码出来后,一般扫码枪是有标识符结束的,一般是键盘上的 * keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==KeyEvent.ACTION_DOWN * 返回当前扫码内容 * 4、最后会有KeyEvent.KEYCODE_DPAD_DOWN,到其他view上去 * 5、还没能解决如何设置timeout问题,让接口提示扫码失败 */ public class Scanner { private Activity activity; public Scanner(Activity activity){ this.activity = activity; } /** * 显示的/隐藏的 EditText 获得光标,准备扫码 * */ public void scan(final EditText editText){ //获得光标 editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.requestFocus(); //关闭软键盘:防止顺序乱码 InputMethodManager manager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); //View focus = act.getCurrentFocus(); manager.hideSoftInputFromWindow( //focus == null ? null : focus.getWindowToken(), editText == null ? null : editText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); //增加软键盘监听,扫出来内容会自己填充到editText中去的 editText.setOnKeyListener(new View.OnKeyListener() { //on scan finish , last 3 KeyEvent log //keycode=66,event.getAction()=0 -> 66=KeyEvent.KEYCODE_ENTER=换行 , 1=KeyEvent.ACTION_DOWN=按下 //keycode=66,event.getAction()=1 -> 66=KeyEvent.KEYCODE_ENTER=换行 , 1=KeyEvent.ACTION_UP=抬起 //keycode=20,event.getAction()=0 -> 20=KeyEvent.KEYCODE_DPAD_DOWN=按键按下 , 1=KeyEvent.ACTION_DOWN=按下 @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //LogUtil.i("keycode="+keyCode+",event.getAction()="+event.getAction()); if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==KeyEvent.ACTION_DOWN){ onScanResultCallBack.OnScanSucccess(editText.getText().toString());//返回结果值,看需要使用了 return true; } return false; } }); } /** * 扫码枪接口:有timeout设置,当然光标移除的时候关闭计时 * 成功 返回扫码结果 * 失败 返回错误信息 * */ public interface OnScanResultCallBack{ public void OnScanSucccess(String result); public void OnScanFail(String errorMsg); } private OnScanResultCallBack onScanResultCallBack = new OnScanResultCallBack(){ @Override public void OnScanSucccess(String result) {} @Override public void OnScanFail(String errorMsg) {} }; /** * 子类实现回调函数 * */ public void setOnScanResultCallBack(Scanner.OnScanResultCallBack onScanResultCallBack) { if (onScanResultCallBack == null) throw new IllegalArgumentException("empty onScanResultCallBack"); this.onScanResultCallBack = onScanResultCallBack; } } 对实际业务其实根本不用扫出来的结果,结果是个url,需要访问后获得infobean才是最后有效的信息,这个业务可以用个0dp的EditText当做容器,扫出结果后返回到callback里,然后后续就xxx。 大家有好的方法做timeout么,是EditText获得光标后开始计时?万一客户就是不扫描呢?不用EditText行不行,随时随地可以扫描? 怎么搞啊!!没思路,蛋疼!!广大码友,有推荐的解决方案可以贴出来。  ̄へ ̄

优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的事件框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123753 // 事件框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 实现一个浏览器的基本事件的绑定 * @param type * @param fn * @return {on} */ on: function (type, fn) { // 注意这里的初始的下标编号是长度减一 var i = this.length - 1; // 可以实现兼容版本的IE浏览器和W3c浏览器的支持 if (document.addEventListener) { // w3c(这里使用的方式是从后向前遍历, 使得每一个DOM加载完毕之后再去添加事件) for (; i >= 0; i--) { this[i].addEventListener(type, fn, false); } } else if (document.attachEvent) { // IE for (; i >= 0; i--) { this[i].attachEvent('on' + type, fn); } } else { // 其他的浏览器 for (; i >= 0; i--) { // 获取json数据的两种方式,绑定事件的方式也可以 this[i]['on' + type] = fn; } } return this; }, /** * 实现事件的解除绑定 * @param type * @param fn * @return {un} */ un: function (type, fn) { // 注意这里的初始下标编号 var i = this.length - 1; if (document.removeEventListener) { // W3c for (; i >= 0; i--) { this[i].removeEventListener(type, fn, false); } } else if (document.detachEvent) { // IE浏览器 for (; i >= 0; i--) { this[i].detachEvent(type, fn); } } else { // 其他浏览器的话,就直接默认绑定的所有事件置为null for (; i >= 0; i--) { // 移出所有绑定的事件 this[i]['on' + type] = null; } } return this; }, /** * 实现单个元素的事件绑定 * @param fn * @return {click} */ click: function (fn) { this.on('click', fn); return this; }, /** * 实现鼠标移动进来和出去的事件响应(鼠标悬浮事件) * @param fnOver * @param fnOut * @return {hover} */ hover: function (fnOver, fnOut) { var i = this.length; // 还是采用的是从后向前遍历的方式 for (; i >= 0; i--) { if (fnOver && typeof fnOver === 'function') { this.on('mouseover', fnOver); } if (fnOut && typeof fnOut === 'function') { this.on('mouseout', fnOut); } } return this; }, /** * 如果被选元素可见,则隐藏这些元素,如果被选元素隐藏,则显示这些元素。 * toggle方法,切换,接收任意个参数,不断在参数间循环.例:点击显示隐藏 * @return {toggle} */ toggle: function () { // 实现一个事件的切换f1, f2 var self = this, _arguments = arguments, i = 0, len = this.length; // 把所有的事件响应函数存起来 for (; i < len; i++) { addToToggle(this[i]); } /** * 鼠标点击之后逐个调用自己绑定的事件 * @param obj */ function addToToggle(obj) { // 定义一个私有的计数器 var count = 0; // 添加事件 self.on('click', function () { // 使用call去修改this的指向(这里的主要作用是去切换,轮巡切换状态) _arguments[count++ % _arguments.length].call(obj); }); } return this; } }); // 不需要参与链式访问的 xframe.extend(xframe, { /** * 获取事件对象 * @param event * @return {Event} */ getEvent: function (event) { return event ? event : window.event; }, /** * 获取触发事件的元素 * @param event * @return {*|Element|Object} */ getTarget: function (event) { var event = this.getEvent(event); return event.target || event.srcElement; }, /** * 阻止事件冒泡 * @param event */ stopPropagation: function (event) { var event = this.getEvent(event); if (event.stopPropagation) { // W3c event.stopPropagation(); } else { // IE event.cancelBubble = true; } }, /** * 阻止默认的行为 * @param event */ preventDefault: function (event) { var event = this.getEvent(event); if (event.preventDefault) { // w3c event.preventDefault(); } else { // IE event.returnValue = false; } }, /** * 获取鼠标滚轮的运动的详细信息 * @param event * @return {*} */ getDelta: function (event) { var event = this.getEvent(event); if (event.wheelDelta) { // w3c return event.wheelDelta; } else { // ie // Firefox的值有所不同,因此首先要将这个值的符号反向,然后再乘以40,就可以保证与其它浏览器的值相同了 return -event.detail * 40; } } }); })(xframe);

优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的DOM框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123835 // DOM框架(选择器框架) (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 向现有的元素集合中添加元素节点(修改this的内容) * @param dom * @return {add} */ add: function (dom) { // 1. 项伪数组中添加元素 this[this.length] = dom; // 2. 数组的长度也需要改变了 this.length++; return this; }, /** * 向现有的元素节点中添加dom节点(对使用选择器获取的一系列元素都添加孩子节点child) * @param child,这里创建的实际上是一个JQuery对象 */ append: function (child) { // 这里获取的实际上就是只有一个的 var doms = typeof child === 'string' ? $(child) : $(child[0]), arr = Array.prototype.slice.call(doms); //console.log(typeof doms[0], typeof arr[0]); // 2. 调用自己的方法将一个伪数组转换为数组,并开始遍历 /*for (var i = 0; i < this.length; i++){ for (var j = 0; j < doms.length; j++){ // 注意这里的操作, 由于在每次添加一个新的元素之后, this的长度就会增加,因此这里在修改之前先把this.length修改一下 this[i].appendChild(doms[j]); } }*/ /*this.each(function (element) { arr.forEach(function (childNode) { element.appendChild(childNode); }); });*/ // 这里的处理目的是,如果穿过来的DOM节点只是有一个的话需要创建和this长度相同的DOM元素 if (arr.length !== this.length) { arr = []; // 相当于是把本身复制几份 Array.prototype.slice.call(this).each(function () { arr.push(doms[0]); }); } // 开始向父亲节点添加元素 Array.prototype.slice.call(this).forEach(function (element, index) { element.appendChild(arr[index]); }); // 开始向我获取的this节点里面添加数据 /*for (var i = 0; i < this.length; i++){ for (var j = 0; j < arr.length; j++){ if (this[i].childNodes){ continue; } // 注意这里的操作, 由于在每次添加一个新的元素之后, this的长度就会增加,因此这里在修改之前先把this.length修改一下 this[i].appendChild(arr[j]); } }*/ }, /** * 把选择器中的节点添加到父容器中 * @param parent */ appendTo: function (parent) { // 1. 获取所有的父容器 var doms = $(parent), self = this; // 2. 向父容器中添加孩子节点 Array.prototype.slice.call(this).forEach(function (element, index) { doms[index].appendChild(self[index]); }); return this; }, /** * 获取指定下表下面的DOM节点 * @param num * @return {null} */ get: function (num) { return this[num] ? this[num] : null; }, /** * 获取一个类似于JQuery的对象实例 * @param num * @return {jQuery|HTMLElement} */ eq: function (num) { // 1. 获取一个JQuery对象,首先先获取这个DOM元素节点 var dom = this.get(num); // 2. 把这个DOM节点转换为一个JQuery对象 return $(dom); }, /** * 获取第一个JQuery对象 * @return {*|jQuery|HTMLElement} */ first: function () { return this.eq(0); }, /** * 获取最后一个JQuery对象 * @return {*|jQuery|HTMLElement} */ last: function () { return this.eq(this.length - 1); }, /** * 获取一个DOM节点的所有子节点 * @return {array} */ children: function () { // 获取一个元素的所有的孩子节点 // 1. 定义一个伪数组, 用于存储所有的孩子节点, 然后获取默认的第一个元素的所有孩子节点 var children = this[0].children, len = children.length, that = {}, i = 0; // 初始化定义的这个伪数组 that.length = len; for (; i < len; i++) { that[i] = children[i]; } return that; }, /** * 从当前DOM元素节点向下寻找一层元素节点 * @param str * @return {} */ find: function (str) { var res = [], self = this, doms; this.each(function () { switch (str.charAt(0)) { case '.': // 类选择器 doms = $.$class(str.substring(1), self[i]); pushArray(doms); break; default: // 标点选择器 doms = $.$tag(str, self[i]); pushArray(doms); break; } }); function pushArray(doms) { if (doms.length) { self.toArray(doms, function () { res.push(this); }); } } // 【注意:】为了能够返回一个JQuery对象,这里需要再次进行处理 var that = this; that.length = this.length; this.each(function (index) { // 这里需要再次构造一个伪数组对象,从而实现链式访问的功能 that[index] = res[index]; }); // 这里在修改that的时候实际上会间接地把this这个变量修改了 return that; }, /** * 获取一个元素的父类节点 * @return {parent} */ parent: function () { // 获取父节点,并且返回一个JQuery对象 var parent = this[0].parentNode; this[0] = parent; this.length = 1; // 由于每一个元素只会有一个父类节点,因此长度为1 return this; }, /** * 获取一个元素在同一个级别的元素里面的下表编号 * @return {number} */ index: function () { // 获取元素本身在同一个级别下面的元素下表编号 var srcNode = this[0], children = srcNode.parentNode.children, self = this, defaultRes = -1; self.toArray(children, function (index) { // 这里的this指向的就是每一个元素, index指向的就是元素的下表编号 if (children[index] === srcNode) { defaultRes = index; } }); // 返回查询到的结果下标 return defaultRes; } }); // 不需要参与链式访问的 xframe.extend(xframe, { /** * 创建一个DOM元素节点 * @param type * @param value * @param html * @return {*} */ create: function (type, value, html) { var dom = document.createElement(type); return xframe().add(dom).attr(value).html(html); }, /** * 直接的孩子节点 * @param dom * @param tag * @return {jQuery|HTMLElement} */ directChildren: function (dom, tag) { var res = [], tag = tag; if (typeof dom === 'string') { dom = $(dom); } // 如果是一个元素集合的处理方法 if (dom.length) { Array.prototype.slice.call(dom).each(function () { getDOM(this.children); }); } else { // 如果只是一个元素的处理方法 getDOM(dom.children); } /** * 主要用于把满足已知条件的DOM元素集合统一放入到一个新的res数组里面去 * @param doms */ function getDOM(doms) { Array.prototype.slice.call(doms).each(function () { if (this.tagName.toLowerCase() === tag.toLowerCase()) { res.push(this); } }); } // 如果获得了这个直接子节点,就直接返回这个对象 return $(res); }, }); })(xframe);

优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的属性框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123810 // 属性框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 获取/设置某一个元素的属性信息 * @return {*} */ attr: function () { // 获取属性信息:两种格式,1. 取值模式 2.设置模式 var args = arguments; if (args.length === 0) { // 没有参数的话,就直接返回本身 return this; } else if (args.length === 1) { // 一个参数的话需要进行判断 if (typeof args[0] === 'string') { // 取值模式 return this[0].getAttribute(args[0]); } else if (typeof args[0] === 'object') { // json对象的话也算是一个设置模式 for (var item in args[0]) { Array.prototype.slice.call(this).each(function () { this.setAttribute(item, args[0][item]); }); } } } else if (args.length === 2) { Array.prototype.slice.call(this).each(function () { this.setAttribute(args[0], args[1]); }); } // 注意这里的this实际上返回的是一个xframe实例对象,但是xframe.eatend(xframe, {})这里的this实际上是一个xframe(selector, context)函数, 还没有实例化呢 return this; }, /** * 判断DOM元素节点是不是拥有某一个属性 * @param val * @return {boolean} */ hasClass: function (val) { if (!this[0]) { return false; } // 默认只会获取第一个元素的相关信息 return this[0].className === val.trim() ? true : false; }, /** * 添加一个class class='xiugang 18 nan' * @param val */ addClass: function (val) { // 处理传进来的字符串两边的空格 val = val.trim(); [].slice.call(this).each(function () { // 只要原来的DOM节点上面没有这个属性的话,就直接添加上去 if (val !== this.className) { this.className += ' ' + val; } }) return this; }, /** * 注意熟练掌握replace()函数的使用 * @param val */ removeClass: function (val) { val = val.trim(); [].slice.call(this).each(function () { if (val === this.className) { // 使用后面替换前面的 this.className = this.className.replace(val, ''); } }) return this; }, /** * 如果有的话就直接删除,没有的话就添加一个 * @param val * @return {toggleClass} */ toggleClass: function (val) { val = val.trim(); [].slice.call(this).each(function () { if (val === this.className) { // 如果有的话就直接删除 this.className.replace(val, ''); } else { // 没有的话就添加一个 this.className += ' ' + val; } }); return this; } }); // 不需要参与链式访问的 xframe.extend(xframe, {}); })(xframe);

优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的内容框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123820 // 内容框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * .html()用为读取和修改元素的HTML标签 对应js中的innerHTML * @return {html} */ html: function () { var arg = arguments, len = arg.length, arr = Array.prototype.slice.call(this); if (this.length < 1) { return this; } // 分为取值模式和设置模式 if (len === 0) { // 取值模式 return this[0].innerHTML; } else if (len === 1) { // 设置模式 arr.each(function () { this.innerHTML = arg[0]; }); } return this; }, /** * 用于获取文本信息 * @return {*} */ text: function () { var args = arguments, len = args.length; if (this.length === 0) { return this; } if (len === 0) { // 取值模式 return this[0].innerText; } else if (len === 1) { // 设置模式 this.each(function () { this.innerText = args[0]; }); } return this; }, /** * 用于获取表单中的数值(input, form) * @return {*} */ val: function () { // val();设置或者获取表单字段的值(前提是表单设置了value属性); var args = arguments, len = args.length; if (this.length === 0) { return this; } if (len === 0) { return this[0].value; } else if (len === 1) { this.each(function () { this.value = args[0]; }); } return this; } }); // 不需要参与链式访问的 xframe.extend(xframe, {}); })(xframe);

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册