
plus.geolocation.getCurrentPosition || plus.maps.Map.calculateDistance
5+文档中距离计算是按照百度坐标来进行计算的;而定位获取到的坐标是国测局坐标(火星坐标,比如高德地图在用),需要转换为百度
坐标;具体转换方法由于简书已发布文章就不在重复编辑了,可参考https://www.jianshu.com/p/b1e9edf61cd8
5+文档中距离计算是按照百度坐标来进行计算的;而定位获取到的坐标是国测局坐标(火星坐标,比如高德地图在用),需要转换为百度
坐标;具体转换方法由于简书已发布文章就不在重复编辑了,可参考https://www.jianshu.com/p/b1e9edf61cd8

html5如何利用百度地图快速的定位经纬度
定位功能(Geolocation)是HTML5的新特性,因此只有在支持HTML5的现代浏览器上运行,特别是手持设备如iphone,地理定位更加精确。首先我们要检测用户设备浏览器是否支持地理定位,如果支持则获取地理信息。注意这个特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的,所以我们在访问该应用时会提示是否允许地理定位,我们当然选择允许即可。
function getLocation(){
if (navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition,showError);
}else{
alert("浏览器不支持地理定位。");
}
}
上面的代码可以知道,如果用户设备支持地理定位,则运行 getCurrentPosition() 方法。如果getCurrentPosition()运行成功,则向参数showPosition中规定的函数返回一个coordinates对象,getCurrentPosition() 方法的第二个参数showError用于处理错误,它规定当获取用户位置失败时运行的函数。
我们先来看函数showError(),它规定获取用户地理位置失败时的一些错误代码处理方式:
function showError(error){
switch(error.code) {
case error.PERMISSION_DENIED:
alert("定位失败,用户拒绝请求地理定位");
break;
case error.POSITION_UNAVAILABLE:
alert("定位失败,位置信息是不可用");
break;
case error.TIMEOUT:
alert("定位失败,请求获取用户位置超时");
break;
case error.UNKNOWN_ERROR:
alert("定位失败,定位系统失效");
break;
}
}
我们再来看函数showPosition(),调用coords的latitude和longitude即可获取到用户的纬度和经度。
function showPosition(position){
var lat = position.coords.latitude; //纬度
var lag = position.coords.longitude; //经度
alert('纬度:'+lat+',经度:'+lag);
}
利用百度地图
function showPosition(position){
var latlon = position.coords.latitude+','+position.coords.longitude;
//baidu
var url = "<a href="http://api.map.baidu.com/geocoder/v2/?ak=C93b5178d7a8ebdb830b9b557abce78b&callback=renderReverse&location="+latlon+"&output=json&pois=0">http://api.map.baidu.com/geocoder/v2/?ak=C93b5178d7a8ebdb830b9b557abce78b&callback=renderReverse&location="+latlon+"&output=json&pois=0</a>";
$.ajax({
type: "GET",
dataType: "jsonp",
url: url,
beforeSend: function(){
$("#baidu_geo").html('正在定位...');
},
success: function (json) {
if(json.status==0){
$("#baidu_geo").html(json.result.formatted_address);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#baidu_geo").html(latlon+"地址位置获取失败");
}
});
});
好了现在大家已经知道如何利用百度地图快速定位经纬度了,如果还存在不理解的地方,可以留言咨询我们。本文由专业的微信小程序开发公司燚轩科技整理发布,如需转载请注明出处!
定位功能(Geolocation)是HTML5的新特性,因此只有在支持HTML5的现代浏览器上运行,特别是手持设备如iphone,地理定位更加精确。首先我们要检测用户设备浏览器是否支持地理定位,如果支持则获取地理信息。注意这个特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的,所以我们在访问该应用时会提示是否允许地理定位,我们当然选择允许即可。
function getLocation(){
if (navigator.geolocation){
navigator.geolocation.getCurrentPosition(showPosition,showError);
}else{
alert("浏览器不支持地理定位。");
}
}
上面的代码可以知道,如果用户设备支持地理定位,则运行 getCurrentPosition() 方法。如果getCurrentPosition()运行成功,则向参数showPosition中规定的函数返回一个coordinates对象,getCurrentPosition() 方法的第二个参数showError用于处理错误,它规定当获取用户位置失败时运行的函数。
我们先来看函数showError(),它规定获取用户地理位置失败时的一些错误代码处理方式:
function showError(error){
switch(error.code) {
case error.PERMISSION_DENIED:
alert("定位失败,用户拒绝请求地理定位");
break;
case error.POSITION_UNAVAILABLE:
alert("定位失败,位置信息是不可用");
break;
case error.TIMEOUT:
alert("定位失败,请求获取用户位置超时");
break;
case error.UNKNOWN_ERROR:
alert("定位失败,定位系统失效");
break;
}
}
我们再来看函数showPosition(),调用coords的latitude和longitude即可获取到用户的纬度和经度。
function showPosition(position){
var lat = position.coords.latitude; //纬度
var lag = position.coords.longitude; //经度
alert('纬度:'+lat+',经度:'+lag);
}
利用百度地图
function showPosition(position){
var latlon = position.coords.latitude+','+position.coords.longitude;
//baidu
var url = "<a href="http://api.map.baidu.com/geocoder/v2/?ak=C93b5178d7a8ebdb830b9b557abce78b&callback=renderReverse&location="+latlon+"&output=json&pois=0">http://api.map.baidu.com/geocoder/v2/?ak=C93b5178d7a8ebdb830b9b557abce78b&callback=renderReverse&location="+latlon+"&output=json&pois=0</a>";
$.ajax({
type: "GET",
dataType: "jsonp",
url: url,
beforeSend: function(){
$("#baidu_geo").html('正在定位...');
},
success: function (json) {
if(json.status==0){
$("#baidu_geo").html(json.result.formatted_address);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#baidu_geo").html(latlon+"地址位置获取失败");
}
});
});
好了现在大家已经知道如何利用百度地图快速定位经纬度了,如果还存在不理解的地方,可以留言咨询我们。本文由专业的微信小程序开发公司燚轩科技整理发布,如需转载请注明出处!

