
郑州app制作的常见开发模式都分哪些呢
可以看到,在每一天不管是个人来讲还是单位来讲都有许许多多的郑州app制作和郑州app定制的需求,面对这些大量的制作需求,在现实当中可以采用两种不同的方式来进行制作,不同的方式当然具有不同的特点和优势,下面就来详细的跟大家分析解答一下吧。
一、找专业开发公司
如果在实际制作的过程当中,选择了这样的一种制作方式,那么就可以更加的省事了。因为选择这样的一种制作方式专业开发公司会为我们提供一整套的完整的解决方案。这一整套的方案不仅仅包括了前期的市场调查以及用户调研,还包括了手机app的整个设计方案,整个功能的设计分布,如何实现客户的目标功能,而且还包括了手机app制作完成之后的一些后期的推广和宣传工作。
在进行完了这一系列的工作之后,专业开发公司还会根据他们的工作情况来为计算出一个制作的价格,根据所制作手机app的具体情况,项目的复杂程度,制作的价格会在几十万到几百万不等,不管怎样,选择这种制作方式都是非常的方便快捷的,只需要等待成果的验收情况即可。
二、团队项目整体承包的方式
这样的一种方式在目前也是采用得比较多的一种方式,这种方式一般都是设计师与开发工程师来共同合作完成的,采用这样的一种制作方式也会为我们提供一整套的设计解决方案,但是采用这样的一种方式在前期调研和后期的推广方面不会有。一般来说都会按照整体的风格设计报价加上各个功能模块的嵌入整合为一个整体的报价。采用这样的一种方式一般的制作费用大概是在几万到几十万元不等,具体的价格要根据手机app的具体制作难易程度来进行确定。
一般来说,海外的一些开发者和设计师们他们都更倾向与采用时薪的方法来计算制作的整体费用,但采用这样的一种方式无疑会增加制作的整体成本,因此国内的一些客户们并不喜欢这样的一种计算价格的方式,一般也不会选择这样的方式来计算制作总体价格。
本文由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。
可以看到,在每一天不管是个人来讲还是单位来讲都有许许多多的郑州app制作和郑州app定制的需求,面对这些大量的制作需求,在现实当中可以采用两种不同的方式来进行制作,不同的方式当然具有不同的特点和优势,下面就来详细的跟大家分析解答一下吧。
一、找专业开发公司
如果在实际制作的过程当中,选择了这样的一种制作方式,那么就可以更加的省事了。因为选择这样的一种制作方式专业开发公司会为我们提供一整套的完整的解决方案。这一整套的方案不仅仅包括了前期的市场调查以及用户调研,还包括了手机app的整个设计方案,整个功能的设计分布,如何实现客户的目标功能,而且还包括了手机app制作完成之后的一些后期的推广和宣传工作。
在进行完了这一系列的工作之后,专业开发公司还会根据他们的工作情况来为计算出一个制作的价格,根据所制作手机app的具体情况,项目的复杂程度,制作的价格会在几十万到几百万不等,不管怎样,选择这种制作方式都是非常的方便快捷的,只需要等待成果的验收情况即可。
二、团队项目整体承包的方式
这样的一种方式在目前也是采用得比较多的一种方式,这种方式一般都是设计师与开发工程师来共同合作完成的,采用这样的一种制作方式也会为我们提供一整套的设计解决方案,但是采用这样的一种方式在前期调研和后期的推广方面不会有。一般来说都会按照整体的风格设计报价加上各个功能模块的嵌入整合为一个整体的报价。采用这样的一种方式一般的制作费用大概是在几万到几十万元不等,具体的价格要根据手机app的具体制作难易程度来进行确定。
一般来说,海外的一些开发者和设计师们他们都更倾向与采用时薪的方法来计算制作的整体费用,但采用这样的一种方式无疑会增加制作的整体成本,因此国内的一些客户们并不喜欢这样的一种计算价格的方式,一般也不会选择这样的方式来计算制作总体价格。
本文由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。

MUI Checkbox使用官方例子报错
直接新建一个官方的HELLO MUI项目 打开checkbox例子,点击窗口无法使用,点击后就报这个错误:TypeError: c.detail.gesture.changedTouches is undefined
直接新建一个官方的HELLO MUI项目 打开checkbox例子,点击窗口无法使用,点击后就报这个错误:TypeError: c.detail.gesture.changedTouches is undefined

