HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

横向滚动与上拉加载共存的问题

已解决,通过加载子页面的方式(安卓上面的上拉加载是通过webview,ios上面通过div实现的)
但是如果页面元素较多,需要计算高度,所以本方法也有缺陷


http://dev.dcloud.net.cn/mui/window/#subpage

继续阅读 »

已解决,通过加载子页面的方式(安卓上面的上拉加载是通过webview,ios上面通过div实现的)
但是如果页面元素较多,需要计算高度,所以本方法也有缺陷


http://dev.dcloud.net.cn/mui/window/#subpage

收起阅读 »

原生版本图片轮播使用教程

slider 图片轮播

mui内置有H5版本的图片轮播组件,教程参考mui官网图片轮播;目前5+ runtime也支持了原生实现的图片轮播,先看最终效果:

相比MUI内置的H5模式的图片轮播,原生版本的图片轮播,具有如下特征:

  • 原生实现滑动切换,点击全屏预览,双指缩放,体验更佳
  • 暂不支持自定义点击事件,因此更适合类似商品详情场景,用户需要点击放大图片预览,而无需跳转的情况;
  • 暂不支持自动轮播,用户滑动时才会触发图片切换;若有自动轮播需求,建议使用mui框架实现的DIV版本图片轮播

实现方案

假设从A页面打开B页面,B页面希望使用原生图片轮播,则需要经过如下两个步骤。

新建webview时设置subNViews

A页面打开B页面的代码示例:


var webview_style = {  
    popGesture: "close"  
}  

webview_style.titleNView = { //配置原生标题  
    'backgroundColor': '#f7f7f7',  
    'titleText': this.innerHTML.trim(),  
    'titleColor': '#000000',  
    autoBackButton: true,  
    splitLine: {  
        color: '#cccccc'  
    }  
};  

webview_style.subNViews = [{ //配置图片轮播  
    id: 'slider-native',  
    type: 'ImageSlider',  
    styles: {  
        left: 0,  
        right: 0,  
        top: 0,  
        height: '200px',//轮播组件高度  
        position: 'static',//原生轮播组件跟随页面内容一起滚动  
        loop: true,//允许循环播放  
        images: [{//轮播图片地址  
            src: '_www/images/yuantiao.jpg',  
            width: '100%'  
        }, {  
            src: '_www/images/shuijiao.jpg',  
            width: '100%',  
        }, {  
            src: '_www/images/muwu.jpg',  
            width: '100%',  
        }, {  
            src: '_www/images/cbd.jpg',  
            width: '100%',  
        }]  
    }  
}];  

var webview = plus.webview.create("B.html", "slider_native_demo", webview_style);  
webview.show(aniShow,300);//直接显示

目标页面预留图片轮播组件的高度

因为原生绘制的图片轮播已占据了部分屏幕,因此需要在目标页面(本示例中即为B页面)中预留出同等高度的空白区域,否则,原生轮播组件会遮挡部分webview的内容,如下为示例代码:

.mui-content{  
    padding-top: 215px;  
}

在如上代码中,因为原生轮播组件已占据了200px固定高度,轮播组件和下面内容之间有15px的间距,故padding-top设置为215px

Hello MUI中体验

最新版的Hello MUI已集成了原生图片轮播的示例,在HBuilder 8.1.4+ 版本中即可体验,体验路径:
访问http://ask.dcloud.net.cn/article/12553下载最新版HBuilder,新建Hello mui项目,Hello MUI首页--> gallery slider(图片轮播)--> 默认样式(native模式)

继续阅读 »

mui内置有H5版本的图片轮播组件,教程参考mui官网图片轮播;目前5+ runtime也支持了原生实现的图片轮播,先看最终效果:

相比MUI内置的H5模式的图片轮播,原生版本的图片轮播,具有如下特征:

  • 原生实现滑动切换,点击全屏预览,双指缩放,体验更佳
  • 暂不支持自定义点击事件,因此更适合类似商品详情场景,用户需要点击放大图片预览,而无需跳转的情况;
  • 暂不支持自动轮播,用户滑动时才会触发图片切换;若有自动轮播需求,建议使用mui框架实现的DIV版本图片轮播

实现方案

假设从A页面打开B页面,B页面希望使用原生图片轮播,则需要经过如下两个步骤。

新建webview时设置subNViews

A页面打开B页面的代码示例:


var webview_style = {  
    popGesture: "close"  
}  

webview_style.titleNView = { //配置原生标题  
    'backgroundColor': '#f7f7f7',  
    'titleText': this.innerHTML.trim(),  
    'titleColor': '#000000',  
    autoBackButton: true,  
    splitLine: {  
        color: '#cccccc'  
    }  
};  

