Omi框架学习之旅 - 插件机制之omi-touch 及原理说明
这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效。
具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的。就会很简单。
当然使用起来也比较方便。
老规矩,先看demo:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>omi-touch</title>
- <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
- </head>
- <body>
- <script src="../src/omi_soda.js"></script>
- <script>
- Omi.OmiTouch.init();
- class App extends Omi.Component {
- constructor (data) {
- super(data);
- }
- style() {
- return `
- .main {
- width: 160px;
- overflow: hidden;
- border: 1px solid rgb(204, 204, 204);
- margin: 0 auto;
- text-indent: 10px;
- }
- .main ul {
- list-style: none;
- width: 100%;
- margin: 0;
- padding: 0;
- text-align: left;
- font-size: 14px;
- }
- .main li {
- padding: 0 10px;
- height: 40px;
- line-height: 40px;
- border-bottom: 1px solid #ccc;
- border-top: 1px solid #fff;
- background-color: #fafafa;
- font-size: 14px;
- }
- .touchArea {
- height: 250px;
- overflow: hidden;
- }
- `;
- }
- touchStart() {
- this.touch.min = this.refs.touchArea.offsetHeight - this.refs.scroller.offsetHeight;
- }
- pressMove(evt, prop) {
- console.log(evt);
- console.log(prop);
- }
- render() {
- return `
- <div class="main">
- <div class="touchArea" ref="touchArea" omi-touch touchInstance="touch" motionRef="scroller" min="0", max="0", touchStart="touchStart" pressMove="pressMove">
- <ul ref="scroller">
- <li>Hello, Omi-Touch!</li>
- <li>AlloyTouch</li>
- <li>Transformjs</li>
- <li>AlloyFinger</li>
- <li>Omi</li>
- <li>AlloyGameEngine</li>
- <li>Rosin</li>
- <li>LivePool</li>
- <li>AlloyStick</li>
- <li>CodeStar</li>
- <li>AlloyDesigner</li>
- <li>JX</li>
- <li>TEditor</li>
- <li>JXAnimate</li>
- <li>Spirit</li>
- <li>AlloyImage</li>
- <li>ModJS</li>
- <li>Pretty row 16</li>
- <li>stepify</li>
- <li>AlloyTimer</li>
- <li>Alloy Desktop</li>
- <li>JX UI</li>
- <li>CodeTank</li>
- <li>iSpriter</li>
- <li>Rythem</li>
- <li>Go!Png </li>
- <li> row 1</li>
- <li> row 2</li>
- <li> row 3</li>
- <li>row 5</li>
- <li> row 5</li>
- <li> row 7</li>
- <li> row 8</li>
- <li> row 9</li>
- <li> row 11</li>
- <li> row 11</li>
- <li> row 12</li>
- <li> row 13</li>
- <li> row 14</li>
- <li> row 15</li>
- <li> row 16</li>
- <li> row 17</li>
- <li> row 18</li>
- <li> row 19</li>
- <li> row 20</li>
- <li> row 21</li>
- <li> row 22</li>
- <li> row 23</li>
- <li> row 24</li>
- </ul>
- </div>
- </div>
- `;
- }
- };
- Omi.render(new App(), 'body');
- </script>
- </body>
- </html>
看下结果,其实就是上下滚动很多内容。
看看具体怎么实现的,怎么把alloyTouch和Omi结合的(插件源码有所改动, 因为我需要实例化的alloytouch实例,所以加了些代码,
可以在dom上直接加上touchInstancs="自定义实例名",不写的话,默认会自动touchInstance+id自增,该实例对象会挂在到组件实例下去的),看源码即可,走你
- (function () {
- var OmiTouch = {}; // OmiTouch集合对象
- var AlloyTouch = Omi.AlloyTouch;
- var Transform = Omi.Transform;
- var noop = function() { }; // 空函数
- OmiTouch._instanceId = 0; // touch实例id
- OmiTouch.getInstanceId = function () {
- return OmiTouch._instanceId ++; // 自增
- };
- // 获取绑定的函数
- var getHandler = function(name, dom, instance) { // name: 属性值, dom: 反馈触摸的dom, instance实例
- var value = dom.getAttribute(name); // 获取属性值
- if (value === null) { // 没有函数就绑定noop空函数
- return noop;
- }else{
- return instance[value].bind(instance); // 否则返回一个新函数
- }
- };
- // 获取数值
- var getNum = function(name, dom){ // name: 属性值, dom: 反馈触摸的dom
- var value = dom.getAttribute(name); // 获取属性值
- if (value) {
- return parseFloat(value); // 把字符串转成数字返回
- };
- }
- OmiTouch.init = function(){
- Omi.extendPlugin('omi-touch',function(dom, instance){
- var target = instance.refs[dom.getAttribute('motionRef')]; // 找到要运动的dom
- var touchInstanceName = dom.getAttribute('touchInstance') || 'touchInstance' + OmiTouch.getInstanceId(); // 获取touch实例名, 默认touchInstance+id 自增
- Transform(target, target.getAttribute('perspective') ? false : true); // 不在运动对象上写perspective属性,默认不要透视(perspective="true/false" 则开启透视,只有不写才关闭)
- var initialValue = dom.getAttribute('initialValue'); // 初始值
- if (initialValue) {
- target[dom.getAttribute('property') || "translateY"] = parseInt(initialValue); // 默认有初始值,是上下滑动
- };
- instance[touchInstanceName] = new AlloyTouch({
- touch: dom,//反馈触摸的dom
- vertical: dom.getAttribute('vertical') === 'false' ? false : true,//不必需,默认是true代表监听竖直方向touch
- target: target, //运动的对象
- property: dom.getAttribute('property') || "translateY", //被运动的属性
- min: getNum('min', dom), //不必需,运动属性的最小值
- max: getNum('max', dom), //不必需,滚动属性的最大值
- sensitivity: getNum('sensitivity', dom) ,//不必需,触摸区域的灵敏度,默认值为1,可以为负数
- factor: getNum('factor', dom) ,//不必需,表示触摸位移与被运动属性映射关系,默认值是1
- step: getNum('step', dom),//用于校正到step的整数倍
- bindSelf: dom.getAttribute('bindSelf') === 'true' ? true : false,
- touchStart: getHandler('touchStart', dom, instance),
- change: getHandler('change', dom, instance),
- touchMove: getHandler('touchMove', dom, instance),
- touchEnd: getHandler('touchEnd', dom, instance),
- tap: getHandler('tap', dom, instance),
- pressMove: getHandler('pressMove', dom, instance),
- animationEnd: getHandler('animationEnd', dom, instance)
- });
- });
- }
- OmiTouch.destroy = function() { // 从Omi的插件集合移除该插件
- delete Omi.plugins['omi-touch'];
- };
- Omi.OmiTouch = OmiTouch;
- })();
恩恩,touch就这么和omi结合起来了,便有了omi-touch插件。
ps:很喜欢的一个插件,或者一个库吧,后期,我会加上一个轮播的封装,只要继承,初始化,简单的配置一下样式,就可复用的轮播,基于这个插件。
Omi框架学习之旅 - 插件机制之omi-touch 及原理说明的更多相关文章
- Omi框架学习之旅 - 插件机制之omi-finger 及原理说明
以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...
- Omi框架学习之旅 - 插件机制之omi-router及原理说明
先来看看官网的介绍吧:https://github.com/AlloyTeam/omi/tree/master/plugins/omi-router 其实我推荐直接看官网的介绍.我所写的,主要给个人做 ...
- Omi框架学习之旅 - 插件机制之omi-transform及原理说明
给omi-transform插件做个笔记,使用起来也很爽. transform.js这个库,一直想写一篇帖子的,可是,数学不好,三维矩阵和二位矩阵理解的不好,所以迟迟没写了, 这也是一个神库,反正我很 ...
- Omi框架学习之旅 - 之开篇扯蛋
说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...
- Omi框架学习之旅 - Hello World 及原理说明
学什么东西都从hello world开始, 我也不知道为啥. 恩,先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. hello world - demo: class Hello e ...
- Omi框架学习之旅 - 获取DOM节点 及原理说明
虽然绝大部分情况下,开发者不需要去查找获取DOM,但是还是有需要获取DOM的场景,所以Omi提供了方便获取DOM节点的方式. 这是官网的话,但是我一直都需要获取dom,对dom操作,所以omi提供的获 ...
- Omi框架学习之旅 - 生命周期 及原理说明
生命周期 name avatars company constructor 构造函数 new的时候 install 初始化安装,这可以拿到用户传进的data进行处理 实例化 installed 安装完 ...
- Omi框架学习之旅 - 通过omi-id来实现组件通讯 及原理说明
这个demo是通过omi-id来获取子类的实例,然后更改data属性,之后updata一下就好了. 老规矩:先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. class Hello ...
- Omi框架学习之旅 - 通过对象实例来实现组件通讯 及原理说明
组件通讯不是讲完了吗(上帝模式还没讲哈),怎么又多了种方式啊. 你484傻,多一种选择不好吗? 其实这个不属于组件通讯啦,只是当父组件实例安装和渲染完毕后,可以执行installed这个方法(默认是空 ...
随机推荐
- JS性能优化 之 文档片段 createDocumentFragment
我们用原生JS进行开发时,经常会用到两种更新DOM节点的方法:innerHTML 和 appendChild() .其中 innerHTML 会完全替换掉原先的节点内容,如果我们是想向元素追加子节点的 ...
- 安卓开发_浅谈ListView之分页列表
前言: 在开发的过程中,有时候我们需要从网络解析一些数据,比如最近的一些新闻,我们需要把这些数据用ListView显示出来. 因为是解析一个网络数据源,这样将会一下子将所有的数据解析出来,当数据源数据 ...
- SEIG Modbus 3.4 CVE-2013-0662 漏洞分析与利用
前言 Schneider Electric Modbus Serial Driver 会监听 27700 端口,程序在处理客户端发送的数据时会导致栈溢出. 测试环境: windows xp sp3 相 ...
- Android Studio 通过一个登录功能介绍SQLite数据库的使用
前言: SQLite简介:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在 ...
- Dbvisualizer软件设置SQL语句的自动提示功能
之前从来没有使用过Dbvisualizer软件,用起来之后发现比mysqlfront不是好一点.之前一直不知道sql语句的自动提示功能,只能一个个单词输入,而且不是默认设置.之后在网上找到了怎么设置, ...
- 怎样让引用类库的类在HelpPage上显示Description
最近在做 web api 开发的时候遇到这样的问题,即 HelpPage 里只能显示 api 控制器上的注释,对于那些引用了外部类库的类(比如POST提交需要用到的类),就无法显示它们的备注, ...
- V4L2 driver -整体架构
我的uvc开源地址:gitee-uvc 字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间. V4L2 驱动核心:主要是构建一个内核中标准视频设备驱动的框架 ...
- pandas的resample重采样
Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法. 降采样:高频数据到低频数据 升采样:低频数据到高频数据 主要函数:r ...
- 初识SpringCloud微服务
微服务是一种架构方式,最终肯定需要技术架构去实施. 微服务的实现方式很多,但是最火的莫过于Spring Cloud了.为什么? 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十 ...
- [方法提炼] 获取Android设备序列号方法
通过这个方法可以检测设备是否连接成功,如果有一台或者多台设备,可以将所有设备序列号全部输出 # -*- coding:utf-8 -*- import os def attachDeviceList( ...