不使用uploader上传文件的方法
最近公司要求统一http框架 需要脱离uploader改用普通的formdata上传文件,大体思路就是将plus的file对象转为blob然后重新生成符合formdata格式的file对象 代码如下:
function chooseFile(filter) {
var that = this;
plus.gallery.pick(function (path) {
plus.io.resolveLocalFileSystemURL(path, function (entry) {
entry.file(function (file) {
var reader = new plus.io.FileReader();
reader.onloadend = function (e) {
var file=(function (path,name) {
var arr = path.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], name, {type: mime});
})(e.target.result,entry.name);
var formData = new FormData();
formData.append("file", file);
that.upload(formData);
};
reader.readAsDataURL(file);
});
}, function (e) {
console.log(e)
});
}, function (e) {
console.log(e);
}, {filter: filter, system: true});
},
最近公司要求统一http框架 需要脱离uploader改用普通的formdata上传文件,大体思路就是将plus的file对象转为blob然后重新生成符合formdata格式的file对象 代码如下:
function chooseFile(filter) {
var that = this;
plus.gallery.pick(function (path) {
plus.io.resolveLocalFileSystemURL(path, function (entry) {
entry.file(function (file) {
var reader = new plus.io.FileReader();
reader.onloadend = function (e) {
var file=(function (path,name) {
var arr = path.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], name, {type: mime});
})(e.target.result,entry.name);
var formData = new FormData();
formData.append("file", file);
that.upload(formData);
};
reader.readAsDataURL(file);
});
}, function (e) {
console.log(e)
});
}, function (e) {
console.log(e);
}, {filter: filter, system: true});
},