webview_style.subNViews = [{ //配置图片轮播  
    id: 'slider-native',  
    type: 'ImageSlider',  
    styles: {  
        left: 0,  
        right: 0,  
        top: 0,  
        height: '200px',//轮播组件高度  
        position: 'static',//原生轮播组件跟随页面内容一起滚动  
        loop: true,//允许循环播放  
        images: [{//轮播图片地址  
            src: '_www/images/yuantiao.jpg',  
            width: '100%'  
        }, {  
            src: '_www/images/shuijiao.jpg',  
            width: '100%',  
        }, {  
            src: '_www/images/muwu.jpg',  
            width: '100%',  
        }, {  
            src: '_www/images/cbd.jpg',  
            width: '100%',  
        }]  
    }  
}];  

var webview = plus.webview.create("B.html", "slider_native_demo", webview_style);  
webview.show(aniShow,300);//直接显示

目标页面预留图片轮播组件的高度

因为原生绘制的图片轮播已占据了部分屏幕,因此需要在目标页面(本示例中即为B页面)中预留出同等高度的空白区域,否则,原生轮播组件会遮挡部分webview的内容,如下为示例代码:

.mui-content{  
    padding-top: 215px;  
}

在如上代码中,因为原生轮播组件已占据了200px固定高度,轮播组件和下面内容之间有15px的间距,故padding-top设置为215px

Hello MUI中体验

最新版的Hello MUI已集成了原生图片轮播的示例,在HBuilder 8.1.4+ 版本中即可体验,体验路径:
访问http://ask.dcloud.net.cn/article/12553下载最新版HBuilder,新建Hello mui项目,Hello MUI首页--> gallery slider(图片轮播)--> 默认样式(native模式)

收起阅读 »

原生版本透明渐变导航条使用教程

透明渐变 transparent

mui内置有H5版本的透明渐变导航控件,教程参考mui官网;透明渐变导航是一种解决滚动条通顶的变通方案,相比双webview,具有更高的性能和更好的动画效果;目前5+ runtime也支持了原生实现的透明渐变导航,相比MUI内置的H5模式,具有更高的性能,先看最终效果:

实现方案

非首页使用

在创建webview时,配置titleNView节点即可,示例如下:

var titleNView = {  
    backgroundColor: '#f7f7f7',//导航栏背景色  
    titleText: '透明渐变(native模式)',//导航栏标题  
    titleColor: '#000000',//文字颜色  
    type:'transparent',//透明渐变样式  
    autoBackButton: true,//自动绘制返回箭头  
    splitLine:{//底部分割线  
        color:'#cccccc'  
    }  
}  

//使用mui的窗口打开方式  
mui.openWindow({  
    url:"nav_transparent_native.html",  
    id:"nav_transparent_demo"  
    styles:{  
        titleNView:titleNView  
    }  
});  

//不使用mui的窗口打开方式  
// var webview = plus.webview.create("nav_transparent_native.html", "nav_transparent_demo", {  
//  titleNView:titleNView  
// });  
// webview.show("slide-in-right", 300);  

首页使用

首页若希望使用透明渐变导航,则需要在manifest.json中配置,在manifest.json的plus节点下,增加如下代码:

"launchwebview": {  
    "titleNView": {  
       "backgroundcolor": "#f7f7f7",  
       "titletext": "首页",  
       "titlecolor": "#000000",  
       "type":"transparent"  
    }  
}

注意:
因为已经使用了原生绘制的透明渐变导航,因此目标页面中,无需再编写导航栏DOM,否则会出现双标题情况。

Hello MUI中体验

最新版的Hello MUI已集成了原生渐变导航的示例,在即将发版的HBuilder 8.1.4+ 版本中即可体验,体验路径:
访问http://ask.dcloud.net.cn/article/12553下载最新版HBuilder,新建Hello mui项目,Hello MUI首页--> nav bar(导航栏) --> 透明渐变(native模式)

继续阅读 »

mui内置有H5版本的透明渐变导航控件,教程参考mui官网;透明渐变导航是一种解决滚动条通顶的变通方案,相比双webview,具有更高的性能和更好的动画效果;目前5+ runtime也支持了原生实现的透明渐变导航,相比MUI内置的H5模式,具有更高的性能,先看最终效果:

实现方案

非首页使用

在创建webview时,配置titleNView节点即可,示例如下:

var titleNView = {  
    backgroundColor: '#f7f7f7',//导航栏背景色  
    titleText: '透明渐变(native模式)',//导航栏标题  
    titleColor: '#000000',//文字颜色  
    type:'transparent',//透明渐变样式  
    autoBackButton: true,//自动绘制返回箭头  
    splitLine:{//底部分割线  
        color:'#cccccc'  
    }  
}  