mui.openWindow()打不开页面
开发时遇到mui.openWindow()打不开页面,看了很多资料都没有解决。比如说把代码放在mui.plusready内部执行,也不能解决问题。
在需要打开的页面中使用console.log()输出一段文本,结果控制台没有看到,说明页面并没有加载(注意:我没有使用预加载页面)。最后检查发现问题在于一个<buttom>标签,标签放在表单内部。(以下原因是我的猜想)buttom标签放在表单内部,点击的时候,页面有刷新的效果,而且有请求后台,说明这个按钮被默认处理为表单提交按钮,所以点击按钮的时候就不响应自定义点击事件。解决办法是给<button>标签添加 type="button"属性。 问题解决。
开发时遇到mui.openWindow()打不开页面,看了很多资料都没有解决。比如说把代码放在mui.plusready内部执行,也不能解决问题。
在需要打开的页面中使用console.log()输出一段文本,结果控制台没有看到,说明页面并没有加载(注意:我没有使用预加载页面)。最后检查发现问题在于一个<buttom>标签,标签放在表单内部。(以下原因是我的猜想)buttom标签放在表单内部,点击的时候,页面有刷新的效果,而且有请求后台,说明这个按钮被默认处理为表单提交按钮,所以点击按钮的时候就不响应自定义点击事件。解决办法是给<button>标签添加 type="button"属性。 问题解决。

分享一个简单的淘宝、京东,采集商品宝贝的图片例子
简单的淘宝、京东,采集商品宝贝的图片例子,
作用: 用于快速采集商品宝贝图片,用于发布微信朋友圈宣传推广商品,和收集商品等等.
主要是把JS 注入到,要采集图片的网站,
appendJsFile("_www/js/mui.min.js");
appendJsFile("_www/js/jsimg.js");
在底部留下按键,通过 evalJS , 操作要采集的网站
案例在下面,可以下载体验下
简单的淘宝、京东,采集商品宝贝的图片例子,
作用: 用于快速采集商品宝贝图片,用于发布微信朋友圈宣传推广商品,和收集商品等等.
主要是把JS 注入到,要采集图片的网站,
appendJsFile("_www/js/mui.min.js");
appendJsFile("_www/js/jsimg.js");
在底部留下按键,通过 evalJS , 操作要采集的网站
案例在下面,可以下载体验下
收起阅读 »
【购买】app商城B2C,核心功能完整,带支付,后台php或net都行
B2C商城(APP的)有做过的吗,核心功能完整无Bug的,
带支付功能,后台php或者.net的都行,可以代价私聊,QQ:705722325。
我相信这个系统应该有成熟的作品的,拿出来,我购买,让H5APP发扬光大,
无需售后,我们有技术团队,
当然,如果有需要公安局治安大队的阵地管控、特行检查等app的也可以联系我。
B2C商城(APP的)有做过的吗,核心功能完整无Bug的,
带支付功能,后台php或者.net的都行,可以代价私聊,QQ:705722325。
我相信这个系统应该有成熟的作品的,拿出来,我购买,让H5APP发扬光大,
无需售后,我们有技术团队,
当然,如果有需要公安局治安大队的阵地管控、特行检查等app的也可以联系我。
收起阅读 »
用mui要在CSS里面加 *{touch-action: none;}
用mui要在CSS里面加 *{touch-action: none;} 否则tap事件,开发工具会提示
Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080
用mui要在CSS里面加 *{touch-action: none;} 否则tap事件,开发工具会提示
Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080

