HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

手机GPS定位

地图插件 地图

HTML5+ 提供了两种获取当前用户GPS位置的方式:

  1. plus.geolocation.getCurrentPosition
  2. Map.getUserLocation

经过测试发现第一种方法获得的位置离散程度比第二种方式高,会出现很多偏离当前真实位置较大的“噪点”,因此推荐使用第二种获取GPS位置的方式。

参考代码如下:

HTML中放一个div容器:  
<div id='allmap' style='display: none;'></div>    

JS中添加代码:  
function queryGeoLocation() {  
    var mapObj = new plus.maps.Map('allmap');  
    var getGPS = mapObj.getUserLocation( function ( state, point ){  
        if( 0 == state ){  

            mapObj.centerAndZoom(point, 15);  
            console.debug(JSON.stringify(point));  
        }else{  

        }  
    } );  

    if(getGPS == false) {  

    }  
}

无论使用哪种方式,都需要首先获取百度地图或者高德地图的APP Key。参考地图插件配置一文即可(http://ask.dcloud.net.cn/article/29),但在新版HBuild中,设置Key的方式已经简化,仅需要在manifest.json的“SDK配置”视图中添加获得的appkey即可,无需修改代码视图。

继续阅读 »

HTML5+ 提供了两种获取当前用户GPS位置的方式:

  1. plus.geolocation.getCurrentPosition
  2. Map.getUserLocation

经过测试发现第一种方法获得的位置离散程度比第二种方式高,会出现很多偏离当前真实位置较大的“噪点”,因此推荐使用第二种获取GPS位置的方式。

参考代码如下:

HTML中放一个div容器:  
<div id='allmap' style='display: none;'></div>    

JS中添加代码:  
function queryGeoLocation() {  
    var mapObj = new plus.maps.Map('allmap');  
    var getGPS = mapObj.getUserLocation( function ( state, point ){  
        if( 0 == state ){  

            mapObj.centerAndZoom(point, 15);  
            console.debug(JSON.stringify(point));  
        }else{  

        }  
    } );  

    if(getGPS == false) {  

    }  
}

无论使用哪种方式,都需要首先获取百度地图或者高德地图的APP Key。参考地图插件配置一文即可(http://ask.dcloud.net.cn/article/29),但在新版HBuild中,设置Key的方式已经简化,仅需要在manifest.json的“SDK配置”视图中添加获得的appkey即可,无需修改代码视图。

收起阅读 »

h5+ App 开发实战教程 - 仿《有道词典》已经发布!更多免费视频教程(mui、h5+、h.js、仿《今日头条》新闻客户端实战)等教程汇总

mui

基于mui、h5+、h.js的App开发实战教程 - 仿《有道词典》 已经发布!


总计10节:
1、入口页面布局子页面布局(含原生侧滑窗口切换
2、主页面布局及代码实现
3、新闻详情页面开发
4、词典页面功能及代码编写
5、热点新闻栏目开发(涵盖:下拉刷新、上拉加载等知识点)
6、完成登录检查及微信登录
7、“我的”页面开发
8、推送及相关统计
9、app 在线升级及安装
10、发布应用到应用宝并进行应用加固及签名

课程总计 4个半小时,包含源码、apk。涉及mui布局修改、服务器交互、微信登录、推送、app升级、加固签名等大部分开发知识!
收费50元,有经济困难的在校学生可以联系客服 1265928288 进行优惠(不是勿扰)。
购买方式
腾讯课堂:
https://ke.qq.com/course/194834#tuin=4f8da6

资料包包含:源码、素材、文字资料,购买后即可下载! 观看时候选择超清模式,代码清晰可见!

交流qq群
1群 335126794(已满), 2群 340610532

hcoder 一直致力于奉献高质量 教程,官网上 mui h5+ 等免费教程播放量已经达到5万,收点费用为了做的更好,希望大家理解。
免费教程地址
http://www.hcoder.net/course

继续阅读 »

基于mui、h5+、h.js的App开发实战教程 - 仿《有道词典》 已经发布!


总计10节:
1、入口页面布局子页面布局(含原生侧滑窗口切换
2、主页面布局及代码实现
3、新闻详情页面开发
4、词典页面功能及代码编写
5、热点新闻栏目开发(涵盖:下拉刷新、上拉加载等知识点)
6、完成登录检查及微信登录
7、“我的”页面开发
8、推送及相关统计
9、app 在线升级及安装
10、发布应用到应用宝并进行应用加固及签名

课程总计 4个半小时,包含源码、apk。涉及mui布局修改、服务器交互、微信登录、推送、app升级、加固签名等大部分开发知识!
收费50元,有经济困难的在校学生可以联系客服 1265928288 进行优惠(不是勿扰)。
购买方式
腾讯课堂:
https://ke.qq.com/course/194834#tuin=4f8da6

资料包包含:源码、素材、文字资料,购买后即可下载! 观看时候选择超清模式,代码清晰可见!

交流qq群
1群 335126794(已满), 2群 340610532

hcoder 一直致力于奉献高质量 教程,官网上 mui h5+ 等免费教程播放量已经达到5万,收点费用为了做的更好,希望大家理解。
免费教程地址
http://www.hcoder.net/course

收起阅读 »

移动app如何在手机关屏后仍能正常运行、接收信息

最近在弄一个安卓APP,需要每隔几秒钟上报一次GPS位置,但发现当手机休眠后(屏幕熄灭后)APP不再运行,因此也不能上报GPS位置。

借助安卓的WakeLock机制,我们可以实现让APP在后台运行。实现代码如下:


var g_wakelock = null;  
//允许程序后台运行,以持续获取GPS位置  
function wakeLock() {  
    //Android  
    var main = plus.android.runtimeMainActivity();  
    var Context = plus.android.importClass("android.content.Context");  
    var PowerManager = plus.android.importClass("android.os.PowerManager");  
    var pm = main.getSystemService(Context.POWER_SERVICE);  
    g_wakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ANY_NAME");  
    g_wakelock.acquire();  
}  

//结束程序后台运行  
function releaseWakeLock () {  
    if(g_wakelock != null && g_wakelock.isHeld()) {  
        g_wakelock.release();  
        g_wakelock = null;  
    }  
}  

在需要允许后台运行的时候调用wakeLock(),在希望停止的时候调用releaseWakeLock()

继续阅读 »

最近在弄一个安卓APP,需要每隔几秒钟上报一次GPS位置,但发现当手机休眠后(屏幕熄灭后)APP不再运行,因此也不能上报GPS位置。

借助安卓的WakeLock机制,我们可以实现让APP在后台运行。实现代码如下:


var g_wakelock = null;  
//允许程序后台运行,以持续获取GPS位置  
function wakeLock() {  
    //Android  
    var main = plus.android.runtimeMainActivity();  
    var Context = plus.android.importClass("android.content.Context");  
    var PowerManager = plus.android.importClass("android.os.PowerManager");  
    var pm = main.getSystemService(Context.POWER_SERVICE);  
    g_wakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ANY_NAME");  
    g_wakelock.acquire();  
}  

//结束程序后台运行  
function releaseWakeLock () {  
    if(g_wakelock != null && g_wakelock.isHeld()) {  
        g_wakelock.release();  
        g_wakelock = null;  
    }  
}  

在需要允许后台运行的时候调用wakeLock(),在希望停止的时候调用releaseWakeLock()

收起阅读 »

每天1.36元, 系统学习APP开发

每天1.36元, 系统学习APP开发
按照学习路线图系统学习, 从0到1开发自己的APP...

东翌学院现推出视频订阅学习,【SVIP订阅499/年】可学习所有视频课程(包含实战课程) ,网站视频包含:MUI整套学习课程,包含(HTML+CSS+JS+PHP+Mysql+HBuilder+MUI+H5++Castapp+实战项目);ReactNative整套学习课程,包含(ECMAScript6+ReactJs+ReactNative+PHP+Mysql+实战项目)!有需要学习同学请联系Q:2547209832 群:326787019 报名请通过此链接:http://www.dongyixueyuan.com/expand/epo2wx 通过此链接报名成功后联系老师Q:2547209832领取福利哦!详情咨询QQ:2547209832

继续阅读 »

每天1.36元, 系统学习APP开发
按照学习路线图系统学习, 从0到1开发自己的APP...

东翌学院现推出视频订阅学习,【SVIP订阅499/年】可学习所有视频课程(包含实战课程) ,网站视频包含:MUI整套学习课程,包含(HTML+CSS+JS+PHP+Mysql+HBuilder+MUI+H5++Castapp+实战项目);ReactNative整套学习课程,包含(ECMAScript6+ReactJs+ReactNative+PHP+Mysql+实战项目)!有需要学习同学请联系Q:2547209832 群:326787019 报名请通过此链接:http://www.dongyixueyuan.com/expand/epo2wx 通过此链接报名成功后联系老师Q:2547209832领取福利哦!详情咨询QQ:2547209832

收起阅读 »

选项卡切换下拉刷新,上拉加载,回到顶部,跳到底部的实现方法。

区域滚动 scroll


今天遇到一个问题,在使用官方提供的选项卡切换,附带上拉加载下拉刷新的时候遇到问题。
首先,我需要增加一个返回顶部功能,即切换选项同时返回顶部。
其次,我需要在底部加载完毕的时候,对应选项跳转到底部。

首先先了解下,当采用如图的方式构建的时候,需要了解以下几点:
1。滚动条是在div内部,即.scroll 包含区域的
这意味着window.scroll dom.scrollTop 均无效。
2.其中每一个子div都包含一个.scroll区域
这意味着mui('.mui-scroll-wrapper').scroll()方法返回的将是一个数组。
3.选项头包含一个.scroll区域
这意味着mui('.mui-scroll-wrapper').scroll()[0]指向选项头的scroll区域。

了解完以下几点就简单多了。下拉刷新上拉加载的js和方法官方Hello MUI例程里面有,我就不多说了。
直接po代码。
回到顶部:

> mui('.btn_top')[0].addEventListener('tap',function(){
> var nT = mui('.mui-slider').slider().slideNumber;
> nT = nT+1
> mui('.mui-scroll-wrapper').scroll()[nT].scrollTo(0,0,100)
> console.log('第'+nT+'选项请求返回顶部')
> })

其中nT代表当前slider对应选项卡。
其中的nT+1目的就是避开选项头的那一个scroll区域。
回到底部:

> mui('.btn_bottomtop')[0].addEventListener('tap',function(){
> var nT = mui('.mui-slider').slider().slideNumber;
> nT = nT+1
> mui('.mui-scroll-wrapper').scroll()[nT].scrollToBottom(100);
> console.log('第'+nT+'选项请求返回顶部')
> })

频繁出现的100指代的是100毫秒。
具体参考官方文档:http://dev.dcloud.net.cn/mui/ui/#scroll

继续阅读 »


今天遇到一个问题,在使用官方提供的选项卡切换,附带上拉加载下拉刷新的时候遇到问题。
首先,我需要增加一个返回顶部功能,即切换选项同时返回顶部。
其次,我需要在底部加载完毕的时候,对应选项跳转到底部。

首先先了解下,当采用如图的方式构建的时候,需要了解以下几点:
1。滚动条是在div内部,即.scroll 包含区域的
这意味着window.scroll dom.scrollTop 均无效。
2.其中每一个子div都包含一个.scroll区域
这意味着mui('.mui-scroll-wrapper').scroll()方法返回的将是一个数组。
3.选项头包含一个.scroll区域
这意味着mui('.mui-scroll-wrapper').scroll()[0]指向选项头的scroll区域。

了解完以下几点就简单多了。下拉刷新上拉加载的js和方法官方Hello MUI例程里面有,我就不多说了。
直接po代码。
回到顶部:

> mui('.btn_top')[0].addEventListener('tap',function(){
> var nT = mui('.mui-slider').slider().slideNumber;
> nT = nT+1
> mui('.mui-scroll-wrapper').scroll()[nT].scrollTo(0,0,100)
> console.log('第'+nT+'选项请求返回顶部')
> })

其中nT代表当前slider对应选项卡。
其中的nT+1目的就是避开选项头的那一个scroll区域。
回到底部:

> mui('.btn_bottomtop')[0].addEventListener('tap',function(){
> var nT = mui('.mui-slider').slider().slideNumber;
> nT = nT+1
> mui('.mui-scroll-wrapper').scroll()[nT].scrollToBottom(100);
> console.log('第'+nT+'选项请求返回顶部')
> })

频繁出现的100指代的是100毫秒。
具体参考官方文档:http://dev.dcloud.net.cn/mui/ui/#scroll

收起阅读 »

h5+ App 开发实战教程 - 仿《有道词典》已经发布!更多免费视频教程(mui、h5+、h.js、app实战)等教程汇总

mui

基于mui、h5+、h.js的App开发实战教程 - 仿《有道词典》 已经发布!


总计10节:
1、入口页面布局子页面布局(含原生侧滑窗口切换
2、主页面布局及代码实现
3、新闻详情页面开发
4、词典页面功能及代码编写
5、热点新闻栏目开发(涵盖:下拉刷新、上拉加载等知识点)
6、完成登录检查及微信登录
7、“我的”页面开发
8、推送及相关统计
9、app 在线升级及安装
10、发布应用到应用宝并进行应用加固及签名

课程总计 4个半小时,包含源码、apk。涉及mui布局修改、服务器交互、微信登录、推送、app升级、加固签名等大部分开发知识!
收费50元,有经济困难的在校学生可以联系客服 1265928288 进行优惠(不是勿扰)。
购买方式
腾讯课堂:
https://ke.qq.com/course/194834#tuin=4f8da6

资料包包含:源码、素材、文字资料,购买后即可下载! 观看时候选择超清模式,代码清晰可见!

hcoder 一直致力于奉献高质量 教程,官网上 mui h5+ 等免费教程播放量已经达到5万,收点费用为了做的更好,希望大家理解。
免费教程地址
http://www.hcoder.net/course

继续阅读 »

基于mui、h5+、h.js的App开发实战教程 - 仿《有道词典》 已经发布!


总计10节:
1、入口页面布局子页面布局(含原生侧滑窗口切换
2、主页面布局及代码实现
3、新闻详情页面开发
4、词典页面功能及代码编写
5、热点新闻栏目开发(涵盖:下拉刷新、上拉加载等知识点)
6、完成登录检查及微信登录
7、“我的”页面开发
8、推送及相关统计
9、app 在线升级及安装
10、发布应用到应用宝并进行应用加固及签名

课程总计 4个半小时,包含源码、apk。涉及mui布局修改、服务器交互、微信登录、推送、app升级、加固签名等大部分开发知识!
收费50元,有经济困难的在校学生可以联系客服 1265928288 进行优惠(不是勿扰)。
购买方式
腾讯课堂:
https://ke.qq.com/course/194834#tuin=4f8da6

资料包包含:源码、素材、文字资料,购买后即可下载! 观看时候选择超清模式,代码清晰可见!

hcoder 一直致力于奉献高质量 教程,官网上 mui h5+ 等免费教程播放量已经达到5万,收点费用为了做的更好,希望大家理解。
免费教程地址
http://www.hcoder.net/course

收起阅读 »

app中判断自动升级的一个主要逻辑

1.在服务器需要一个json或html文件,json最好。
{
"state": "yes",//是否自动更新
"mark": "1.0.6",//版本号
"url": "http:\/\/XXXXXXXX\/APPobject\/mmm.wgt"//更新的应用下载地址
}
2.自动更新函数
t是你当前正在运行的APP的版本号

//检查自动更新
function svn(t) {
var xhr_svn = new plus.net.XMLHttpRequest();
xhr_svn.onreadystatechange = function() {
if (xhr_svn.readyState == 4) {
if (xhr_svn.status == 200) {
var res = JSON.parse(xhr_svn.responseText);
if (res.state == 'yes') {
if (res.mark != t) {
var upr;
plus.nativeUI.confirm( "有新版本发布了,是否件更新?", function(e){
upr=(e.index==0)?"Y":"N";
// console.log(upr);
if(upr=="Y"){
var wt = plus.nativeUI.showWaiting('下载更新中,请勿关闭');
var url = res.url; // 下载文件地址
var dtask = plus.downloader.createDownload(url, {}, function(d, status) {
if (status == 200) { // 下载成功
var path = d.filename;
console.log(d.filename);
plus.runtime.install(path);
} else { //下载失败
alert("Download failed: " + status);
}
});
dtask.start();
}else{

                        }     
                    }, "XXX系统", ["确认","取消"] );     

                } else {     
                    console.log('最新');     
                }     
            }     
        } else {     
            plus.nativeUI.toast( "网络连接错误!");     
        }     
    }     
}     
xhr_svn.open("GET", "http:/XXX/APPobject/imes/update.json");//这里的地址是上面json文件的地址     
xhr_svn.send();     

}
3.调用方法:在每次系统打开运行的时候执行上面的函数就可以

继续阅读 »

1.在服务器需要一个json或html文件,json最好。
{
"state": "yes",//是否自动更新
"mark": "1.0.6",//版本号
"url": "http:\/\/XXXXXXXX\/APPobject\/mmm.wgt"//更新的应用下载地址
}
2.自动更新函数
t是你当前正在运行的APP的版本号

//检查自动更新
function svn(t) {
var xhr_svn = new plus.net.XMLHttpRequest();
xhr_svn.onreadystatechange = function() {
if (xhr_svn.readyState == 4) {
if (xhr_svn.status == 200) {
var res = JSON.parse(xhr_svn.responseText);
if (res.state == 'yes') {
if (res.mark != t) {
var upr;
plus.nativeUI.confirm( "有新版本发布了,是否件更新?", function(e){
upr=(e.index==0)?"Y":"N";
// console.log(upr);
if(upr=="Y"){
var wt = plus.nativeUI.showWaiting('下载更新中,请勿关闭');
var url = res.url; // 下载文件地址
var dtask = plus.downloader.createDownload(url, {}, function(d, status) {
if (status == 200) { // 下载成功
var path = d.filename;
console.log(d.filename);
plus.runtime.install(path);
} else { //下载失败
alert("Download failed: " + status);
}
});
dtask.start();
}else{

                        }     
                    }, "XXX系统", ["确认","取消"] );     

                } else {     
                    console.log('最新');     
                }     
            }     
        } else {     
            plus.nativeUI.toast( "网络连接错误!");     
        }     
    }     
}     
xhr_svn.open("GET", "http:/XXX/APPobject/imes/update.json");//这里的地址是上面json文件的地址     
xhr_svn.send();     

}
3.调用方法:在每次系统打开运行的时候执行上面的函数就可以

收起阅读 »

字符串和json数据的相互转换

json

JSON.parse()--字符串转换json、
JSON.stringify()--json转换成字符串

JSON.parse()--字符串转换json、
JSON.stringify()--json转换成字符串

判断是否有网络的问题

var network = true;
if(mui.os.plus){
mui.plusReady(function () {
if(plus.networkinfo.getCurrentType()==plus.networkinfo.CONNECTION_NONE){
network = false;
}
});
}

继续阅读 »

var network = true;
if(mui.os.plus){
mui.plusReady(function () {
if(plus.networkinfo.getCurrentType()==plus.networkinfo.CONNECTION_NONE){
network = false;
}
});
}

收起阅读 »

偏方式来解决白屏,闪屏。

闪屏 白屏

对webview隐藏或关闭时会有白屏,闪屏。
需要按着顺序来操作就可以欺骗眼睛方式来解决。
方式(步骤):
1,如果有其它页,关闭其它webview,非当前页显示页哦。.close()
2,显示新页,有300毫秒过渡。.show(“slide-in-right”, 300);
3,隐藏当前页,.hide();

这样的方式已经是最好的了,否则关闭其它页面也白屏,隐藏页面也白屏。

继续阅读 »

对webview隐藏或关闭时会有白屏,闪屏。
需要按着顺序来操作就可以欺骗眼睛方式来解决。
方式(步骤):
1,如果有其它页,关闭其它webview,非当前页显示页哦。.close()
2,显示新页,有300毫秒过渡。.show(“slide-in-right”, 300);
3,隐藏当前页,.hide();

这样的方式已经是最好的了,否则关闭其它页面也白屏,隐藏页面也白屏。

收起阅读 »

顶部选项卡div模式下,扫描二维码控件位置偏移问题解决(Webview方式)

Webview HTML5+

直接在div模式下,开启摄像头扫二维码的控件位置会发生偏移,而且难以定位,新建一个webview问题就解决了,刚开始学习h5+,代码写的比较烂,大家将就着看:

例子参照的是官方的MUI sample:tab-with-segmented-control.html

        <div class="mui-content">  
            <div style="padding: 10px 10px;">  
                <div id="segmentedControl" class="mui-segmented-control">  
                    <a name="item1" class="mui-control-item mui-active" href="#item1">表头信息</a>  
                    <a name="item2" class="mui-control-item" href="#item2">手动开单</a>  
                    <a name="item3" class="mui-control-item" href="#item3">扫描开单</a>                   
                </div>  
            </div>  

            <div style="margin: 0px 10px;">  
                <!--第一个标签页-->  
                <div id="item1" class="mui-control-content mui-active">  
                    1  
                </div>  

                <!--第二个标签页-->  
                <div id="item2" class="mui-control-content">  
                    2  
                </div>  

                <!--第三个标签页-->  
                <div id="item3" class="mui-control-content">  
                    3  
                </div>  

            </div>  

        <!--mui-content END-->  
        </div>

监听第三个标签被按下,创建一个webview并显示;如果已经创建,就只显示;切换到别的标签卡,隐藏webview

            var scanpage = null;  

            //监听标签卡被点击事件  
            mui('#segmentedControl').on('tap','.mui-control-item:not(.mui-active)',function(e){  
//              console.log(this.name);  
                if(this.name=="item3"){  

                    if(scanpage==null){  
                        ws = plus.webview.create("barcode.html","barcode",{  
                                top:"95px", bottom:"0px",left: "0px", width:"100%", height:"84%",   
                        });  
                        ws.show();  
                        scanpage = true;  

                    }else{  
                        ws.show();  
                    }  

                }else {  
                    if(scanpage == true){  
                        plus.webview.getWebviewById("barcode").hide();    
                    }  
                }  
            });  

barcode.html 参照的是H5+的官方demo:barcode.html ,改进了一点的是把扫描控件放在页面当中,空余位置显示扫描的结果信息,根据扫描到的结果,通过ajax发送到后来数据库匹配,取出商品信息……

继续阅读 »

直接在div模式下,开启摄像头扫二维码的控件位置会发生偏移,而且难以定位,新建一个webview问题就解决了,刚开始学习h5+,代码写的比较烂,大家将就着看:

例子参照的是官方的MUI sample:tab-with-segmented-control.html

        <div class="mui-content">  
            <div style="padding: 10px 10px;">  
                <div id="segmentedControl" class="mui-segmented-control">  
                    <a name="item1" class="mui-control-item mui-active" href="#item1">表头信息</a>  
                    <a name="item2" class="mui-control-item" href="#item2">手动开单</a>  
                    <a name="item3" class="mui-control-item" href="#item3">扫描开单</a>                   
                </div>  
            </div>  

            <div style="margin: 0px 10px;">  
                <!--第一个标签页-->  
                <div id="item1" class="mui-control-content mui-active">  
                    1  
                </div>  

                <!--第二个标签页-->  
                <div id="item2" class="mui-control-content">  
                    2  
                </div>  

                <!--第三个标签页-->  
                <div id="item3" class="mui-control-content">  
                    3  
                </div>  

            </div>  

        <!--mui-content END-->  
        </div>

监听第三个标签被按下,创建一个webview并显示;如果已经创建,就只显示;切换到别的标签卡,隐藏webview

            var scanpage = null;  

            //监听标签卡被点击事件  
            mui('#segmentedControl').on('tap','.mui-control-item:not(.mui-active)',function(e){  
//              console.log(this.name);  
                if(this.name=="item3"){  

                    if(scanpage==null){  
                        ws = plus.webview.create("barcode.html","barcode",{  
                                top:"95px", bottom:"0px",left: "0px", width:"100%", height:"84%",   
                        });  
                        ws.show();  
                        scanpage = true;  

                    }else{  
                        ws.show();  
                    }  

                }else {  
                    if(scanpage == true){  
                        plus.webview.getWebviewById("barcode").hide();    
                    }  
                }  
            });  

barcode.html 参照的是H5+的官方demo:barcode.html ,改进了一点的是把扫描控件放在页面当中,空余位置显示扫描的结果信息,根据扫描到的结果,通过ajax发送到后来数据库匹配,取出商品信息……

收起阅读 »

【示例】使用nativeView绘制窗口的导航栏

Webview nativeObj navigator

应用场景

HBuilder8.0重大更新中提到,非必要不推荐使用同屏多webview中的title场景。
过去使用了父子webview模式,现在推荐使用nativeView方案,可以进一步提升应用整体性能。

具体实现

创建nativeView

参考相关文档原生控件对象

// 创建nativeView  
var headView = new plus.nativeObj.View('test_view', {  
    height: '45px',  
    position: 'dock',  
    dock: 'top'  
});

这里需要注意,将position设置为dock,并且dock设置为top。这样,nativeView就会在整个webview的最上方,并且挤压webview的高度。

绘制标题

参考相关文档绘制文本

// 绘制标题  
headView.drawText('title', {}, {  
    color: '#000000',  
    size: '16px'  
});

这里的目标区域,采用默认的整个view的区域即可。

设置背景颜色

参考相关文档绘制矩形区域

// 绘制背景颜色  
headView.drawRect('#ffffff');  
// 绘制边框  
headView.drawRect('#ff0000', {  
    top: '44px',  
    height: '1px'  
});

绘制icon

参考相关文档绘制图片
这里以绘制back箭头为例

// 绘制back箭头  
var backIcon = new plus.nativeObj.Bitmap('icon_back');  
var BACK_BASE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAb1BMVEUAAAAAev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8AAACubimgAAAAI3RSTlMAGfUTGfQTGPMSGPIYGhgaGBsXGxcbFxwXHBccFhwWHRYdHWufDPQAAAABYktHRACIBR1IAAAAB3RJTUUH4QETEBwooeTlkQAAAJVJREFUSMft1EkSgkAQRNFGUXFWHBDBibr/HTUwD5B/48Ig1y+io7u6MqUhf5hsNEY+j5hMgZ/FJ8Xc9ovos3T96utjbfqN/Nb0O/m96Uv5g+mP8ifTn+Ur01/ka9Nf5RvTt/I309/lH6Z/yr9Mn+Q71/MT8B34K/E58Enzv8R/K98HvnF8p3lr8F7izce7lbf3kJ/lDQp9HdBhgg3PAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTAxLTE5VDE2OjI4OjQwKzA4OjAwpTDFwQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wMS0xOVQxNjoyODo0MCswODowMNRtfX0AAAAASUVORK5CYII=';  
backIcon.loadBase64Data(BACK_BASE, function() {  
    headView.drawBitmap(backIcon, {}, {  
        width: '25px',  
        height: '25px',  
        top: '10px',  
        left: '5px'  
    });  
});

如果需要绘制其它更多的icon等内容,可以根据需求继续添加。

事件监听

参考相关文档添加事件监听器
这里以click事件为例

// 事件监听  
headView.addEventListener('click', function(e) {  
    var x = e.clientX;  
    console.log('触摸目标在view控件中的x坐标:' + x);  
});

事件对象中,主要用到的属性就是clientX,其它更多属性请参考文档说明。

添加至webview

nativeView创建完成后,需要添加到webview上,有些属性才会生效,例如:dock等。

plus.webview.currentWebview().append(headView);

通用方法

看完上面的例子,可能很多小伙伴会觉得步骤很多,操作很繁琐。
这里提供一个简单的封装的方法,适用于部分场景,实际开发中还是要自己根据需求进行进一步的定制。
参数说明:

{  
    "id": "nativeView的id",  
    "height": "导航栏高度",  
    "title": "标题",  
    "titleColor": "标题文字颜色",  
    "fontSize": "标题字体大小",  
    "backgroundColor": "导航栏背景颜色",  
    "borderColor": "导航栏边框颜色",  
    "back": "是否绘制back箭头,Boolean"  
}

详细的方法,请见附件中的demo.html。

更多

为了方便开发者使用,html5plus还提供了titleNView方案,并且mui也提供了相应的扩展方法。
参考原生导航栏控件titleNView使用说明以及打开带原生导航栏的新页面

关于nativeObj的使用,如果大家在实际开发中,有更好的应用例子,欢迎在社区中分享学习交流。

最后附上源码

继续阅读 »

应用场景

HBuilder8.0重大更新中提到,非必要不推荐使用同屏多webview中的title场景。
过去使用了父子webview模式,现在推荐使用nativeView方案,可以进一步提升应用整体性能。

具体实现

创建nativeView

参考相关文档原生控件对象

// 创建nativeView  
var headView = new plus.nativeObj.View('test_view', {  
    height: '45px',  
    position: 'dock',  
    dock: 'top'  
});

这里需要注意,将position设置为dock,并且dock设置为top。这样,nativeView就会在整个webview的最上方,并且挤压webview的高度。

绘制标题

参考相关文档绘制文本

// 绘制标题  
headView.drawText('title', {}, {  
    color: '#000000',  
    size: '16px'  
});

这里的目标区域,采用默认的整个view的区域即可。

设置背景颜色

参考相关文档绘制矩形区域

// 绘制背景颜色  
headView.drawRect('#ffffff');  
// 绘制边框  
headView.drawRect('#ff0000', {  
    top: '44px',  
    height: '1px'  
});

绘制icon

参考相关文档绘制图片
这里以绘制back箭头为例

// 绘制back箭头  
var backIcon = new plus.nativeObj.Bitmap('icon_back');  
var BACK_BASE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAb1BMVEUAAAAAev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8Aev8AAACubimgAAAAI3RSTlMAGfUTGfQTGPMSGPIYGhgaGBsXGxcbFxwXHBccFhwWHRYdHWufDPQAAAABYktHRACIBR1IAAAAB3RJTUUH4QETEBwooeTlkQAAAJVJREFUSMft1EkSgkAQRNFGUXFWHBDBibr/HTUwD5B/48Ig1y+io7u6MqUhf5hsNEY+j5hMgZ/FJ8Xc9ovos3T96utjbfqN/Nb0O/m96Uv5g+mP8ifTn+Ur01/ka9Nf5RvTt/I309/lH6Z/yr9Mn+Q71/MT8B34K/E58Enzv8R/K98HvnF8p3lr8F7izce7lbf3kJ/lDQp9HdBhgg3PAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTAxLTE5VDE2OjI4OjQwKzA4OjAwpTDFwQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wMS0xOVQxNjoyODo0MCswODowMNRtfX0AAAAASUVORK5CYII=';  
backIcon.loadBase64Data(BACK_BASE, function() {  
    headView.drawBitmap(backIcon, {}, {  
        width: '25px',  
        height: '25px',  
        top: '10px',  
        left: '5px'  
    });  
});

如果需要绘制其它更多的icon等内容,可以根据需求继续添加。

事件监听

参考相关文档添加事件监听器
这里以click事件为例

// 事件监听  
headView.addEventListener('click', function(e) {  
    var x = e.clientX;  
    console.log('触摸目标在view控件中的x坐标:' + x);  
});

事件对象中,主要用到的属性就是clientX,其它更多属性请参考文档说明。

添加至webview

nativeView创建完成后,需要添加到webview上,有些属性才会生效,例如:dock等。

plus.webview.currentWebview().append(headView);

通用方法

看完上面的例子,可能很多小伙伴会觉得步骤很多,操作很繁琐。
这里提供一个简单的封装的方法,适用于部分场景,实际开发中还是要自己根据需求进行进一步的定制。
参数说明:

{  
    "id": "nativeView的id",  
    "height": "导航栏高度",  
    "title": "标题",  
    "titleColor": "标题文字颜色",  
    "fontSize": "标题字体大小",  
    "backgroundColor": "导航栏背景颜色",  
    "borderColor": "导航栏边框颜色",  
    "back": "是否绘制back箭头,Boolean"  
}

详细的方法,请见附件中的demo.html。

更多

为了方便开发者使用,html5plus还提供了titleNView方案,并且mui也提供了相应的扩展方法。
参考原生导航栏控件titleNView使用说明以及打开带原生导航栏的新页面

关于nativeObj的使用,如果大家在实际开发中,有更好的应用例子,欢迎在社区中分享学习交流。

最后附上源码

收起阅读 »