//使用mui的窗口打开方式  
mui.openWindow({  
    url:"nav_transparent_native.html",  
    id:"nav_transparent_demo"  
    styles:{  
        titleNView:titleNView  
    }  
});  

//不使用mui的窗口打开方式  
// var webview = plus.webview.create("nav_transparent_native.html", "nav_transparent_demo", {  
//  titleNView:titleNView  
// });  
// webview.show("slide-in-right", 300);  

首页使用

首页若希望使用透明渐变导航,则需要在manifest.json中配置,在manifest.json的plus节点下,增加如下代码:

"launchwebview": {  
    "titleNView": {  
       "backgroundcolor": "#f7f7f7",  
       "titletext": "首页",  
       "titlecolor": "#000000",  
       "type":"transparent"  
    }  
}

注意:
因为已经使用了原生绘制的透明渐变导航,因此目标页面中,无需再编写导航栏DOM,否则会出现双标题情况。

Hello MUI中体验

最新版的Hello MUI已集成了原生渐变导航的示例,在即将发版的HBuilder 8.1.4+ 版本中即可体验,体验路径:
访问http://ask.dcloud.net.cn/article/12553下载最新版HBuilder,新建Hello mui项目,Hello MUI首页--> nav bar(导航栏) --> 透明渐变(native模式)

收起阅读 »

独家系统全套mui,h5+教程,500节课程,文档,资料,20套app源码等

HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui,h5+ APP开发实战功能 app开发{仿支付宝,仿微信,仿e袋洗,仿驾考宝典,仿微店,仿教室帮,仿饿了么,仿糗事百科,仿猫眼电影,仿天猫,仿今日头条,东翌同城约,东翌课堂,内涵段子,全套实战开发,让大家快速学习APP开发全体课程只需要499啦 想学习的点击链接咨询课程499全套课程

继续阅读 »

HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui,h5+ APP开发实战功能 app开发{仿支付宝,仿微信,仿e袋洗,仿驾考宝典,仿微店,仿教室帮,仿饿了么,仿糗事百科,仿猫眼电影,仿天猫,仿今日头条,东翌同城约,东翌课堂,内涵段子,全套实战开发,让大家快速学习APP开发全体课程只需要499啦 想学习的点击链接咨询课程499全套课程

收起阅读 »

HBuilder 8.1.4 alpha版发布,新增vue.js提示支持等功能;关于近期Appstore的警告邮件的处理办法

HBuilder alpha

关于近期各位开发者收到Appstore 违反政策警告的公告
综合各方信息

  1. 主要禁的还是 JSPatch等热修复框架,特点是可以通过 JS 脚本调用和替换任意 OC 方法。
  2. 而使用5+ WGT或WGTU方式做热更新,更新页面和JS 功能暂时不受影响。
  3. 5+runtime没有使用JSPatch等热修复框架,主要是第三方SDK:高德地图和个推使用了jspatch,因此被警告。

=============================分割线================================================

HBuilder 8.1.4 alpha版发布,新增vue.js提示支持等功能

下载地址http://pan.baidu.com/s/1hs0O4eS

更新日志:

IDE

-添加对vue.js框架提示的支持

  • windows下边改边看浏览器的宽高设置增加移动触摸模拟功能
  • 添加在编辑器上可以通过shift+鼠标滚轮调节横向滚动条的功能
  • 解决控制台中Ctrl+F快捷键不起作用的问题
  • 解决原生App打包有时弹出异常错误提示的问题
  • 解决原生App打包有时自动下载获取的文件名不正确的问题
  • 解决html中输入script按tab后没有生成script标签的问题
  • 解决有时还原环境后没有自动导入默认目录下所有已存在项目的问题

App

  • 新增Webview窗口支持添加原生View控件(subNViews),原生控件渲染加速页面加载速度
  • 新增Webview窗口原生标题栏控件(导航栏控件)支持沉浸式显示效果,页面滚动时标题栏透明度动态变化 。参考http://ask.dcloud.net.cn/article/12556
  • 新增Webview窗口支持设置原生处理返回键功能(backButtonAutoControl),提升页面关闭响应速度
  • 新增原生图片轮播控件(plus.nativeObj.ImageSlider),支持加载网络图片。参考http://ask.dcloud.net.cn/article/12557
  • Android平台优化应用资源保存目录(由sdcard下目录调整到应用私有目录),防止被清理软件删除引起应用页面无法打开的问题
  • Android平台修复在部分设备上从二级窗口返回可能出现白屏的问题
  • Android平台修复在特定情况下窗口动画效果不正确的问题
  • Android平台修复横竖屏切换后获取屏幕分辨率可能不正确的问题
  • Android平台修复plus.webview.startAnimation方法不设置回调参数可能引起崩溃的问题
  • Android平台修复二维码中字符串中包含换行符时扫描可能出错的问题
  • Android平台修复在特定情况下崩溃日志可能提交不成功的问题
  • Android平台修复设置屏幕亮度(plus.screen.setBrightness)可能不生效的问题
  • Android平台修复友盟统计channel参数设置无效的问题
  • iOS平台修复应用设置为全屏显示时系统状态栏可能不消失的问题
  • iOS平台修复webview 作为子窗口时调用isVisible()总是返回false的问题
  • iOS平台修复Webview窗口设置softinputMode属性值为adjustResize时软键盘消失可能显示不正常的问题
  • iOS平台修复wgt更新应用资源后重启应用可能导致系统状态栏样式显示不正确的问题
  • iOS平台修复wgt/wgut更新时如果模块配置不一致可能导致失败的问题
  • iOS平台修复启动第三方应用可能不触发pause/resume事件的问题
继续阅读 »

关于近期各位开发者收到Appstore 违反政策警告的公告
综合各方信息

  1. 主要禁的还是 JSPatch等热修复框架,特点是可以通过 JS 脚本调用和替换任意 OC 方法。
  2. 而使用5+ WGT或WGTU方式做热更新,更新页面和JS 功能暂时不受影响。
  3. 5+runtime没有使用JSPatch等热修复框架,主要是第三方SDK:高德地图和个推使用了jspatch,因此被警告。

=============================分割线================================================

HBuilder 8.1.4 alpha版发布,新增vue.js提示支持等功能

下载地址http://pan.baidu.com/s/1hs0O4eS

更新日志:

IDE

-添加对vue.js框架提示的支持

  • windows下边改边看浏览器的宽高设置增加移动触摸模拟功能
  • 添加在编辑器上可以通过shift+鼠标滚轮调节横向滚动条的功能
  • 解决控制台中Ctrl+F快捷键不起作用的问题
  • 解决原生App打包有时弹出异常错误提示的问题
  • 解决原生App打包有时自动下载获取的文件名不正确的问题
  • 解决html中输入script按tab后没有生成script标签的问题
  • 解决有时还原环境后没有自动导入默认目录下所有已存在项目的问题

App

  • 新增Webview窗口支持添加原生View控件(subNViews),原生控件渲染加速页面加载速度
  • 新增Webview窗口原生标题栏控件(导航栏控件)支持沉浸式显示效果,页面滚动时标题栏透明度动态变化 。参考http://ask.dcloud.net.cn/article/12556
  • 新增Webview窗口支持设置原生处理返回键功能(backButtonAutoControl),提升页面关闭响应速度
  • 新增原生图片轮播控件(plus.nativeObj.ImageSlider),支持加载网络图片。参考http://ask.dcloud.net.cn/article/12557
  • Android平台优化应用资源保存目录(由sdcard下目录调整到应用私有目录),防止被清理软件删除引起应用页面无法打开的问题
  • Android平台修复在部分设备上从二级窗口返回可能出现白屏的问题
  • Android平台修复在特定情况下窗口动画效果不正确的问题
  • Android平台修复横竖屏切换后获取屏幕分辨率可能不正确的问题
  • Android平台修复plus.webview.startAnimation方法不设置回调参数可能引起崩溃的问题
  • Android平台修复二维码中字符串中包含换行符时扫描可能出错的问题
  • Android平台修复在特定情况下崩溃日志可能提交不成功的问题
  • Android平台修复设置屏幕亮度(plus.screen.setBrightness)可能不生效的问题
  • Android平台修复友盟统计channel参数设置无效的问题
  • iOS平台修复应用设置为全屏显示时系统状态栏可能不消失的问题
  • iOS平台修复webview 作为子窗口时调用isVisible()总是返回false的问题
  • iOS平台修复Webview窗口设置softinputMode属性值为adjustResize时软键盘消失可能显示不正常的问题
  • iOS平台修复wgt更新应用资源后重启应用可能导致系统状态栏样式显示不正确的问题
  • iOS平台修复wgt/wgut更新时如果模块配置不一致可能导致失败的问题
  • iOS平台修复启动第三方应用可能不触发pause/resume事件的问题
收起阅读 »

Android系统关于IPv6网络的接入分析

这种webAPP,对于Android系统来说,IPv6的访问该注意些什么?Android系统关于IPv6网络的分析情况

这种webAPP,对于Android系统来说,IPv6的访问该注意些什么?Android系统关于IPv6网络的分析情况

uploader上传在IOS相册选择图片,上传返回为空?难得没人遇到么。

uploader

上传不了是因为,苹果默认拍照图片文件格式都是大写,苹果是区分大小写,所以上传压缩下在改名。

上传不了是因为,苹果默认拍照图片文件格式都是大写,苹果是区分大小写,所以上传压缩下在改名。

最新的个推推送各种坑。。。纯前端的。。。带跳转到指定页面的demo

推送 mui 个推

最近项目中用到个推推送功能,这个推送坑略大。。。花了好几天才踩完这个坑,具体的代码我在下面会放出demo,下载后直接导入hbuilder运行就行了。。。友情提示,,,,必须打包后才有效。。。,调试是个大坑。。。

最近项目中用到个推推送功能,这个推送坑略大。。。花了好几天才踩完这个坑,具体的代码我在下面会放出demo,下载后直接导入hbuilder运行就行了。。。友情提示,,,,必须打包后才有效。。。,调试是个大坑。。。

独家系统全套mui,h5+教程,500节课程,文档,资料,20套app源码等

HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui,h5+ APP开发实战功能 app开发{仿支付宝,仿微信,仿e袋洗,仿驾考宝典,仿微店,仿教室帮,仿饿了么,仿糗事百科,仿猫眼电影,仿天猫,仿今日头条,东翌同城约,东翌课堂,内涵段子,全套实战开发,让大家快速学习APP开发全体课程只需要499啦 想学习的点击链接咨询课程499全套课程

继续阅读 »

HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui,h5+ APP开发实战功能 app开发{仿支付宝,仿微信,仿e袋洗,仿驾考宝典,仿微店,仿教室帮,仿饿了么,仿糗事百科,仿猫眼电影,仿天猫,仿今日头条,东翌同城约,东翌课堂,内涵段子,全套实战开发,让大家快速学习APP开发全体课程只需要499啦 想学习的点击链接咨询课程499全套课程

收起阅读 »

android非阻塞socket

        function testSocket() {  
            switch(plus.os.name) {  
                case "Android":  
                    // Android平台: plus.android.*  
                    SocketChannel = plus.android.importClass("java.nio.channels.SocketChannel");  
                    Selector = plus.android.importClass("java.nio.channels.Selector");  
                    SelectionKey = plus.android.importClass("java.nio.channels.SelectionKey");  
                    InetSocketAddress = plus.android.importClass("java.net.InetSocketAddress");  
                    SocketAddress = plus.android.importClass("java.net.SocketAddress");  
                    ByteBuffer = plus.android.importClass("java.nio.ByteBuffer");  
                    Iterator = plus.android.importClass("java.util.Iterator");  
                    // var iOException = plus.android.importClass("java.io.IOException");  
                    var method = plus.android.importClass("java.lang.reflect.Method");  
                    var OutputStreamWriter = plus.android.importClass("java.io.OutputStreamWriter");  
                    //BufferedReader = plus.android.importClass("java.io.BufferedReader");  
                    //var charset = plus.android.importClass("java.nio.charset");  
                    //测试改良  
                    var StrictMode = plus.android.importClass("android.os.StrictMode");  
                    var Build = plus.android.importClass("android.os.Build");  
                    if(Build.VERSION.SDK_INT > 9) {  
                        var policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
                        StrictMode.setThreadPolicy(policy);  
                    }  
                    sendbuffer = ByteBuffer.allocate(100);  
                    receivebuffer = ByteBuffer.allocate(100);  
                    //v selectionKeys;  
                    //iterator=new Iterator();  
                    selectionKey = new SelectionKey();  
                    client = new SocketChannel();  
                    btyeSend = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6];  
                    count1 = 0;  
                    testThread();  

                    break;  
                case "iOS":  
                    // iOS平台: plus.ios.*  

                    break;  
                default:  
                    // 其它平台  
                    break;  
            }  
        }  

        function testThread() {  
            var App = plus.android.runtimeMainActivity();  
            var Thread = plus.ios.importClass("java.lang.Thread");  
            socketChannel = SocketChannel.open();  
            //ByteBuffer dst;  
            socketChannel.configureBlocking(false);  
            selector = Selector.open();  
            socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_CONNECT | SelectionKey.OP_WRITE);  
            //socketAddress = new SocketAddress();  
            socketAddress = new InetSocketAddress("10.131.164.32", 1991);  
            socketChannel.connect(socketAddress);  
            var llflag = 0;  
            var Runnable = plus.android.implements("java.lang.Runnable", {  
                "run": function() {  
                    //选择一组键,其相应的通道已为 I/O 操作准备就绪。    
                    //此方法执行处于阻塞模式的选择操作。  
                    //返回此选择器的已选择键集。   
                    while(true) {  
                        selector.select();  
                        //System.out.println(selectionKeys.size());    
                        selectionKeys = selector.selectedKeys();  
                        plus.android.importClass(selectionKeys);  
                        //selectionKeys.clear();  
                        iterator = selectionKeys.iterator();  

                        plus.android.importClass(iterator);  
                        while(iterator.hasNext()) {  
                            selectionKey = iterator.next();  
                            if(selectionKey.isConnectable() && (llflag == 0)) {  
                                console.log("client connect");  
                                llflag = 1;  
                                client = selectionKey.channel();  
                                // 判断此通道上是否正在进行连接操作。    
                                // 完成套接字通道的连接过程。                                                  
                                if(client.isConnectionPending()) {  
                                    client.finishConnect();  
                                    console.log("完成连接!");  
                                    sendbuffer.clear();  
                                    // BufferedInputStream br = new BufferedInputStream(new FileInputStream(new File("D:\\BigData.zip")));    
                                    //     byte[] b = new byte[2];    
                                    //  br.read(b);      
                                    //b[0] = 53;  
                                    //b[1] = 54;  
                                    // b =[1,2,3];  

                                    sendbuffer.put(btyeSend);  
                                    sendbuffer.flip();  
                                    // System.out.println(System.currentTimeMillis());    
                                    client.write(sendbuffer);  
                                    //ystem.out.println(System.currentTimeMillis());    
                                }  
                                //  client.register(selector, SelectionKey.OP_READ);    
                            } else if(selectionKey.isReadable()) {  
                                client = selectionKey.channel();  
                                //将缓冲区清空以备下次读取    
                                receivebuffer.clear();  
                                //读取服务器发送来的数据到缓冲区中    
                                count = client.read(receivebuffer);  
                                if(count > 0) {  
                                    receiveText = new String(receivebuffer.array(), 0, count);  
                                    console.log("客户端接受服务器端数据--:" + receiveText);  
                                    //    if (client.isConnectionPending()) {    
                                    client.finishConnect();  
                                    console.log("完成连接!");  
                                    sendbuffer.clear();  
                                    // BufferedInputStream br = new BufferedInputStream(new FileInputStream(new File("D:\\BigData.zip")));    
                                    var b;  
                                    b = receivebuffer.array();  
                                    var a = []  
                                    for(var i = 0; i < count; i++)  
                                        a[i] = b[i];  
                                    sendbuffer.put(a);  
                                    sendbuffer.flip();  
                                    // System.out.println(System.currentTimeMillis());    
                                    client.write(sendbuffer);  
                                    //ystem.out.println(System.currentTimeMillis());    
                                    //   }  
                                }  
                            }  
                            if(sendFlag == 1) {  
                                client.finishConnect();  
                                sendbuffer.clear();  
                                //byte[] b = new byte[5];    
                                //  br.read(b);  
                                var b_buff = [];  
                                for(var i = 0; i < count1; i++) {  
                                    b_buff[i] = btyeSend[i];  
                                }  
                                sendbuffer.put(b_buff);  
                                sendbuffer.flip();  
                                client.write(sendbuffer);  
                                sendFlag = 0;  
                            }  

                        }  

                        //selectionKeys.clear();  
                    }  
                }  
            });  
            //方式1启动线程  
            App.runOnUiThread(Runnable);  
        }  

        function outValue() {  

            for(var i = 0; i < 16; i++)  
                btyeSend[i] = 0;  
            btyeSend[0] = 65;  
            btyeSend[1] = 66;  
            count1 = 2;  
            sendFlag = 1;  
        }  
继续阅读 »
        function testSocket() {  
            switch(plus.os.name) {  
                case "Android":  
                    // Android平台: plus.android.*  
                    SocketChannel = plus.android.importClass("java.nio.channels.SocketChannel");  
                    Selector = plus.android.importClass("java.nio.channels.Selector");  
                    SelectionKey = plus.android.importClass("java.nio.channels.SelectionKey");  
                    InetSocketAddress = plus.android.importClass("java.net.InetSocketAddress");  
                    SocketAddress = plus.android.importClass("java.net.SocketAddress");  
                    ByteBuffer = plus.android.importClass("java.nio.ByteBuffer");  
                    Iterator = plus.android.importClass("java.util.Iterator");  
                    // var iOException = plus.android.importClass("java.io.IOException");  
                    var method = plus.android.importClass("java.lang.reflect.Method");  
                    var OutputStreamWriter = plus.android.importClass("java.io.OutputStreamWriter");  
                    //BufferedReader = plus.android.importClass("java.io.BufferedReader");  
                    //var charset = plus.android.importClass("java.nio.charset");  
                    //测试改良  
                    var StrictMode = plus.android.importClass("android.os.StrictMode");  
                    var Build = plus.android.importClass("android.os.Build");  
                    if(Build.VERSION.SDK_INT > 9) {  
                        var policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
                        StrictMode.setThreadPolicy(policy);  
                    }  
                    sendbuffer = ByteBuffer.allocate(100);  
                    receivebuffer = ByteBuffer.allocate(100);  
                    //v selectionKeys;  
                    //iterator=new Iterator();  
                    selectionKey = new SelectionKey();  
                    client = new SocketChannel();  
                    btyeSend = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6];  
                    count1 = 0;  
                    testThread();  

                    break;  
                case "iOS":  
                    // iOS平台: plus.ios.*  

                    break;  
                default:  
                    // 其它平台  
                    break;  
            }  
        }  

        function testThread() {  
            var App = plus.android.runtimeMainActivity();  
            var Thread = plus.ios.importClass("java.lang.Thread");  
            socketChannel = SocketChannel.open();  
            //ByteBuffer dst;  
            socketChannel.configureBlocking(false);  
            selector = Selector.open();  
            socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_CONNECT | SelectionKey.OP_WRITE);  
            //socketAddress = new SocketAddress();  
            socketAddress = new InetSocketAddress("10.131.164.32", 1991);  
            socketChannel.connect(socketAddress);  
            var llflag = 0;  
            var Runnable = plus.android.implements("java.lang.Runnable", {  
                "run": function() {  
                    //选择一组键,其相应的通道已为 I/O 操作准备就绪。    
                    //此方法执行处于阻塞模式的选择操作。  
                    //返回此选择器的已选择键集。   
                    while(true) {  
                        selector.select();  
                        //System.out.println(selectionKeys.size());    
                        selectionKeys = selector.selectedKeys();  
                        plus.android.importClass(selectionKeys);  
                        //selectionKeys.clear();  
                        iterator = selectionKeys.iterator();  

                        plus.android.importClass(iterator);  
                        while(iterator.hasNext()) {  
                            selectionKey = iterator.next();  
                            if(selectionKey.isConnectable() && (llflag == 0)) {  
                                console.log("client connect");  
                                llflag = 1;  
                                client = selectionKey.channel();  
                                // 判断此通道上是否正在进行连接操作。    
                                // 完成套接字通道的连接过程。                                                  
                                if(client.isConnectionPending()) {  
                                    client.finishConnect();  
                                    console.log("完成连接!");  
                                    sendbuffer.clear();  
                                    // BufferedInputStream br = new BufferedInputStream(new FileInputStream(new File("D:\\BigData.zip")));    
                                    //     byte[] b = new byte[2];    
                                    //  br.read(b);      
                                    //b[0] = 53;  
                                    //b[1] = 54;  
                                    // b =[1,2,3];  

                                    sendbuffer.put(btyeSend);  
                                    sendbuffer.flip();  
                                    // System.out.println(System.currentTimeMillis());    
                                    client.write(sendbuffer);  
                                    //ystem.out.println(System.currentTimeMillis());    
                                }  
                                //  client.register(selector, SelectionKey.OP_READ);    
                            } else if(selectionKey.isReadable()) {  
                                client = selectionKey.channel();  
                                //将缓冲区清空以备下次读取    
                                receivebuffer.clear();  
                                //读取服务器发送来的数据到缓冲区中    
                                count = client.read(receivebuffer);  
                                if(count > 0) {  
                                    receiveText = new String(receivebuffer.array(), 0, count);  
                                    console.log("客户端接受服务器端数据--:" + receiveText);  
                                    //    if (client.isConnectionPending()) {    
                                    client.finishConnect();  
                                    console.log("完成连接!");  
                                    sendbuffer.clear();  
                                    // BufferedInputStream br = new BufferedInputStream(new FileInputStream(new File("D:\\BigData.zip")));    
                                    var b;  
                                    b = receivebuffer.array();  
                                    var a = []  
                                    for(var i = 0; i < count; i++)  
                                        a[i] = b[i];  
                                    sendbuffer.put(a);  
                                    sendbuffer.flip();  
                                    // System.out.println(System.currentTimeMillis());    
                                    client.write(sendbuffer);  
                                    //ystem.out.println(System.currentTimeMillis());    
                                    //   }  
                                }  
                            }  
                            if(sendFlag == 1) {  
                                client.finishConnect();  
                                sendbuffer.clear();  
                                //byte[] b = new byte[5];    
                                //  br.read(b);  
                                var b_buff = [];  
                                for(var i = 0; i < count1; i++) {  
                                    b_buff[i] = btyeSend[i];  
                                }  
                                sendbuffer.put(b_buff);  
                                sendbuffer.flip();  
                                client.write(sendbuffer);  
                                sendFlag = 0;  
                            }  

                        }  

                        //selectionKeys.clear();  
                    }  
                }  
            });  
            //方式1启动线程  
            App.runOnUiThread(Runnable);  
        }  

        function outValue() {  

            for(var i = 0; i < 16; i++)  
                btyeSend[i] = 0;  
            btyeSend[0] = 65;  
            btyeSend[1] = 66;  
            count1 = 2;  
            sendFlag = 1;  
        }  