如何集成iBeacon扫描,实现室内定位应用
注意:需使用最新版HBuilderX
概述
iBeacon基站是一种蓝牙设备,可以广播符合苹果提供的iBeacon协议,通过手持设备(如IOS/Android)硬件支持蓝牙4.0及以上,即可扫描iBeacon设备信号,其主要参数有UUID-通用标识、Major-主标识、Minor-次标识、RSSI-信号强度、accuracy-距离,通过这些基站讯息,可以轻松实现签到、室内定位、导航等应用场景
开始使用
引入iBeacon,参见API文档,即可开始扫描iBeacon:
plus.ibeacon.startBeaconDiscovery({uuids: ["fda50693-a4e2-4fb1-afcf-c6eb07647825"]});
室内定位场景体验
5+提供的iBeacon设备的支持,是底层api,不带室内定位业务。
需要使用与地图数据配套的iBeacon设备参数部署方案,才可以实现室内地图定位。体验本示例地图,需要使用以下iBeacon参数列表如下:(可以使用APP iBeacon模拟软件,或使用iBeacon硬件配置)
UUID FDA50693-A4E2-4FB1-AFCF-C6EB07647825
Major 10186
Minor 47997 、 47998 、47999 、 48000
地图、定位代码示例:
<script type="text/javascript">
function startLocation() {
//扫描指定UUID的iBeacon设备
plus.ibeacon.startBeaconDiscovery({uuids: ["fda50693-a4e2-4fb1-afcf-c6eb07647825"]});
plus.ibeacon.onBeaconUpdate(function(result){
if(result.beacons && result.beacons.length > 0) {
//传人定位设备
var win = document.getElementById("ifr").contentWindow;
var params = {"key": "onSearchBeacons","value": result };
win.postMessage(JSON.stringify(params), "*");
}
});
}
//退出场景,请及时停止扫描
function disappear() {
plus.ibeacon.stopBeaconDiscovery();
}
</script>
<body>
<iframe title="示例地图" id="ifr" src="http://p.brtbeacon.net/bb/crh/navigator.html?signa=9250019a13c24d969d445d1072685785" frameborder="no" scrolling="no" style="width: 100%;height: 100%;margin-top: 0px;border:0 none;frameborder:0;" onLoad="setTimeout(startLocation,3000)"></iframe>
</body>
使用你的地图
智石科技是DCloud的合作伙伴,可以提供室内地图服务。
获取你的地图参数
①前往智石开发者中心并登录
②首次注册用户需创建【应用AppKey】,即可申请试用地图
②登录查看你的【建筑列表】获取AppKey、【设备管理】获取UUID等参数,填入示例工程即可
商务合作、地图绘制咨询4000-999-023
注意:需使用最新版HBuilderX
概述
iBeacon基站是一种蓝牙设备,可以广播符合苹果提供的iBeacon协议,通过手持设备(如IOS/Android)硬件支持蓝牙4.0及以上,即可扫描iBeacon设备信号,其主要参数有UUID-通用标识、Major-主标识、Minor-次标识、RSSI-信号强度、accuracy-距离,通过这些基站讯息,可以轻松实现签到、室内定位、导航等应用场景
开始使用
引入iBeacon,参见API文档,即可开始扫描iBeacon:
plus.ibeacon.startBeaconDiscovery({uuids: ["fda50693-a4e2-4fb1-afcf-c6eb07647825"]});
室内定位场景体验
5+提供的iBeacon设备的支持,是底层api,不带室内定位业务。
需要使用与地图数据配套的iBeacon设备参数部署方案,才可以实现室内地图定位。体验本示例地图,需要使用以下iBeacon参数列表如下:(可以使用APP iBeacon模拟软件,或使用iBeacon硬件配置)
UUID FDA50693-A4E2-4FB1-AFCF-C6EB07647825
Major 10186
Minor 47997 、 47998 、47999 、 48000
地图、定位代码示例:
<script type="text/javascript">
function startLocation() {
//扫描指定UUID的iBeacon设备
plus.ibeacon.startBeaconDiscovery({uuids: ["fda50693-a4e2-4fb1-afcf-c6eb07647825"]});
plus.ibeacon.onBeaconUpdate(function(result){
if(result.beacons && result.beacons.length > 0) {
//传人定位设备
var win = document.getElementById("ifr").contentWindow;
var params = {"key": "onSearchBeacons","value": result };
win.postMessage(JSON.stringify(params), "*");
}
});
}
//退出场景,请及时停止扫描
function disappear() {
plus.ibeacon.stopBeaconDiscovery();
}
</script>
<body>
<iframe title="示例地图" id="ifr" src="http://p.brtbeacon.net/bb/crh/navigator.html?signa=9250019a13c24d969d445d1072685785" frameborder="no" scrolling="no" style="width: 100%;height: 100%;margin-top: 0px;border:0 none;frameborder:0;" onLoad="setTimeout(startLocation,3000)"></iframe>
</body>
使用你的地图
智石科技是DCloud的合作伙伴,可以提供室内地图服务。
获取你的地图参数
①前往智石开发者中心并登录
②首次注册用户需创建【应用AppKey】,即可申请试用地图
②登录查看你的【建筑列表】获取AppKey、【设备管理】获取UUID等参数,填入示例工程即可
商务合作、地图绘制咨询4000-999-023
收起阅读 »
郑州小程序开发模式和报价费用有关吗
和郑州小程序开发公司打过交道的企业都知道,不同的开发公司对小程序开发的报价是有很大差异的。例如同样一款商城类小程序,有的报价可以低到几千,有的则报价至少两万。很多人不禁会质疑,为什么相同的小程序类型为什么价格差距如此大。其实一个小程序的开发包含了很多环节,每个环节的开发需求不同都会导致开发价格的天壤之别。下面来介绍一下关于微信小程序开发的付费模式。
首先从小程序的付费模式来看,通常有两种方式:一是按年付费,也就是购买小程序模板。以模板销售为主的开发公司,会根据市场上行业的大致分类,按照行业的共同属性开发出一些具备该行业基础功能的模板,例如餐饮类、商城类等等。模板类的小程序购买后上线快,价格低,但是缺乏灵活度和创新度。
二是定制付费版,即按照商家的开发需求进行定制开发,自然价格也是根据具体的开发需求而定,没有统一标准。所谓定制,就是开发公司的市场和产品经理以及技术人员,会根据每个商家不同的产品特征和需求,挖掘用户痛点,梳理开发需求,定制功能列表,并在产品交付后提供相关的产品培训服务。无论是界面还是功能,都是依据企业的品牌形象而匹配定制的。
这种定制化的开发费用相对较高,均价都在万元以上,具体要依据功能需求来定。虽然定制开发的成本和周期都要略高,但同时小程序性能和用户体验度也更高。不同商家所面对的客户群体是不相同的,所以在开发小程序之前,一定要明确自己的产品定位和目标客户是谁,然后再有针对性的选择合适的开发公司。
目前小程序开发市场还不是很成熟,所以导致不同开发公司对小程序开发的报价差异很大,从几千到几万的价格都有。因此,对于有需要开发小程序来拓展业务的商家来说,小程序的开发价格就显得很混乱,那么小程序开发到底什么样的报价是合理,只有先了解清楚行情在去找小程序开发公司才算是合理的。
本文由专业的郑州小程序开发公司燚轩科技整理发布,如需转载请注明出处!
和郑州小程序开发公司打过交道的企业都知道,不同的开发公司对小程序开发的报价是有很大差异的。例如同样一款商城类小程序,有的报价可以低到几千,有的则报价至少两万。很多人不禁会质疑,为什么相同的小程序类型为什么价格差距如此大。其实一个小程序的开发包含了很多环节,每个环节的开发需求不同都会导致开发价格的天壤之别。下面来介绍一下关于微信小程序开发的付费模式。
首先从小程序的付费模式来看,通常有两种方式:一是按年付费,也就是购买小程序模板。以模板销售为主的开发公司,会根据市场上行业的大致分类,按照行业的共同属性开发出一些具备该行业基础功能的模板,例如餐饮类、商城类等等。模板类的小程序购买后上线快,价格低,但是缺乏灵活度和创新度。
二是定制付费版,即按照商家的开发需求进行定制开发,自然价格也是根据具体的开发需求而定,没有统一标准。所谓定制,就是开发公司的市场和产品经理以及技术人员,会根据每个商家不同的产品特征和需求,挖掘用户痛点,梳理开发需求,定制功能列表,并在产品交付后提供相关的产品培训服务。无论是界面还是功能,都是依据企业的品牌形象而匹配定制的。
这种定制化的开发费用相对较高,均价都在万元以上,具体要依据功能需求来定。虽然定制开发的成本和周期都要略高,但同时小程序性能和用户体验度也更高。不同商家所面对的客户群体是不相同的,所以在开发小程序之前,一定要明确自己的产品定位和目标客户是谁,然后再有针对性的选择合适的开发公司。
目前小程序开发市场还不是很成熟,所以导致不同开发公司对小程序开发的报价差异很大,从几千到几万的价格都有。因此,对于有需要开发小程序来拓展业务的商家来说,小程序的开发价格就显得很混乱,那么小程序开发到底什么样的报价是合理,只有先了解清楚行情在去找小程序开发公司才算是合理的。
本文由专业的郑州小程序开发公司燚轩科技整理发布,如需转载请注明出处!