MUI使用个推推送流程分析
原文链接(看的格式可能舒服点)
需求:app通知栏收到推送,点击通知栏推送可以进入到不同的详情页
1、监听方法分析:
- receive方法:
当APP在前台的时候,可以监听接收透传消息,APP不在前台的时候无法监听plus.push.addEventListener("receive", function (msg) { }
- click方法:
1、iOS APP处于后台,透传消息会变成通知提醒,此时点击通知触发
2、点击本地设置的推送到通知栏的通知
- click方法:
plus.push.addEventListener("click", function (msg) {
}
2、技术分析:
通知栏通知:
- iOS
在个推中,iOS 只有透传,没有通知。当APP不在前台时,透传只在通知栏提醒,点击走click方法处理业务;- Android
APP透传消息都不会出现在通知栏,有两种处理方式:
1、个推发送通知(但是点击通知只能打开APP、打开链接、下载应用)
2、收到透传消息后,本地生成通知到通知栏(仅限于APP处于前台,receive方法中处理)透传消息:
- APP处于前台才可接收到,APP处于后台无法接收。且接收透传消息时,不可以直接做跳转页面等业务处理,业务处理跳转等需在点击通知栏后进行相应处理。
3、工欲善其事必先利其器,先看官方常见问题:
4、逻辑处理:
iOS
-
APP处于前台:
服务器端推送透传消息后,直接在receive方法监听到:
但是这不是我们要的。我们需要的是用户收到消息后在通知栏出现,而不是直接在receive方法中做业务处理。那么我们可以看下上面官方常见问题第三点,我们需要在消息中心创建一个本地消息:
plus.push.createMessage( str, "LocalMSG", options );
通过点击通知中心的这个本地消息,进入app实现click方法监听处理业务。
那么问题来了,经过测试我们发现,在创建本地消息的时候(receive方法中),APP一定是处于前台的,那么创建了本地通知以后,我们的receive方法一定会监听到,这样不就进入到一个死循环了么?
receive监听 -> 创建本地通知 -> receive再监听到本地通知 -> 再创建本地通知。。。
子子孙孙无穷尽也。
那么我们可以根据参考常见问题的第三点:用户在创建IOS本地消息是可以在“payload”节点添加特殊标记对消息进行区分。
这玩意是在创建消息的时候,官方模板自带的一个参数。在个推后台iOS透传的时候,有一个:
这个其实只是就是把payload参数的值变成你的透传消息json,那么本地创建通知的时候这个值是什么呢?我们看上面创建本地通知的时候,第二个参数LocalMSG,这个就是我们自定义在本地推送的时候的payload参数的值。所以,在receive方法中,我们根据payload参数的值是不是我们设定的LocalMSG就可以判断监听到的推送是不是本地创建的了。
-
APP处于后台:
当APP处于后台,receive方法监听不到消息,此时消息走消息中心推送,点击后进入APP内,走click方法处理业务,满足需求。
Android
根据常见问题第二点,我们知道在处理Android消息的时候,需要使用标准格式的透传json:
{title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"}
这样,透传消息就不会走receive方法,而是像我们需求那样实现所有通知进入通知中心,点击通知中心走click方法处理。如果不按照此格式来,消息不会走消息中心,而是直接走监听的receive方法(APP在前台时,不在前台时,透传消息甚至监听不到)。
需要注意的一点是:
Android透传格式{"title":"通知1","content":"通知内容","payload":"{type:\"notify\",payload:\"通知去干嘛这里可以自定义\"}"}如果想要传输自定义json,赋值给payload,但是里面的json必须是转义过后的,且任何和官方规定格式在同一层的字段都是无效的,例如:
{"id":"123","title":"通知1","content":"通知内容","payload":"{type:\"notify\",ids:\"456\"}"}
这里面第一个id:"123"
在实际接收到的时候并不会存在。
5、总结
其实扯了一大堆,简而言之就是一句话:
Android推送的时候要注意后台返回的json满足官方格式即可,iOS推送要注意当APP在前台的时候,在receive方法监听的时候判断是否是本地通知。
下面是我的部分关键代码,alart()是测试阶段为了看到效果加的:
//获取推送通知
plus.push.addEventListener("receive", function (msg) {
alert("接收到的透传推送 " + JSON.stringify(msg));
if (plus.os.name == "iOS") {
switch (msg.payload) {
case "LocalMSG":
alert("本地创建消息的 " + JSON.stringify(msg));
break;
default:
//测试本地推送
createLocalPushMsg(msg);
break;
}
}
}, false);
//点击推送进来
plus.push.addEventListener("click", function (msg) {
// 判断是从本地创建还是离线推送的消息
alert("点击处理消息 " + JSON.stringify(msg));
}, false);
//创建本地消息
function createLocalPushMsg(msg) {
var options = {cover: false};
plus.push.createMessage(msg.content, "LocalMSG", options);
if (plus.os.name == "iOS") {
outLine('*如果无法创建消息,请到"设置"->"通知"中配置应用在通知中心显示!');
}
}
本文参考的官方文档附上
原文链接(看的格式可能舒服点)
需求:app通知栏收到推送,点击通知栏推送可以进入到不同的详情页
1、监听方法分析:
- receive方法:
当APP在前台的时候,可以监听接收透传消息,APP不在前台的时候无法监听plus.push.addEventListener("receive", function (msg) { }
- click方法:
1、iOS APP处于后台,透传消息会变成通知提醒,此时点击通知触发
2、点击本地设置的推送到通知栏的通知
- click方法:
plus.push.addEventListener("click", function (msg) {
}
2、技术分析:
通知栏通知:
- iOS
在个推中,iOS 只有透传,没有通知。当APP不在前台时,透传只在通知栏提醒,点击走click方法处理业务;- Android
APP透传消息都不会出现在通知栏,有两种处理方式:
1、个推发送通知(但是点击通知只能打开APP、打开链接、下载应用)
2、收到透传消息后,本地生成通知到通知栏(仅限于APP处于前台,receive方法中处理)透传消息:
- APP处于前台才可接收到,APP处于后台无法接收。且接收透传消息时,不可以直接做跳转页面等业务处理,业务处理跳转等需在点击通知栏后进行相应处理。
3、工欲善其事必先利其器,先看官方常见问题:
4、逻辑处理:
iOS
-
APP处于前台:
服务器端推送透传消息后,直接在receive方法监听到:
但是这不是我们要的。我们需要的是用户收到消息后在通知栏出现,而不是直接在receive方法中做业务处理。那么我们可以看下上面官方常见问题第三点,我们需要在消息中心创建一个本地消息:
plus.push.createMessage( str, "LocalMSG", options );
通过点击通知中心的这个本地消息,进入app实现click方法监听处理业务。
那么问题来了,经过测试我们发现,在创建本地消息的时候(receive方法中),APP一定是处于前台的,那么创建了本地通知以后,我们的receive方法一定会监听到,这样不就进入到一个死循环了么?
receive监听 -> 创建本地通知 -> receive再监听到本地通知 -> 再创建本地通知。。。
子子孙孙无穷尽也。
那么我们可以根据参考常见问题的第三点:用户在创建IOS本地消息是可以在“payload”节点添加特殊标记对消息进行区分。
这玩意是在创建消息的时候,官方模板自带的一个参数。在个推后台iOS透传的时候,有一个:
这个其实只是就是把payload参数的值变成你的透传消息json,那么本地创建通知的时候这个值是什么呢?我们看上面创建本地通知的时候,第二个参数LocalMSG,这个就是我们自定义在本地推送的时候的payload参数的值。所以,在receive方法中,我们根据payload参数的值是不是我们设定的LocalMSG就可以判断监听到的推送是不是本地创建的了。
-
APP处于后台:
当APP处于后台,receive方法监听不到消息,此时消息走消息中心推送,点击后进入APP内,走click方法处理业务,满足需求。
Android
根据常见问题第二点,我们知道在处理Android消息的时候,需要使用标准格式的透传json:
{title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"}
这样,透传消息就不会走receive方法,而是像我们需求那样实现所有通知进入通知中心,点击通知中心走click方法处理。如果不按照此格式来,消息不会走消息中心,而是直接走监听的receive方法(APP在前台时,不在前台时,透传消息甚至监听不到)。
需要注意的一点是:
Android透传格式{"title":"通知1","content":"通知内容","payload":"{type:\"notify\",payload:\"通知去干嘛这里可以自定义\"}"}如果想要传输自定义json,赋值给payload,但是里面的json必须是转义过后的,且任何和官方规定格式在同一层的字段都是无效的,例如:
{"id":"123","title":"通知1","content":"通知内容","payload":"{type:\"notify\",ids:\"456\"}"}
这里面第一个id:"123"
在实际接收到的时候并不会存在。
5、总结
其实扯了一大堆,简而言之就是一句话:
Android推送的时候要注意后台返回的json满足官方格式即可,iOS推送要注意当APP在前台的时候,在receive方法监听的时候判断是否是本地通知。
下面是我的部分关键代码,alart()是测试阶段为了看到效果加的:
//获取推送通知
plus.push.addEventListener("receive", function (msg) {
alert("接收到的透传推送 " + JSON.stringify(msg));
if (plus.os.name == "iOS") {
switch (msg.payload) {
case "LocalMSG":
alert("本地创建消息的 " + JSON.stringify(msg));
break;
default:
//测试本地推送
createLocalPushMsg(msg);
break;
}
}
}, false);
//点击推送进来
plus.push.addEventListener("click", function (msg) {
// 判断是从本地创建还是离线推送的消息
alert("点击处理消息 " + JSON.stringify(msg));
}, false);
//创建本地消息
function createLocalPushMsg(msg) {
var options = {cover: false};
plus.push.createMessage(msg.content, "LocalMSG", options);
if (plus.os.name == "iOS") {
outLine('*如果无法创建消息,请到"设置"->"通知"中配置应用在通知中心显示!');
}
}
本文参考的官方文档附上
收起阅读 »
花了半天时间大概写了份 mui 的 d.ts ,mark一下
mui.min.d.ts
interface Subpages {
url: string
id: string
styles?: object
extras?: object
}
interface PreloadPages extends Subpages {
subpages?: Array<Subpages>
}
interface PullRefreshBase {
height?: string | number
auto?: boolean
contentrefresh?: string
callback: any
}
interface PullRefreshUp extends PullRefreshBase {
contentnomore?: string
}
interface pullRefreshDown extends PullRefreshBase {
style: 'circle'
color?: string
range?: string | number
offset?: string | number
contentdown?: string
contentover?: string
}
interface PullRefresh {
container: string
down?: pullRefreshDown
up?: PullRefreshUp
}
interface OffCanvas {
/** 显示 */
show (): void
/** 隐藏 */
close (): void
/** 切换 */
toggle (): void
/** 判断是否为显示状态 */
isShown (direction?: string): boolean
}
interface Numbox {
/** 获取当前值 */
getValue (): string
/** 动态设置新值 */
setValue (val: number): void
/** 更新选项 */
setOption (option: 'min' | 'step' | 'max', val: number): void
}
declare namespace mui {
/** 初始化 */
function init (options?: {
wipeBack?: boolean
swipe?: boolean
subpages?: Array<Subpages>
preloadPages?: Array<PreloadPages>
pullRefresh?: PullRefresh
gestureConfig?: {
tap?: boolean
doubletap?: boolean
longtap?: boolean
hold?: boolean
release?: boolean
swipeleft?: boolean
swiperight?: boolean
swipeup?: boolean
swipedown?: boolean
dragstart?: boolean
drag?: boolean
dragend?: boolean
}
keyEventBind?: {
backbutton?: boolean
menubutton?: boolean
}
beforeback?: Function
statusBarBackground?: string
preloadLimit?: number
}): void
/** 打开新窗口 */
function openWindow (options: {
url: string
id: string
styles?: object
extras?: object
createNew?: boolean
show?: {
autoShow?: boolean
aniShow?: object
duration?: number
}
waiting?: {
autoShow?: boolean
title?: string
options?: object
}
}): void
/** 自动消失消息提示框 */
function toast (message: string, options?: {
duration?: number | 'long' | 'short'
type?: 'div'
}): void
/** 警告框 */
function alert (message: string, title?: string, btnValue?: string, callback?: any, type?: 'div'): void
/** 确认框 */
function confirm (message: string, title?: string, btnValue?: string, callback?: any, type?: 'div'): void
/** 输入对话框 */
function prompt (message: string, title?: string, btnValue?: string, callback?: any, type?: 'div'): void
/** 触发 Dom 事件 */
function trigger (element: HTMLElement, event: string, data?: any): void
/** 触发自定义事件 */
function fire (target: any, event: string, data?: any): void
/** 遍历 */
function each (obj: any, callback: any): void
/** 合并对象 */
function extend (deep: boolean, target: any, ...object: Array<any>): void
/** 封装 setTimeOut */
function later (func: any, delay: number, context?: any): void
/** 滚动窗口屏幕到指定位置 */
function scrollTo (ypos: number, duration: number, callback?: any): void
/** 判断当前运行环境 */
let os: object & os
interface os {
/** 是否在 5+ 环境内 */
plus: boolean | undefined
/** 是否是流应用 */
stream: boolean | undefined
/** 是否为 IOS */
ios: boolean | undefined
/** 是否 iphone */
iphone: boolean | undefined
/** 是否 ipad */
ipad: boolean | undefined
/** 是否 android */
android: boolean | undefined
/** 是否 android 的 chrome 环境 */
isBadAndroid: boolean | undefined
/** 版本号 */
version: string
}
/** plusReady */
function plusReady (callback: any): void
/** 关闭最后一次弹出的对话框(H5模式) */
function closePopup (): void
/** 关闭所有对话框(H5模式) */
function closePopups (): void
/** 轮播 */
function slider (options: any): void
/** 创建遮罩 */
function createMask (callback: any): Mask
interface Mask {
/** 显示遮罩 */
show (): void
/** 关闭遮罩 */
close (): void
}
/** 选择器组件 picker */
class PopPicker {
constructor (options: { layer?: number, buttons?: Array<any>})
setData (options: Array<any>): void
pickers: Array<Picker>
getSelectedItem (): Array<Picker>
show (callback: any): void
hide (): void
dispose (): void
}
/** 日期选择器 DtPicker */
class DtPicker {
constructor (options?: any)
getSelectedItems (): any
show (callback?: any): void
hide (): void
dispose (): void
}
/** 打开新页面 */
function open (...options: Array<any>): any
/** 当前页面 */
function currentWebview (...options: Array<any>): any
/** 关闭窗口 */
function back (...options: Array<any>): any
/** 重写返回逻辑 */
function backFunction (...options: Array<any>): any
/** 双击退出应用 */
function backDouble (...options: Array<any>): any
/** 双击进入后台 */
function backTast (...options: Array<any>): any
/** 预加载 */
function preload (...options: Array<any>): any
/** Ajax */
function ajax (url?: string, settings?: {
async?: boolean
crossDomain?: boolean
data?: any
dataType?: 'xml' | 'html' | 'script' | 'json' | 'text'
error?: any
success?: any
timeout?: number
type?: 'GET' | 'POST'
headers?: any
processData?: boolean
}): void
/** Ajax post */
function post (url: string, data?: any, success?: any, dataType?: 'xml' | 'html' | 'script' | 'json' | 'text'): void
function get (...options: Array<any>): any
function getJSON (...options: Array<any>): any
}
interface Picker {
setSelectedValue (value: string, duration?: number, callback?: any): void
setSelectedIndex (index: number, duration?: number, callback?: any): void
}
interface Mui {
/** 绑定 Dom 事件 */
on (event: string, selector: string, callback: any): void
/** 取消事件绑定 */
off (event?: string, selector?: string): void
/** 遍历 */
each (callback: any): void
/** 弹出菜单 */
popover (status: 'show' | 'hide' | 'toggle', anchor?: HTMLElement | Element): void
/** 聚焦 input */
input (): void
/** 初始化数字输入框 numbox */
numbox (): Numbox
/** 侧滑菜单 */
offCanvas (active?: 'show' | 'close' | 'toggle'): OffCanvas
/** 滚动条 */
progressbar (options?: any): Progressbar
/** 透明标题栏 */
transparent (options: any): void
/** 区域滚动 */
scroll(options?: {
scrollY?: boolean
scrollX?: boolean
startX?: number
startY?: number
indicators?: boolean
deceleration?: number
bounce?: boolean
}): Scroll
/** 初始化 switch */
['switch'] (): void
}
interface Scroll {
scrollTo (xpos: number, ypos: number, duration?: number): void
scrollToBottom (duration?: number): void
}
interface Progressbar {
show (): void
hide (): void
setProgress(param: any): void
}
/** Mui Dom 选择器 */
declare function mui (dom: string): Mui & Array<HTMLElement>
mui.min.d.ts
interface Subpages {
url: string
id: string
styles?: object
extras?: object
}
interface PreloadPages extends Subpages {
subpages?: Array<Subpages>
}
interface PullRefreshBase {
height?: string | number
auto?: boolean
contentrefresh?: string
callback: any
}
interface PullRefreshUp extends PullRefreshBase {
contentnomore?: string
}
interface pullRefreshDown extends PullRefreshBase {
style: 'circle'
color?: string
range?: string | number
offset?: string | number
contentdown?: string
contentover?: string
}
interface PullRefresh {
container: string
down?: pullRefreshDown
up?: PullRefreshUp
}
interface OffCanvas {
/** 显示 */
show (): void
/** 隐藏 */
close (): void
/** 切换 */
toggle (): void
/** 判断是否为显示状态 */
isShown (direction?: string): boolean
}
interface Numbox {
/** 获取当前值 */
getValue (): string
/** 动态设置新值 */
setValue (val: number): void
/** 更新选项 */
setOption (option: 'min' | 'step' | 'max', val: number): void
}
declare namespace mui {
/** 初始化 */
function init (options?: {
wipeBack?: boolean
swipe?: boolean
subpages?: Array<Subpages>
preloadPages?: Array<PreloadPages>
pullRefresh?: PullRefresh
gestureConfig?: {
tap?: boolean
doubletap?: boolean
longtap?: boolean
hold?: boolean
release?: boolean
swipeleft?: boolean
swiperight?: boolean
swipeup?: boolean
swipedown?: boolean
dragstart?: boolean
drag?: boolean
dragend?: boolean
}
keyEventBind?: {
backbutton?: boolean
menubutton?: boolean
}
beforeback?: Function
statusBarBackground?: string
preloadLimit?: number
}): void
/** 打开新窗口 */
function openWindow (options: {
url: string
id: string
styles?: object
extras?: object
createNew?: boolean
show?: {
autoShow?: boolean
aniShow?: object
duration?: number
}
waiting?: {
autoShow?: boolean
title?: string
options?: object
}
}): void
/** 自动消失消息提示框 */
function toast (message: string, options?: {
duration?: number | 'long' | 'short'
type?: 'div'
}): void
/** 警告框 */
function alert (message: string, title?: string, btnValue?: string, callback?: any, type?: 'div'): void
/** 确认框 */
function confirm (message: string, title?: string, btnValue?: string, callback?: any, type?: 'div'): void
/** 输入对话框 */
function prompt (message: string, title?: string, btnValue?: string, callback?: any, type?: 'div'): void
/** 触发 Dom 事件 */
function trigger (element: HTMLElement, event: string, data?: any): void
/** 触发自定义事件 */
function fire (target: any, event: string, data?: any): void
/** 遍历 */
function each (obj: any, callback: any): void
/** 合并对象 */
function extend (deep: boolean, target: any, ...object: Array<any>): void
/** 封装 setTimeOut */
function later (func: any, delay: number, context?: any): void
/** 滚动窗口屏幕到指定位置 */
function scrollTo (ypos: number, duration: number, callback?: any): void
/** 判断当前运行环境 */
let os: object & os
interface os {
/** 是否在 5+ 环境内 */
plus: boolean | undefined
/** 是否是流应用 */
stream: boolean | undefined
/** 是否为 IOS */
ios: boolean | undefined
/** 是否 iphone */
iphone: boolean | undefined
/** 是否 ipad */
ipad: boolean | undefined
/** 是否 android */
android: boolean | undefined
/** 是否 android 的 chrome 环境 */
isBadAndroid: boolean | undefined
/** 版本号 */
version: string
}
/** plusReady */
function plusReady (callback: any): void
/** 关闭最后一次弹出的对话框(H5模式) */
function closePopup (): void
/** 关闭所有对话框(H5模式) */
function closePopups (): void
/** 轮播 */
function slider (options: any): void
/** 创建遮罩 */
function createMask (callback: any): Mask
interface Mask {
/** 显示遮罩 */
show (): void
/** 关闭遮罩 */
close (): void
}
/** 选择器组件 picker */
class PopPicker {
constructor (options: { layer?: number, buttons?: Array<any>})
setData (options: Array<any>): void
pickers: Array<Picker>
getSelectedItem (): Array<Picker>
show (callback: any): void
hide (): void
dispose (): void
}
/** 日期选择器 DtPicker */
class DtPicker {
constructor (options?: any)
getSelectedItems (): any
show (callback?: any): void
hide (): void
dispose (): void
}
/** 打开新页面 */
function open (...options: Array<any>): any
/** 当前页面 */
function currentWebview (...options: Array<any>): any
/** 关闭窗口 */
function back (...options: Array<any>): any
/** 重写返回逻辑 */
function backFunction (...options: Array<any>): any
/** 双击退出应用 */
function backDouble (...options: Array<any>): any
/** 双击进入后台 */
function backTast (...options: Array<any>): any
/** 预加载 */
function preload (...options: Array<any>): any
/** Ajax */
function ajax (url?: string, settings?: {
async?: boolean
crossDomain?: boolean
data?: any
dataType?: 'xml' | 'html' | 'script' | 'json' | 'text'
error?: any
success?: any
timeout?: number
type?: 'GET' | 'POST'
headers?: any
processData?: boolean
}): void
/** Ajax post */
function post (url: string, data?: any, success?: any, dataType?: 'xml' | 'html' | 'script' | 'json' | 'text'): void
function get (...options: Array<any>): any
function getJSON (...options: Array<any>): any
}
interface Picker {
setSelectedValue (value: string, duration?: number, callback?: any): void
setSelectedIndex (index: number, duration?: number, callback?: any): void
}
interface Mui {
/** 绑定 Dom 事件 */
on (event: string, selector: string, callback: any): void
/** 取消事件绑定 */
off (event?: string, selector?: string): void
/** 遍历 */
each (callback: any): void
/** 弹出菜单 */
popover (status: 'show' | 'hide' | 'toggle', anchor?: HTMLElement | Element): void
/** 聚焦 input */
input (): void
/** 初始化数字输入框 numbox */
numbox (): Numbox
/** 侧滑菜单 */
offCanvas (active?: 'show' | 'close' | 'toggle'): OffCanvas
/** 滚动条 */
progressbar (options?: any): Progressbar
/** 透明标题栏 */
transparent (options: any): void
/** 区域滚动 */
scroll(options?: {
scrollY?: boolean
scrollX?: boolean
startX?: number
startY?: number
indicators?: boolean
deceleration?: number
bounce?: boolean
}): Scroll
/** 初始化 switch */
['switch'] (): void
}
interface Scroll {
scrollTo (xpos: number, ypos: number, duration?: number): void
scrollToBottom (duration?: number): void
}
interface Progressbar {
show (): void
hide (): void
setProgress(param: any): void
}
/** Mui Dom 选择器 */
declare function mui (dom: string): Mui & Array<HTMLElement>
收起阅读 »

图漾深度摄像头的基本使用方法
搞到一款图漾的3d相机有好久了,一直也只是编译了sample代码跑起来看看样子,并没有着手看SDK以及开发的事。近几日对照SDK以及其中的SimpleView_FetchFrame例子,捋了捋头绪。代码如下:
include "../common/Utils.hpp"
int main(int argc, char* argv[])
{
//初始化
TYInitLib();
// 打开设备
// 用设备ID打开设备,同时构建此设备的设备管理器。
TY_DEV_HANDLE hDevice;
TYOpenDevice("207000000866", &hDevice);
// 使能组件
// 按位或上组件结构体中的值,即可打开设备。
TYEnableComponents(hDevice, TY_COMPONENT_RGB_CAM | TY_COMPONENT_DEPTH_CAM | TY_COMPONENT_IR_CAM_LEFT | TY_COMPONENT_IR_CAM_RIGHT);
// 取得帧缓存大小。
// 说一下这一步的目的,由于打开不同组件(打开哪些组件),以及不同组件参数设定(分辨率)的原因,每一帧数据的大小是不固定的,
// 所以要用此函数计算一下当前设备以及当前设定下,一帧数据出来,需要多大的缓存buffer。
// 因为后面需要压入buffer队列进行数据读取,所以要保证buffer的大小能否装下一帧数据。
int32_t frameSize;
TYGetFrameBufferSize(hDevice, &frameSize);
// 驱动内部维护一个queue,用户往队列中enqueue空的buffer,
// 设备用每一帧的framedata去填充这个空的buffer,填充后,将此buffer弹出队列(dequeue),返回给用户使用。
// 这几个buffer是循环使用的,弹出被用户取出数据后,又会回到队列尾部。理论上将,只需要两个buffer即可循环使用。
int frameBuffer_number = 3;
char* frameBuffer[frameBuffer_number];
for (int i = 0; i < frameBuffer_number; ++i)
{
frameBuffer[i] = new char[frameSize];
TYEnqueueBuffer(hDevice, frameBuffer[i], frameSize);
}
//开始拍摄
TYStartCapture(hDevice);
//取景后不断有帧输出,需要循环取得帧数据,并进行解析输出。
TY_FRAME_DATA frame;
cv::Mat depth, irl, irr, color;
while(1)
{
// 取得帧
TYFetchFrame(hDevice, &frame, -1);
// 这句为整个程序的核心,解析得到的帧,解析为cv::Mat类型的图像,跟OpenCV对接后即可进行后续的处理。 defined in Utils.hpp line36
parseFrame(frame, &depth, &irl, &irr, &color, 0);
//图像显示
cv::imshow("Depth", depth);
cv::imshow("LeftIR", irl);
cv::imshow("RightIR", irr);
cv::imshow("Color", color);
//检测
if (cv::waitKey(1) == 'q') { break; }
// 这里就是申请的buffer循环使用的根本,每次buffer被dequeue用户取得帧后,在这个帧处理函数中,最后又把当前的buffer压入队列中,循环使用,
// 由于队列特性,队首出列,队尾入列,所以会有循环使用的样子。
TYEnqueueBuffer(hDevice, frame.userBuffer,http://www.appsaa.com , frame.bufferSize);
}
//停止拍摄。
TYStopCapture(hDevice);
//关闭设备。
TYCloseDevice(hDevice);
//反初始化,注销API。
TYDeinitLib();
//delete释放内存。
for (int j = 0; j < frameBuffer_number; ++j)
{
delete frameBuffer[j];
}
return 0;
}
搞到一款图漾的3d相机有好久了,一直也只是编译了sample代码跑起来看看样子,并没有着手看SDK以及开发的事。近几日对照SDK以及其中的SimpleView_FetchFrame例子,捋了捋头绪。代码如下:
include "../common/Utils.hpp"
int main(int argc, char* argv[])
{
//初始化
TYInitLib();
// 打开设备
// 用设备ID打开设备,同时构建此设备的设备管理器。
TY_DEV_HANDLE hDevice;
TYOpenDevice("207000000866", &hDevice);
// 使能组件
// 按位或上组件结构体中的值,即可打开设备。
TYEnableComponents(hDevice, TY_COMPONENT_RGB_CAM | TY_COMPONENT_DEPTH_CAM | TY_COMPONENT_IR_CAM_LEFT | TY_COMPONENT_IR_CAM_RIGHT);
// 取得帧缓存大小。
// 说一下这一步的目的,由于打开不同组件(打开哪些组件),以及不同组件参数设定(分辨率)的原因,每一帧数据的大小是不固定的,
// 所以要用此函数计算一下当前设备以及当前设定下,一帧数据出来,需要多大的缓存buffer。
// 因为后面需要压入buffer队列进行数据读取,所以要保证buffer的大小能否装下一帧数据。
int32_t frameSize;
TYGetFrameBufferSize(hDevice, &frameSize);
// 驱动内部维护一个queue,用户往队列中enqueue空的buffer,
// 设备用每一帧的framedata去填充这个空的buffer,填充后,将此buffer弹出队列(dequeue),返回给用户使用。
// 这几个buffer是循环使用的,弹出被用户取出数据后,又会回到队列尾部。理论上将,只需要两个buffer即可循环使用。
int frameBuffer_number = 3;
char* frameBuffer[frameBuffer_number];
for (int i = 0; i < frameBuffer_number; ++i)
{
frameBuffer[i] = new char[frameSize];
TYEnqueueBuffer(hDevice, frameBuffer[i], frameSize);
}
//开始拍摄
TYStartCapture(hDevice);
//取景后不断有帧输出,需要循环取得帧数据,并进行解析输出。
TY_FRAME_DATA frame;
cv::Mat depth, irl, irr, color;
while(1)
{
// 取得帧
TYFetchFrame(hDevice, &frame, -1);
// 这句为整个程序的核心,解析得到的帧,解析为cv::Mat类型的图像,跟OpenCV对接后即可进行后续的处理。 defined in Utils.hpp line36
parseFrame(frame, &depth, &irl, &irr, &color, 0);
//图像显示
cv::imshow("Depth", depth);
cv::imshow("LeftIR", irl);
cv::imshow("RightIR", irr);
cv::imshow("Color", color);
//检测
if (cv::waitKey(1) == 'q') { break; }
// 这里就是申请的buffer循环使用的根本,每次buffer被dequeue用户取得帧后,在这个帧处理函数中,最后又把当前的buffer压入队列中,循环使用,
// 由于队列特性,队首出列,队尾入列,所以会有循环使用的样子。
TYEnqueueBuffer(hDevice, frame.userBuffer,http://www.appsaa.com , frame.bufferSize);
}
//停止拍摄。
TYStopCapture(hDevice);
//关闭设备。
TYCloseDevice(hDevice);
//反初始化,注销API。
TYDeinitLib();
//delete释放内存。
for (int j = 0; j < frameBuffer_number; ++j)
{
delete frameBuffer[j];
}
return 0;
}
收起阅读 »
一行代码搞定数据库操作
ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库。你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作。ThinkJD会自动管理数据库连接,使用完毕或程序异常都会关闭连接以免造成内存溢出。
//数据库配置(只需调用一次)
D.setDbConfig("jdbc:mysql://127.0.0.1:3306/DbName?characterEncoding=UTF-8","root","root");
//JavaBean模式,自动获取表名、主键、自增属性、字段名和数据
User user = new User();
user.setAge(10);
user.setName("Hello");
user.setSex(true);
//插入数据
long id=D.M(user).add();
//查询数据
user=D.M(User.class).find(id);
//更新数据
user.setSex(false);
D.M(user).field("sex").save();//不指定字段名默认更新JavaBean的所有非空属性
//删除数据
D.M(user).delete();
//D.M(User.class).delete(id);
//Table模式,手动指定表名、主键、自增属性、字段名和数据
//插入数据
long id=D.M("user").field("name,weight").data("Tom",60).add();
//更新数据
D.M("user").field("name,weight").data("Tom",100).where("id=?",id).save();
//查询数据
user=D.M(User.class).find(id);
//删除数据
D.M("user").delete(id);
//数据库配置(只需调用一次)
D.setDbConfig("jdbc:mysql://127.0.0.1:3306/DbName?characterEncoding=UTF-8","root","root");
//JavaBean模式,自动获取表名、主键、自增属性、字段名和数据
User user = new User();
user.setAge(10);
user.setName("Hello");
user.setSex(true);
//插入数据
long id=D.M(user).add();
//查询数据
user=D.M(User.class).find(id);
//更新数据
user.setSex(false);
D.M(user).field("sex").save();//不指定字段名默认更新JavaBean的所有非空属性
//删除数据
D.M(user).delete();
//D.M(User.class).delete(id);
//Table模式,手动指定表名、主键、自增属性、字段名和数据
//插入数据
long id=D.M("user").field("name,weight").data("Tom",60).add();
//更新数据
D.M("user").field("name,weight").data("Tom",100).where("id=?",id).save();
//查询数据
user=D.M(User.class).find(id);
//删除数据
D.M("user").delete(id);
项目主页 https://gitee.com/Leytton/ThinkJD (码云) https://github.com/Leytton/ThinkJD (Github)
测试项目 https://github.com/Leytton/ThinkJD_Demo
ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库。你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作。ThinkJD会自动管理数据库连接,使用完毕或程序异常都会关闭连接以免造成内存溢出。
//数据库配置(只需调用一次)
D.setDbConfig("jdbc:mysql://127.0.0.1:3306/DbName?characterEncoding=UTF-8","root","root");
//JavaBean模式,自动获取表名、主键、自增属性、字段名和数据
User user = new User();
user.setAge(10);
user.setName("Hello");
user.setSex(true);
//插入数据
long id=D.M(user).add();
//查询数据
user=D.M(User.class).find(id);
//更新数据
user.setSex(false);
D.M(user).field("sex").save();//不指定字段名默认更新JavaBean的所有非空属性
//删除数据
D.M(user).delete();
//D.M(User.class).delete(id);
//Table模式,手动指定表名、主键、自增属性、字段名和数据
//插入数据
long id=D.M("user").field("name,weight").data("Tom",60).add();
//更新数据
D.M("user").field("name,weight").data("Tom",100).where("id=?",id).save();
//查询数据
user=D.M(User.class).find(id);
//删除数据
D.M("user").delete(id);
//数据库配置(只需调用一次)
D.setDbConfig("jdbc:mysql://127.0.0.1:3306/DbName?characterEncoding=UTF-8","root","root");
//JavaBean模式,自动获取表名、主键、自增属性、字段名和数据
User user = new User();
user.setAge(10);
user.setName("Hello");
user.setSex(true);
//插入数据
long id=D.M(user).add();
//查询数据
user=D.M(User.class).find(id);
//更新数据
user.setSex(false);
D.M(user).field("sex").save();//不指定字段名默认更新JavaBean的所有非空属性
//删除数据
D.M(user).delete();
//D.M(User.class).delete(id);
//Table模式,手动指定表名、主键、自增属性、字段名和数据
//插入数据
long id=D.M("user").field("name,weight").data("Tom",60).add();
//更新数据
D.M("user").field("name,weight").data("Tom",100).where("id=?",id).save();
//查询数据
user=D.M(User.class).find(id);
//删除数据
D.M("user").delete(id);
项目主页 https://gitee.com/Leytton/ThinkJD (码云) https://github.com/Leytton/ThinkJD (Github)
测试项目 https://github.com/Leytton/ThinkJD_Demo
收起阅读 »
MUI如何安卓离线打包,在Android Studio创建Hello World离线打包工程
在离线打包中,离线打包过xcode的倒没啥多大问题,就输安卓那边问题比较多,打包了两天我就分享一下我的方法吧,因为eclipse中已经不再更新了,所以我现在的例子就是用Android Studio,环境我就不提供搭建了,自己上官网下载“死丢丢”吧。
1 创建Android原生工程
首先创建一个空的Android Studio工程
打开AndroidStudio点击File->New->New Project
然后一路点击“next”到下面这个页面点击“finish”即可
下面是我从官网离线打包中安卓sdk下载的资源
其中的HBuilder-Integrate-AS是属于官网的例子,SDK是属于离线所需要的各种sdk
现在找到sdk里面有个libs里面的包,把它复制到所新建的AS项目中libs去
假如有需要其他模块包的后需要选中libs目录里的库文件,鼠标右键打开菜单,选择“Add As Library...”将填加到工程内的jar文件链接到工程里
这边没有需要太多权限东西所以只复制
lib.5plus.base-release.aar
复制完成之后在其下的build.gradle中声明引用,然后同步资源
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
repositories {
flatDir {
dirs 'libs'
}
}
compile(name: 'lib.5plus.base-release', ext: 'aar')
接下来得复制我们的资源项目进入我们的AS项目中去了
添加资源到工程
在main目录上右键打开菜单,点击“Show in Explorer”打开文件所在的目录,把sdk里面的assets整个复制进去项目里面中去
这里我就不一一解说里面的内容了,想知道的同学可以在下方评论。
添加Web应用资源到工程
在assets目录下创建apps/[appid]/www目录,将web应用拷贝到www目录下,【APPID】为Web应用mainfest.json文件id节点的内容。
注意:应用存放的目录是有层级的,也就是apps下的【appid】的www下文件形式,目录千万不要命名成apps.[appid].www不要被as的表现迷惑,新建的目录类型为Android resource directory
接着我们来编辑AndroidManifest的文件
打开该文件,
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
修改成:
<activity android:name="io.dcloud.PandoraEntry">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
最后一步,修改control指引,回到assets中去找到data目录,修改dcloud_conntrol.xml中的appid成为我们的【appid】
到这里我们可以运行我们helloworld项目了,简单的离线打包完成,具体我们要根据我们项目中所要的资源包来导入jar,以及添加所对应的权限文件。我们也可以根据我们项目修改对应的appicon和启动页。
在离线打包中,离线打包过xcode的倒没啥多大问题,就输安卓那边问题比较多,打包了两天我就分享一下我的方法吧,因为eclipse中已经不再更新了,所以我现在的例子就是用Android Studio,环境我就不提供搭建了,自己上官网下载“死丢丢”吧。
1 创建Android原生工程
首先创建一个空的Android Studio工程
打开AndroidStudio点击File->New->New Project
然后一路点击“next”到下面这个页面点击“finish”即可
下面是我从官网离线打包中安卓sdk下载的资源
其中的HBuilder-Integrate-AS是属于官网的例子,SDK是属于离线所需要的各种sdk
现在找到sdk里面有个libs里面的包,把它复制到所新建的AS项目中libs去
假如有需要其他模块包的后需要选中libs目录里的库文件,鼠标右键打开菜单,选择“Add As Library...”将填加到工程内的jar文件链接到工程里
这边没有需要太多权限东西所以只复制
lib.5plus.base-release.aar
复制完成之后在其下的build.gradle中声明引用,然后同步资源
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
repositories {
flatDir {
dirs 'libs'
}
}
compile(name: 'lib.5plus.base-release', ext: 'aar')
接下来得复制我们的资源项目进入我们的AS项目中去了
添加资源到工程
在main目录上右键打开菜单,点击“Show in Explorer”打开文件所在的目录,把sdk里面的assets整个复制进去项目里面中去
这里我就不一一解说里面的内容了,想知道的同学可以在下方评论。
添加Web应用资源到工程
在assets目录下创建apps/[appid]/www目录,将web应用拷贝到www目录下,【APPID】为Web应用mainfest.json文件id节点的内容。
注意:应用存放的目录是有层级的,也就是apps下的【appid】的www下文件形式,目录千万不要命名成apps.[appid].www不要被as的表现迷惑,新建的目录类型为Android resource directory
接着我们来编辑AndroidManifest的文件
打开该文件,
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
修改成:
<activity android:name="io.dcloud.PandoraEntry">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
最后一步,修改control指引,回到assets中去找到data目录,修改dcloud_conntrol.xml中的appid成为我们的【appid】
到这里我们可以运行我们helloworld项目了,简单的离线打包完成,具体我们要根据我们项目中所要的资源包来导入jar,以及添加所对应的权限文件。我们也可以根据我们项目修改对应的appicon和启动页。
收起阅读 »