收起阅读 »

【讲座】html5+ App开发工程化实践之路

HTML5+ 技术分享 分享

大家好,我是小青年。我在segmentfault上开了个5+ App开发的讲座,欢迎大家前去捧场。本次讲座首先会讲解一下 5+ App 开发核心概念,以及谈一谈在 5+app 开发中的工程化探索方案,并且会在这次讲座发布一个 5+ App 开发的脚手架工具 plus-cli,主要是弥补 5+ App 开发中工程化这块的缺失,以及探讨一下 5+ App 开发如何和 Vue.js 框架如何结合的问题。

本次讲座的主要内容分为以下几个部分:

  • html5+ App 开发的优势及基本概念
  • MUI 框架学习指南
  • html5+ 规范核心 API 详细讲解
  • html5+ 脚手架 plus-cli 发布
  • html5+ App 优化方案
  • 基于 html5+ 标准的流应用开发

面向人群:

  • 想快速了解 5+ App 开发的新手朋友
  • 想使用新特性将自己的 App 进行调优的朋友
  • 想在 5+ App 中使用 Vue.js 等框架进行模块化开发的朋友

如果大家对5+ App开发有任何疑问,可以提前通过邮件:zhaomenghuan@foxmail.com 或者在讲座下方评论反馈给我。 