uni-app离线打包Android平台注意事项
该文章已停止维护,相关问题请查看原生文档
uni本地集成大致方法与5+集成无异。集成方式可参考Android离线打包
uni项目打包可参考HBuilderX生成本地打包App资源
uni打包需要注意事项:
资源使用
- SDK升级时,需同时更新SDK中所有文件,包括SDK目录/SDK/assets/data/下所有文件、/SDK/libs/下对应所需文件,data目录下的.dat文件必须更新。
- 自定义组件模式和uni-app离线打包时必须添加uniapp-release.aar。
- 2.2.0之后gif图片库最为一个单独的aar引用,你可以选择使用SDK中aar文件或者依赖远程仓库。
- 2.4.0之后项目集成需要添加miit_mdid_1.0.10.aar文件,以便获取移动智能设备标识公共服务平台提供的匿名设备标识符OAID、开发者匿名设备标识符VAID、及应用匿名设备标识符AAID,可用于解决Android10无法获取设备标识(如IMEI、IMSI、Wi-Fi MAC地址等)的问题
gradle配置
-
使用uni时必须添加aaptOptions配置
aaptOptions { additionalParameters '--auto-add-overlay' ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~" }
-
集成uni-app时必须添加如下依赖
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.aar'], dir: 'libs') /*uniapp集成所需库-----------------------开始*/ implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.alibaba:fastjson:1.1.46.android' implementation 'com.facebook.fresco:fresco:1.13.0' implementation "com.facebook.fresco:animated-gif:1.13.0" /*uniapp集成所需库-----------------------结束*/ }
应用配置
- uni跟5+的启动方式不同,请确保使用的是自己的appid。
-
请确保assets--->apps中appid的文件夹名称和dcloud_control.xml的appid对应节点值以及manifest.json中的appid值保持一致,如下图所示:
离线SDK集成uni-app问题汇总
- 如果出现部分tab上图标不显示问题,请下载最新SDK,更新SDK目录/SDK/assets/data/下所有文件。
- 如果出现tabbar或者标题栏不显示的问题,检查是否添加gif依赖!2.2.0之后将gif库单独提出来作为一个单独的aar引用。
- 解决UniPush或个推上传google play违反相关政策的问题,参考链接
离线SDK集成uni-app白屏问题汇总
- 如果出现白屏问题,请检测appid是否一致。
- 如果在appid一致的情况下仍旧出现白屏现象,请确保Androidmanifest.xml中manifest节点下的package属性与build.gradle中的applicationId一致!
- 如果appid一致的情况下依旧白屏,请确保ndk配置为armeabi-v7a或者arm64-v8a或者x86.
该文章已停止维护,相关问题请查看原生文档
uni本地集成大致方法与5+集成无异。集成方式可参考Android离线打包
uni项目打包可参考HBuilderX生成本地打包App资源
uni打包需要注意事项:
资源使用
- SDK升级时,需同时更新SDK中所有文件,包括SDK目录/SDK/assets/data/下所有文件、/SDK/libs/下对应所需文件,data目录下的.dat文件必须更新。
- 自定义组件模式和uni-app离线打包时必须添加uniapp-release.aar。
- 2.2.0之后gif图片库最为一个单独的aar引用,你可以选择使用SDK中aar文件或者依赖远程仓库。
- 2.4.0之后项目集成需要添加miit_mdid_1.0.10.aar文件,以便获取移动智能设备标识公共服务平台提供的匿名设备标识符OAID、开发者匿名设备标识符VAID、及应用匿名设备标识符AAID,可用于解决Android10无法获取设备标识(如IMEI、IMSI、Wi-Fi MAC地址等)的问题
gradle配置
-
使用uni时必须添加aaptOptions配置
aaptOptions { additionalParameters '--auto-add-overlay' ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~" }
-
集成uni-app时必须添加如下依赖
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.aar'], dir: 'libs') /*uniapp集成所需库-----------------------开始*/ implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.alibaba:fastjson:1.1.46.android' implementation 'com.facebook.fresco:fresco:1.13.0' implementation "com.facebook.fresco:animated-gif:1.13.0" /*uniapp集成所需库-----------------------结束*/ }
应用配置
- uni跟5+的启动方式不同,请确保使用的是自己的appid。
-
请确保assets--->apps中appid的文件夹名称和dcloud_control.xml的appid对应节点值以及manifest.json中的appid值保持一致,如下图所示:
离线SDK集成uni-app问题汇总
- 如果出现部分tab上图标不显示问题,请下载最新SDK,更新SDK目录/SDK/assets/data/下所有文件。
- 如果出现tabbar或者标题栏不显示的问题,检查是否添加gif依赖!2.2.0之后将gif库单独提出来作为一个单独的aar引用。
- 解决UniPush或个推上传google play违反相关政策的问题,参考链接
离线SDK集成uni-app白屏问题汇总
- 如果出现白屏问题,请检测appid是否一致。
- 如果在appid一致的情况下仍旧出现白屏现象,请确保Androidmanifest.xml中manifest节点下的package属性与build.gradle中的applicationId一致!
- 如果appid一致的情况下依旧白屏,请确保ndk配置为armeabi-v7a或者arm64-v8a或者x86.

前万小心,安卓跟IOS获取本地文件的区别
安卓可以通过plus.io.requestFileSystem
获取本地的文件,而IOS有各种怪异现象.
推荐安卓跟IOS都使用plus.io.resolveLoclailFileSystemURL
的方式来访问.
var failure = function(err) {
console.log(err);
};
plus.io.resolveLocalFileSystemURL("_www/test.html", function(entry) {
entry.file(function(file) {
var fileReader = new plus.io.FileReader();
fileReader.onloadend = function(e) {
console.log(e.target.result);
};
fileReader.onerror = failure;
fileReader.readAsText(file, 'utf-8');
}, failure)
}, failure);
安卓可以通过plus.io.requestFileSystem
获取本地的文件,而IOS有各种怪异现象.
推荐安卓跟IOS都使用plus.io.resolveLoclailFileSystemURL
的方式来访问.
var failure = function(err) {
console.log(err);
};
plus.io.resolveLocalFileSystemURL("_www/test.html", function(entry) {
entry.file(function(file) {
var fileReader = new plus.io.FileReader();
fileReader.onloadend = function(e) {
console.log(e.target.result);
};
fileReader.onerror = failure;
fileReader.readAsText(file, 'utf-8');
}, failure)
}, failure);
收起阅读 »

UNI 本地打包 Android 离线集成要领
第一步 先下个SDK http://ask.dcloud.net.cn/article/103
下载完成 用AS打开HBuilder-Integrate-AS
第二步
mudule 中的依赖
这里只提要领,详细可参考
http://ask.dcloud.net.cn/article/13141?tdsourcetag=s_pctim_aiomsg
http://ask.dcloud.net.cn/article/66
第三步
处理目录结构
以上就是 集成的要点。
受@DCloud_UNI_Neil 大佬委托 分享经验至此 ,若有问题可以@pj-coder 官方群1
第一步 先下个SDK http://ask.dcloud.net.cn/article/103
下载完成 用AS打开HBuilder-Integrate-AS
第二步
mudule 中的依赖
这里只提要领,详细可参考
http://ask.dcloud.net.cn/article/13141?tdsourcetag=s_pctim_aiomsg
http://ask.dcloud.net.cn/article/66
第三步
处理目录结构
以上就是 集成的要点。
受@DCloud_UNI_Neil 大佬委托 分享经验至此 ,若有问题可以@pj-coder 官方群1