讲座报名地址:https://segmentfault.com/l/1500000009542402?r=bPqXdU

继续阅读 »

大家好,我是小青年。我在segmentfault上开了个5+ App开发的讲座,欢迎大家前去捧场。本次讲座首先会讲解一下 5+ App 开发核心概念,以及谈一谈在 5+app 开发中的工程化探索方案,并且会在这次讲座发布一个 5+ App 开发的脚手架工具 plus-cli,主要是弥补 5+ App 开发中工程化这块的缺失,以及探讨一下 5+ App 开发如何和 Vue.js 框架如何结合的问题。

本次讲座的主要内容分为以下几个部分:

  • html5+ App 开发的优势及基本概念
  • MUI 框架学习指南
  • html5+ 规范核心 API 详细讲解
  • html5+ 脚手架 plus-cli 发布
  • html5+ App 优化方案
  • 基于 html5+ 标准的流应用开发

面向人群:

  • 想快速了解 5+ App 开发的新手朋友
  • 想使用新特性将自己的 App 进行调优的朋友
  • 想在 5+ App 中使用 Vue.js 等框架进行模块化开发的朋友

如果大家对5+ App开发有任何疑问,可以提前通过邮件:zhaomenghuan@foxmail.com 或者在讲座下方评论反馈给我。 

讲座报名地址:https://segmentfault.com/l/1500000009542402?r=bPqXdU

收起阅读 »

独家系统全套mui,h5+教程,500节课程,文档,资料,20套app源码等

HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui,h5+ APP开发实战功能 app开发{仿支付宝,仿微信,仿e袋洗,仿驾考宝典,仿微店,仿教室帮,仿饿了么,仿糗事百科,仿猫眼电影,仿天猫,仿今日头条,东翌同城约,东翌课堂,内涵段子,全套实战开发,让大家快速学习APP开发全体课程只需要499啦 想学习的点击链接咨询课程499全套课程

继续阅读 »

HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui,h5+ APP开发实战功能 app开发{仿支付宝,仿微信,仿e袋洗,仿驾考宝典,仿微店,仿教室帮,仿饿了么,仿糗事百科,仿猫眼电影,仿天猫,仿今日头条,东翌同城约,东翌课堂,内涵段子,全套实战开发,让大家快速学习APP开发全体课程只需要499啦 想学习的点击链接咨询课程499全套课程

收起阅读 »