Android开发中ScollView嵌套 WebView底部高度无法自适应解决
最近要做一个页面,需要 ScrollView 嵌套 WebView,怎么嵌套,怎么解决焦点和 touch 事件冲突,网上一大堆,这里就不赘述了,但是发现 WebView 从一个高度很高的网页加载一个高度很低的网页的时候,高度无法自适应了,造成底部会有一大片的空白,下面来分享一下我们的解决方案。
JS 注入,获取页面内容高度,设置成 WebView 高度
JS 注入,通过前端 JS 调用 native 方法,把高度值传递过来,然后通过 layoutparams 去设置 webview 的高度:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
mWebView.loadUrl("javascript:App.resize(document.body.getBoundingClientRect().height)");
super.onPageFinished(view, url);
}
});
mWebView.addJavascriptInterface(this, "App");
@JavascriptInterface
public void resize(final float height) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//Toast.makeText(getActivity(), height + "", Toast.LENGTH_LONG).show();
//此处的 layoutParmas 需要根据父控件类型进行区分,这里为了简单就不这么做了
mWebView.setLayoutParams(new LinearLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));
}
});
}
需要注意的是上面的 resize 方法一定要上面那么写,写成:
mWebView.getLayoutParams().height = (int) (height * getResources().getDisplayMetrics().density);
这样是无法成功的,看来宽度也是有影响的
感谢 @imesong 同学,这段代码有亮点可以完善的地方:
mWebVew.setLayoutParam() 时,应该根据 WebView 父控件的类型,创建 LayoutParam,或者直接用 mWebView.getLayoutParams() 获取 LayoutParams;
调用 JAVA 方法的 JS ,可以在网页加载完成时自己加载下面这段 JS 代码(区别在于一个是终端处理,一个是前段处理),比如:
(function(w){
window.App.resize(document.body.getBoundingClientRect().height);
})(window);
加载这段 JS 就可以了,“APP” 和上面一样是自己注册是自己注册的接口名字;
思路是一样的,处理方式有差异。
试验不太成功的方式
网上也找到了一些其他的方式,试了一下,不太成功,不知道是不是使用姿势的问题,感兴趣的也可以试试,反馈结果给我。
先加载一个空网页
在从高网页加载低网页的时候,先加载一个空内容,接着立马做相关的处理操作(比如加载新的网页,更改字体等),
// load empty data to shrink the WebView instance
mArticleWebView.loadUrl(Constants.ASSETS_EMPTY);
// load real data
mArticleWebView.loadDataWithBaseURL(null,data,"text/html","utf-8",null);
Constants.ASSETS_EMPTY 仅仅只是一个 String 子串,标识该空网页的位置,所以该变量可以为 “file:///android_asset/Empty.html”.
试了一下,也是不好用的,不知道是不是我的操作问题.
修改 Setting 属性
wv.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
wv.setVerticalScrollBarEnabled(false);
wv.setVerticalScrollbarOverlay(false);
wv.setHorizontalScrollBarEnabled(false);
wv.setHorizontalScrollbarOverlay(false);
通过我们多次的尝试得出:第三种方式是比较合适的,因此大家可以重点借鉴一下第三种方法来解决问题。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
最近要做一个页面,需要 ScrollView 嵌套 WebView,怎么嵌套,怎么解决焦点和 touch 事件冲突,网上一大堆,这里就不赘述了,但是发现 WebView 从一个高度很高的网页加载一个高度很低的网页的时候,高度无法自适应了,造成底部会有一大片的空白,下面来分享一下我们的解决方案。
JS 注入,获取页面内容高度,设置成 WebView 高度
JS 注入,通过前端 JS 调用 native 方法,把高度值传递过来,然后通过 layoutparams 去设置 webview 的高度:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
mWebView.loadUrl("javascript:App.resize(document.body.getBoundingClientRect().height)");
super.onPageFinished(view, url);
}
});
mWebView.addJavascriptInterface(this, "App");
@JavascriptInterface
public void resize(final float height) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//Toast.makeText(getActivity(), height + "", Toast.LENGTH_LONG).show();
//此处的 layoutParmas 需要根据父控件类型进行区分,这里为了简单就不这么做了
mWebView.setLayoutParams(new LinearLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));
}
});
}
需要注意的是上面的 resize 方法一定要上面那么写,写成:
mWebView.getLayoutParams().height = (int) (height * getResources().getDisplayMetrics().density);
这样是无法成功的,看来宽度也是有影响的
感谢 @imesong 同学,这段代码有亮点可以完善的地方:
mWebVew.setLayoutParam() 时,应该根据 WebView 父控件的类型,创建 LayoutParam,或者直接用 mWebView.getLayoutParams() 获取 LayoutParams;
调用 JAVA 方法的 JS ,可以在网页加载完成时自己加载下面这段 JS 代码(区别在于一个是终端处理,一个是前段处理),比如:
(function(w){
window.App.resize(document.body.getBoundingClientRect().height);
})(window);
加载这段 JS 就可以了,“APP” 和上面一样是自己注册是自己注册的接口名字;
思路是一样的,处理方式有差异。
试验不太成功的方式
网上也找到了一些其他的方式,试了一下,不太成功,不知道是不是使用姿势的问题,感兴趣的也可以试试,反馈结果给我。
先加载一个空网页
在从高网页加载低网页的时候,先加载一个空内容,接着立马做相关的处理操作(比如加载新的网页,更改字体等),
// load empty data to shrink the WebView instance
mArticleWebView.loadUrl(Constants.ASSETS_EMPTY);
// load real data
mArticleWebView.loadDataWithBaseURL(null,data,"text/html","utf-8",null);
Constants.ASSETS_EMPTY 仅仅只是一个 String 子串,标识该空网页的位置,所以该变量可以为 “file:///android_asset/Empty.html”.
试了一下,也是不好用的,不知道是不是我的操作问题.
修改 Setting 属性
wv.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
wv.setVerticalScrollBarEnabled(false);
wv.setVerticalScrollbarOverlay(false);
wv.setHorizontalScrollBarEnabled(false);
wv.setHorizontalScrollbarOverlay(false);
通过我们多次的尝试得出:第三种方式是比较合适的,因此大家可以重点借鉴一下第三种方法来解决问题。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
收起阅读 »
uni-app 中实现动态禁用/开启下拉刷新
首先,在 pages.json 中配置目标页面的 style->enablePullDownRefresh 为 true。
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app",
"enablePullDownRefresh": true
}
}
获取当前 Webview 窗口对象:
const pages = getCurrentPages();
const page = pages[pages.length - 1];
const currentWebview = page.$getAppWebview();
根据状态值来切换禁用/开启下拉刷新
currentWebview.setStyle({
pullToRefresh: {
support: !this.isSupport,
style: plus.os.name === 'Android' ? 'circle' : 'default'
}
});
this.isSupport = !this.isSupport;
这里调用 plus 的 API,是在条件编译下进行的。
详细的示例见附件,下载后解压拖至 HBuilderX 运行即可体验。
注意事项
- 此功能仅在 5+App 环境下支持,因此示例中用到了条件编译。
- pages.json 中的 页面->style->enablePullDownRefresh 必须为 true,也就是说初始化时必须是开启状态。
- iOS上,关闭bounce回弹效果,另见bounce相关的配置和API。
参考文档:
首先,在 pages.json 中配置目标页面的 style->enablePullDownRefresh 为 true。
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app",
"enablePullDownRefresh": true
}
}
获取当前 Webview 窗口对象:
const pages = getCurrentPages();
const page = pages[pages.length - 1];
const currentWebview = page.$getAppWebview();
根据状态值来切换禁用/开启下拉刷新
currentWebview.setStyle({
pullToRefresh: {
support: !this.isSupport,
style: plus.os.name === 'Android' ? 'circle' : 'default'
}
});
this.isSupport = !this.isSupport;
这里调用 plus 的 API,是在条件编译下进行的。
详细的示例见附件,下载后解压拖至 HBuilderX 运行即可体验。
注意事项
- 此功能仅在 5+App 环境下支持,因此示例中用到了条件编译。
- pages.json 中的 页面->style->enablePullDownRefresh 必须为 true,也就是说初始化时必须是开启状态。
- iOS上,关闭bounce回弹效果,另见bounce相关的配置和API。
参考文档:
收起阅读 »
力谱云阐述移动APP命名的几大重要原则
> 谈到App命名,一个新的手机APP软件想要为人所知、获得用户,取得一个好名字也十分重要。而手机APP软件的名字一旦确定,尤其是APP定制开发完成继推广之后,再要改名就会是很困难的事情,甚至难于企业改字号。那么,究竟该如何给APP取一个好名字呢?给APP取名字需要注意哪些事项呢?本文小编就将好好
谈谈给一款移动APP取名的时候要注意的五大原则。
一、字数不要太长,要好记好传播
现在不少知名的APP名字都是2-5个字的,所以建议APP字数尽量不要超过5个字,同时也不要有生僻的组合、拗口的发音,关键是要朗朗上口,让人容易记住、好查找、好传播,易于后期推广和运营。
二、追求创意的同时不要忘了明确功能
有些APP在取名字的时候,为了可以追求新颖、个性而忽略了功能定位。不能从字面上一眼看出手机app软件的应用功能,这也是不可取的。也不是说取名时不能追求创意、个性,但是你的APP名字太过于追求创意而忽略明确功能时,你就需要通过其他渠道去让大家了解这款APP,例如,重金去宣传推广。
还有一类APP的名字中前两个字追求创意,后两个字表明应用的性质与功能,清楚交代了应用的功能,这种方式也值得借鉴。
三、舍弃常用词,做到唯一性
如果实在想不到有特点的名字,也不能用太常用的词汇或者组合,如果这样,当用户在搜索的时候,你的APP很可能会被淹没在汪洋大海中。但有的常用高频词组合起来就有唯一性了,这种方法也是可以借鉴的。
四、抓住用户兴趣,调动用户情绪
如果你的APP不用展示品牌,不妨在名字力调动用户情绪。而游戏类的APP在用户没有明确搜索目标时,不妨以好玩来抓住用户兴趣。
五、不要轻易使用创始人名字
有的企业为了让APP的名字具有纪念意义而选择使用创始人的名字来命名,这种方式不太可取,除非在起名字前就将创始人宣传红了,不然你的APP名字辨识度低不利于搜索。
> 谈到App命名,一个新的手机APP软件想要为人所知、获得用户,取得一个好名字也十分重要。而手机APP软件的名字一旦确定,尤其是APP定制开发完成继推广之后,再要改名就会是很困难的事情,甚至难于企业改字号。那么,究竟该如何给APP取一个好名字呢?给APP取名字需要注意哪些事项呢?本文小编就将好好
谈谈给一款移动APP取名的时候要注意的五大原则。
一、字数不要太长,要好记好传播
现在不少知名的APP名字都是2-5个字的,所以建议APP字数尽量不要超过5个字,同时也不要有生僻的组合、拗口的发音,关键是要朗朗上口,让人容易记住、好查找、好传播,易于后期推广和运营。
二、追求创意的同时不要忘了明确功能
有些APP在取名字的时候,为了可以追求新颖、个性而忽略了功能定位。不能从字面上一眼看出手机app软件的应用功能,这也是不可取的。也不是说取名时不能追求创意、个性,但是你的APP名字太过于追求创意而忽略明确功能时,你就需要通过其他渠道去让大家了解这款APP,例如,重金去宣传推广。
还有一类APP的名字中前两个字追求创意,后两个字表明应用的性质与功能,清楚交代了应用的功能,这种方式也值得借鉴。
三、舍弃常用词,做到唯一性
如果实在想不到有特点的名字,也不能用太常用的词汇或者组合,如果这样,当用户在搜索的时候,你的APP很可能会被淹没在汪洋大海中。但有的常用高频词组合起来就有唯一性了,这种方法也是可以借鉴的。
四、抓住用户兴趣,调动用户情绪
如果你的APP不用展示品牌,不妨在名字力调动用户情绪。而游戏类的APP在用户没有明确搜索目标时,不妨以好玩来抓住用户兴趣。
五、不要轻易使用创始人名字
有的企业为了让APP的名字具有纪念意义而选择使用创始人的名字来命名,这种方式不太可取,除非在起名字前就将创始人宣传红了,不然你的APP名字辨识度低不利于搜索。