
uni APP自动更新并安装
data:function(){
return{
version:1
}
},
onLoad: function () {
uni.getSystemInfo({
success:(res) => {
console.log(res.platform);
//检测当前平台,如果是安卓则启动安卓更新
if(res.platform=="android"){
this.AndroidCheckUpdate();
}
}
})
},
methods: {
AndroidCheckUpdate:function(){
var _this=this;
uni.request({
url: 'http://xxxx.com/version.txt',
method: 'GET',
data: {},
success: res => {
if(res.data>this.version){
if(plus.networkinfo.getCurrentType()!=3){
uni.showToast({
title: '有新的版本发布,检测到您目前非Wifi连接,为节约您的流量,程序已停止自动更新,将在您连接WIFI之后重新检测更新。',
mask: false,
duration: 5000,
icon:"none"
});
return;
}
uni.showToast({
title: '有新的版本发布,检测到您目前为Wifi连接,程序已启动自动更新。新版本下载完成后将自动弹出安装程序。',
mask: false,
duration: 5000,
icon:"none"
});
var dtask = plus.downloader.createDownload( "http://xxxx.com/app.apk", {}, function ( d, status ) {
// 下载完成
if ( status == 200 ) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){
uni.showToast({
title: '安装失败',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败',
mask: false,
duration: 1500
});
}
});
dtask.start();
}
},
fail: () => {},
complete: () => {}
});
},
}
data:function(){
return{
version:1
}
},
onLoad: function () {
uni.getSystemInfo({
success:(res) => {
console.log(res.platform);
//检测当前平台,如果是安卓则启动安卓更新
if(res.platform=="android"){
this.AndroidCheckUpdate();
}
}
})
},
methods: {
AndroidCheckUpdate:function(){
var _this=this;
uni.request({
url: 'http://xxxx.com/version.txt',
method: 'GET',
data: {},
success: res => {
if(res.data>this.version){
if(plus.networkinfo.getCurrentType()!=3){
uni.showToast({
title: '有新的版本发布,检测到您目前非Wifi连接,为节约您的流量,程序已停止自动更新,将在您连接WIFI之后重新检测更新。',
mask: false,
duration: 5000,
icon:"none"
});
return;
}
uni.showToast({
title: '有新的版本发布,检测到您目前为Wifi连接,程序已启动自动更新。新版本下载完成后将自动弹出安装程序。',
mask: false,
duration: 5000,
icon:"none"
});
var dtask = plus.downloader.createDownload( "http://xxxx.com/app.apk", {}, function ( d, status ) {
// 下载完成
if ( status == 200 ) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){
uni.showToast({
title: '安装失败',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败',
mask: false,
duration: 1500
});
}
});
dtask.start();
}
},
fail: () => {},
complete: () => {}
});
},
}
收起阅读 »

一周 D 报(2018-10-15)
HBuilderX 自公测起,历经 50 个版本的迭代,终于迎来了 1.0 版本的正式发布。详见:http://ask.dcloud.net.cn/article/13507
uni-app
- 内置地图更新为原生的高德地图后,层级和覆盖物的问题。:可以暂时使用问题中回复的方案,后面会支持 cover-view 来更方便地处理。
- uni-app 不支持右滑关闭页面么? iOS 平台是支持的不需要额外配置,Android 平台不支持。
- uni-app 有没有小程序中的 live-pusher 类似组件? 相关的组件等内容,还未完善。
- uni-app 如何获取应用的 version? App 平台下需要调用 plus.runtime.version 来获取,参考 hello uni-app 的 App.vue。小程序的升级是小程序云服务统一管理的,不存在应用版本号的概念。
- uni-app 中可以使用 Vant 的小程序库么? uni-app 中支持使用小程序的组件,详见文档:小程序组件支持。
- uni.getStorageInfo 的支持:App 平台还未支持此 API。
- nvue 文件里import,无法使用uni-app内置文件:其实这个问题的重点在于如何实现 nvue 和 vue 的数据共享。因为 uni-app 中 vue 和 nvue 是两个独立的环境,并不能完全通用。只有部分 uni 的 API 是可以通用的,因此需要使用 uni.storage 相关的 API 来实现数据的共享。
- uni-app请问如何隐藏滚动条,能否使用5+api:可以在 app-plus 中配置,详见问题回复。
其它问题
- 语音识别可以选择百度的语音引擎吗:下载更新 HBuilderX,并且设置 engine: 'baidu' 即可。
- 提交app到谷歌商城的时候,提示api为21要把api提升到26,请问怎么提升api:manifest.json 中配置 Android 的 targetSdkVersion 为 26。
开源与分享
- 在 web-view 加载的 HTML 中调用 uni 的 API:uni-app 支持 web-view 与应用内页面的切换了。
- uni-app 中使用微信小程序第三方 SDK 及资源汇总:uni-app 中使用小程序的第三方 SDK,在 App 上同样可用。
- uni-app 中使用地图时打包需勾选填写 SDK 信息:最新版的 uni-app 内置地图切换成了原生的高德地图,因此想在 App 上时候,打包时必须勾选权限并填写相关的 key 信息。
- 分享 PHP后端 + APP前端工程 实例-H5资讯APP , 开源工程下载@王者地带
更多分享,请前往 精华区 查看。
欢迎更多的同学参与进来,分享自己的经验心得。
结束
本期周报就到这里,感谢大家的阅读。新的一周,祝大家工作顺利。
HBuilderX 自公测起,历经 50 个版本的迭代,终于迎来了 1.0 版本的正式发布。详见:http://ask.dcloud.net.cn/article/13507
uni-app
- 内置地图更新为原生的高德地图后,层级和覆盖物的问题。:可以暂时使用问题中回复的方案,后面会支持 cover-view 来更方便地处理。
- uni-app 不支持右滑关闭页面么? iOS 平台是支持的不需要额外配置,Android 平台不支持。
- uni-app 有没有小程序中的 live-pusher 类似组件? 相关的组件等内容,还未完善。
- uni-app 如何获取应用的 version? App 平台下需要调用 plus.runtime.version 来获取,参考 hello uni-app 的 App.vue。小程序的升级是小程序云服务统一管理的,不存在应用版本号的概念。
- uni-app 中可以使用 Vant 的小程序库么? uni-app 中支持使用小程序的组件,详见文档:小程序组件支持。
- uni.getStorageInfo 的支持:App 平台还未支持此 API。
- nvue 文件里import,无法使用uni-app内置文件:其实这个问题的重点在于如何实现 nvue 和 vue 的数据共享。因为 uni-app 中 vue 和 nvue 是两个独立的环境,并不能完全通用。只有部分 uni 的 API 是可以通用的,因此需要使用 uni.storage 相关的 API 来实现数据的共享。
- uni-app请问如何隐藏滚动条,能否使用5+api:可以在 app-plus 中配置,详见问题回复。
其它问题
- 语音识别可以选择百度的语音引擎吗:下载更新 HBuilderX,并且设置 engine: 'baidu' 即可。
- 提交app到谷歌商城的时候,提示api为21要把api提升到26,请问怎么提升api:manifest.json 中配置 Android 的 targetSdkVersion 为 26。
开源与分享
- 在 web-view 加载的 HTML 中调用 uni 的 API:uni-app 支持 web-view 与应用内页面的切换了。
- uni-app 中使用微信小程序第三方 SDK 及资源汇总:uni-app 中使用小程序的第三方 SDK,在 App 上同样可用。
- uni-app 中使用地图时打包需勾选填写 SDK 信息:最新版的 uni-app 内置地图切换成了原生的高德地图,因此想在 App 上时候,打包时必须勾选权限并填写相关的 key 信息。
- 分享 PHP后端 + APP前端工程 实例-H5资讯APP , 开源工程下载@王者地带
更多分享,请前往 精华区 查看。
欢迎更多的同学参与进来,分享自己的经验心得。
结束
本期周报就到这里,感谢大家的阅读。新的一周,祝大家工作顺利。

这个uniapp的api和组件太像小程序了有没有
这个api和组件太像小程序了有没有
不过还是比较喜欢的,没有更多额外学习成本
这个api和组件太像小程序了有没有
不过还是比较喜欢的,没有更多额外学习成本

2020承接外包,长期有效,uniapp、web、php、微信
经济不景气,全栈程序员接外包补贴房贷。
可接uniapp、网站,微信小程序、logo海报、等平面设计(有团队),付费解决问题。
不管有没有需求欢迎qq微信骚扰。
qq:50401716
微信:

5+案例(资讯,淘宝客,即时聊天):
https://m3w.cn/aihanfu
https://m3w.cn/dsg
一些案例图片:
网站及设计案例请加qq微信查看~
经济不景气,全栈程序员接外包补贴房贷。
可接uniapp、网站,微信小程序、logo海报、等平面设计(有团队),付费解决问题。
不管有没有需求欢迎qq微信骚扰。
qq:50401716
微信:
5+案例(资讯,淘宝客,即时聊天):
https://m3w.cn/aihanfu
https://m3w.cn/dsg
一些案例图片:
网站及设计案例请加qq微信查看~
收起阅读 »
小程序开发费用,2018年的小程序开发费用
现在常见的郑州小程序开发方式主要有以下三种,小程序开发费用通常是根据功能需求以及开发难度等因素决定,目前来说只有一个大致的价格区间,很多投资者在询问价格时,无法得到明确答复就是因为这些原因,而定制开发的小程序所需费用是三种开发方式中比较贵的。下面来详细的跟大家分析一下各种开发方式所对应的小程序开发区别吧。
1、定制类小程序开发
这类小程序所需的开发费用一般在一万以上,因为定制开发类的小程序可以满足企业自身的个性化需求的功能,从事这类定制类小程序开发公司通常会由产品经理、核心技术人员等团队成员和客户详细沟通需求,然后提供相应的报价和解决方案,定制类小程序在完成开发后,功能使用往往比较贴合客户需求。
2、模板开发方式
小程序开发公司一般要会根据不同的行业分类开发出一些固定的模板,一个模板同时可以卖给成千上万的客户,这种开发方式对于开发商来说利润很高,对用户而言所付出的成本也相对于低,但是这种开发方式弊端,就是无法修改模板,只是把小程序按年租售,同时也会存在部分功能无法实现又承载过多一些多余功能的情况,这类小程序的售后服务通常也不完善。
3、开发各类常用模板的开发公司
这类公司主要是开发一些常用的功能模板,与模板类不同的是,客户可以根据自己的需求来选择不同的功能进行组合,价格相对也会高一些,一般在几千到一万元以内,这类开发小程序虽然有一定的选择性,但功能并不能完全实现个性化定制。
小程序开发需要多少费用?这是所有企业和个体商家关注的焦点,首先无论是哪一类型的小程序,开发费用都相对较低,但是不同类型的小程序根据用户的功能需求的不同,会导致开发费用有所差异,一般价格区间在几千到几万之间,小程序的开发费用是可以根据其开发方式推算出大概的预算方案,所以具体还是要跟开发公司协商才行。
本文由专业的郑州小程序开发(http://www.appsaa.com)燚轩科技整理发布,如需转载请注明出处。
现在常见的郑州小程序开发方式主要有以下三种,小程序开发费用通常是根据功能需求以及开发难度等因素决定,目前来说只有一个大致的价格区间,很多投资者在询问价格时,无法得到明确答复就是因为这些原因,而定制开发的小程序所需费用是三种开发方式中比较贵的。下面来详细的跟大家分析一下各种开发方式所对应的小程序开发区别吧。
1、定制类小程序开发
这类小程序所需的开发费用一般在一万以上,因为定制开发类的小程序可以满足企业自身的个性化需求的功能,从事这类定制类小程序开发公司通常会由产品经理、核心技术人员等团队成员和客户详细沟通需求,然后提供相应的报价和解决方案,定制类小程序在完成开发后,功能使用往往比较贴合客户需求。
2、模板开发方式
小程序开发公司一般要会根据不同的行业分类开发出一些固定的模板,一个模板同时可以卖给成千上万的客户,这种开发方式对于开发商来说利润很高,对用户而言所付出的成本也相对于低,但是这种开发方式弊端,就是无法修改模板,只是把小程序按年租售,同时也会存在部分功能无法实现又承载过多一些多余功能的情况,这类小程序的售后服务通常也不完善。
3、开发各类常用模板的开发公司
这类公司主要是开发一些常用的功能模板,与模板类不同的是,客户可以根据自己的需求来选择不同的功能进行组合,价格相对也会高一些,一般在几千到一万元以内,这类开发小程序虽然有一定的选择性,但功能并不能完全实现个性化定制。
小程序开发需要多少费用?这是所有企业和个体商家关注的焦点,首先无论是哪一类型的小程序,开发费用都相对较低,但是不同类型的小程序根据用户的功能需求的不同,会导致开发费用有所差异,一般价格区间在几千到几万之间,小程序的开发费用是可以根据其开发方式推算出大概的预算方案,所以具体还是要跟开发公司协商才行。
本文由专业的郑州小程序开发(http://www.appsaa.com)燚轩科技整理发布,如需转载请注明出处。
收起阅读 »
Anroid 6.0 动态权限申请代码分享
/*
正常权限,无需动态申请:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
2)危险权限,需要动态申请:
group:android.permission-group.STORAGE
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
group:android.permission-group.CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
READ_CONTACTS
group:android.permission-group.PHONE
READ_CALL_LOG
READ_PHONE_STATE
CALL_PHONE
WRITE_CALL_LOG
USE_SIP
PROCESS_OUTGOING_CALLS
com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
READ_CALENDAR
WRITE_CALENDAR
group:android.permission-group.CAMERA
CAMERA
group:android.permissiongroup.SENSORS
BODY_SENSORS
group:android.permission-group.LOCATION
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
group:android.permission-group.MICROPHONE
RECORD_AUDIO
group:android.permission-group.SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
RECEIVE_SMS
SEND_SMS
READ_CELL_BROADCASTS
*/
/**
* Me:
* cnscn <214363570@qq.com>
*
* 参考:
* https://blog.csdn.net/lvyoujt/article/details/52826556
* https://developer.android.com/reference/android/Manifest.permission
* https://developer.android.com/reference/android/os/Build.VERSION
*/
function plusReady() {
var Build = plus.android.importClass("android.os.Build");
var Manifest = plus.android.importClass("android.Manifest");
var MainActivity = plus.android.runtimeMainActivity();
//var context=main.getApplicationContext(); //未用到,在此仅供参考
var ArrPermissions = [
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
];
function PermissionCheck(permission) {
if (Build.VERSION.SDK_INT >= 23) {
if (MainActivity.checkSelfPermission(permission) == -1) {
return false;
}
}
return true;
}
function PermissionChecks(Arr) {
var HasPermission = true;
for (var index in Arr) {
var permission = Arr[index];
//如果此处没有权限,则是用户拒绝了
if (!PermissionCheck(permission)) {
HasPermission = false;
break;
}
}
return HasPermission;
}
function PermissionRequest(Arr) {
var REQUEST_CODE_CONTACT = 101;
if (Build.VERSION.SDK_INT >= 23) {
MainActivity.requestPermissions(Arr, REQUEST_CODE_CONTACT);
}
}
//如果没有权限,则申请
if (!PermissionChecks(ArrPermissions)) {
PermissionRequest(ArrPermissions);
} else { //如果拥有权限,那么干点啥吧^_^
//.......
}
}
if (window.plus) {
plusReady();
} else {
document.addEventListener('plusready', plusReady, false);
}
/*
正常权限,无需动态申请:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
2)危险权限,需要动态申请:
group:android.permission-group.STORAGE
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
group:android.permission-group.CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
READ_CONTACTS
group:android.permission-group.PHONE
READ_CALL_LOG
READ_PHONE_STATE
CALL_PHONE
WRITE_CALL_LOG
USE_SIP
PROCESS_OUTGOING_CALLS
com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
READ_CALENDAR
WRITE_CALENDAR
group:android.permission-group.CAMERA
CAMERA
group:android.permissiongroup.SENSORS
BODY_SENSORS
group:android.permission-group.LOCATION
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
group:android.permission-group.MICROPHONE
RECORD_AUDIO
group:android.permission-group.SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
RECEIVE_SMS
SEND_SMS
READ_CELL_BROADCASTS
*/
/**
* Me:
* cnscn <214363570@qq.com>
*
* 参考:
* https://blog.csdn.net/lvyoujt/article/details/52826556
* https://developer.android.com/reference/android/Manifest.permission
* https://developer.android.com/reference/android/os/Build.VERSION
*/
function plusReady() {
var Build = plus.android.importClass("android.os.Build");
var Manifest = plus.android.importClass("android.Manifest");
var MainActivity = plus.android.runtimeMainActivity();
//var context=main.getApplicationContext(); //未用到,在此仅供参考
var ArrPermissions = [
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
];
function PermissionCheck(permission) {
if (Build.VERSION.SDK_INT >= 23) {
if (MainActivity.checkSelfPermission(permission) == -1) {
return false;
}
}
return true;
}
function PermissionChecks(Arr) {
var HasPermission = true;
for (var index in Arr) {
var permission = Arr[index];
//如果此处没有权限,则是用户拒绝了
if (!PermissionCheck(permission)) {
HasPermission = false;
break;
}
}
return HasPermission;
}
function PermissionRequest(Arr) {
var REQUEST_CODE_CONTACT = 101;
if (Build.VERSION.SDK_INT >= 23) {
MainActivity.requestPermissions(Arr, REQUEST_CODE_CONTACT);
}
}
//如果没有权限,则申请
if (!PermissionChecks(ArrPermissions)) {
PermissionRequest(ArrPermissions);
} else { //如果拥有权限,那么干点啥吧^_^
//.......
}
}
if (window.plus) {
plusReady();
} else {
document.addEventListener('plusready', plusReady, false);
}
收起阅读 »

小程序开发之插件功能的有效实现方法
我们在做小程序开发时,比如说在编辑器里里面编辑了一段内容,输出网页版只需要htmlspecialchars_decode()函数就可以搞定了,但是输出小程序就并不是那么简单了,必须要使用wxParse插件才能完成。下面跟大家分享一下导入插件的使用方法:
在wxml中引入,代码如下:
{{title}}
在wcss中引入,代码如下:
@import "/wxParse/wxParse.wxss";
.title{
/ border:solid #000 1rpx; /
width: 100% ;
text-align: center;
background-color: #fff;
font-size: 30rpx;
height:80rpx;
line-height: 80rpx;
}
.content{
/ border:solid #000 1rpx; /
width: 100% ;
margin-top:20rpx;
height: 100%;
background-color: #fff;
font-size: 25rpx;
padding:20rpx;
}
在js中引入,代码如下:
// pages/helpcontent/helpcontent.js
var WxParse = require('../../wxParse/wxParse.js');
Page({
/**
- 页面的初始数据
*/
data: {
},
/**
- 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that=this
wx.request({
url: 'https://www.appsaa.com', //仅为示例,并非真实的接口地址
header: {
'content-type': 'application/json'
},
success: function (res) {
console.log(res.data.title)
that.setData({
title: res.data.title,//第一个data为固定用法,第二个data是json中的data
infos: WxParse.wxParse('infos', 'html', res.data.infos, that, 5)
})
}
})
}
那么到这里就结束了,大家现在可以尝试一下了,如果还是存在有不理解或者不清楚的地方,都是可以留言咨询我们的。
本文由专业的郑州小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
我们在做小程序开发时,比如说在编辑器里里面编辑了一段内容,输出网页版只需要htmlspecialchars_decode()函数就可以搞定了,但是输出小程序就并不是那么简单了,必须要使用wxParse插件才能完成。下面跟大家分享一下导入插件的使用方法:
在wxml中引入,代码如下:
{{title}}
在wcss中引入,代码如下:
@import "/wxParse/wxParse.wxss";
.title{
/ border:solid #000 1rpx; /
width: 100% ;
text-align: center;
background-color: #fff;
font-size: 30rpx;
height:80rpx;
line-height: 80rpx;
}
.content{
/ border:solid #000 1rpx; /
width: 100% ;
margin-top:20rpx;
height: 100%;
background-color: #fff;
font-size: 25rpx;
padding:20rpx;
}
在js中引入,代码如下:
// pages/helpcontent/helpcontent.js
var WxParse = require('../../wxParse/wxParse.js');
Page({
/**
- 页面的初始数据
*/
data: {
},
/**
- 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that=this
wx.request({
url: 'https://www.appsaa.com', //仅为示例,并非真实的接口地址
header: {
'content-type': 'application/json'
},
success: function (res) {
console.log(res.data.title)
that.setData({
title: res.data.title,//第一个data为固定用法,第二个data是json中的data
infos: WxParse.wxParse('infos', 'html', res.data.infos, that, 5)
})
}
})
}
那么到这里就结束了,大家现在可以尝试一下了,如果还是存在有不理解或者不清楚的地方,都是可以留言咨询我们的。
本文由专业的郑州小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处。
收起阅读 »
mui 如何禁用下拉刷新
down: {
height: '50px',
range: '80px',
contentdown: "下拉可以刷新", //可选,在下拉可刷新状态时,下拉刷新控件上显示的标题内容
contentover: "释放立即刷新", //可选,在释放可刷新状态时,下拉刷新控件上显示的标题内容
contentrefresh: "正在刷新...", //可选,正在刷新状态时,下拉刷新控件上显示的标题内容
//style: "circle",
color: '#f78000',
callback: downFn // 下拉执行函数
},
注释 //style: "circle",
这个方法安卓可以 ios还是有下拉的样式
可以全部注释,或者不加
down: {
height: '50px',
range: '80px',
contentdown: "下拉可以刷新", //可选,在下拉可刷新状态时,下拉刷新控件上显示的标题内容
contentover: "释放立即刷新", //可选,在释放可刷新状态时,下拉刷新控件上显示的标题内容
contentrefresh: "正在刷新...", //可选,正在刷新状态时,下拉刷新控件上显示的标题内容
//style: "circle",
color: '#f78000',
callback: downFn // 下拉执行函数
},
注释 //style: "circle",
这个方法安卓可以 ios还是有下拉的样式
可以全部注释,或者不加

小程序开发如何实现视频或音频自定义可拖拽进度条
程序原生组件的音频播放时并没有进度条的显示,而此次在我们所接的项目中,鉴于原生的视频进度条样式太丑,产品要求做一个可拖拽的进度条满足需求。视频和音频提供的api大致是相似的,可以根据以下代码修改为与音频相关的进度条。
wxml的结构如下:
<video id="myVideo" src="http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400" enable-danmu danmu-btn controls="{{false}}" autoplay='{{true}}' bindtimeupdate="videoUpdate" objectFit="fill"></video>
<view class='process-container'>
<image src='{{playStates ? "../../assets/image/pause_icon.png" : "../../assets/image/play_icon.png"}}' class='video-controls-icon' bindtap='videoOpreation'></image>
<view class='slider-container'>
<slider bindchange="sliderChange" bindchanging="sliderChanging" step="1" value="{{sliderValue}}" backgroundColor="#A8A8A8" activeColor="#FFEE83" block-color="#FFEE83" />
</view>
</view>
data中初始化了sliderValue, updateState, playStates几个变量。
data: {
sliderValue: 0, //控制进度条slider的值,
updateState: false, //防止视频播放过程中导致的拖拽失效
playStates: true //控制播放 & 暂停按钮的显示
},
onReady: function () {
this.videoContext = wx.createVideoContext('myVideo');
this.setData({
updateState: true
})
},
videoUpdate在播放进度变化时触发,触发频率 250ms 一次。event.detail = {currentTime, duration},currentTime表示当前时间,duration表示总时长,都以秒为单位
videoUpdate(e) {
if (this.data.updateState) { //判断拖拽完成后才触发更新,避免拖拽失效
let sliderValue = e.detail.currentTime / e.detail.duration * 100;
this.setData({
sliderValue,
duration: e.detail.duration
})
}
},
进度条可拖拽并指定视频跳转到相应的位置
sliderChanging(e) {
this.setData({
updateState: false //拖拽过程中,不允许更新进度条
})
},
sliderChange(e) {
if (this.data.duration) {
this.videoContext.seek(e.detail.value / 100 * this.data.duration); //完成拖动后,计算对应时间并跳转到指定位置
this.setData({
sliderValue: e.detail.value,
updateState: true //完成拖动后允许更新滚动条
})
}
},
暂停/播放视频
videoOpreation() {
this.data.playStates ? this.videoContext.pause() : this.videoContext.play();
this.setData({
playStates: !this.data.playStates
})
}
总结:slider的最大值为100, step的值最小为1,这会导致视频或音频播放时间过长的时候,slider滑块移动速度很慢,拖拽移动的时间间隔较大,用户体验差。如果还是有不理解的地方,可以留言咨询。
本文由专业的郑州小程序开发公司燚轩科技整理发布,如需转载请注明出处。
程序原生组件的音频播放时并没有进度条的显示,而此次在我们所接的项目中,鉴于原生的视频进度条样式太丑,产品要求做一个可拖拽的进度条满足需求。视频和音频提供的api大致是相似的,可以根据以下代码修改为与音频相关的进度条。
wxml的结构如下:
<video id="myVideo" src="http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400" enable-danmu danmu-btn controls="{{false}}" autoplay='{{true}}' bindtimeupdate="videoUpdate" objectFit="fill"></video>
<view class='process-container'>
<image src='{{playStates ? "../../assets/image/pause_icon.png" : "../../assets/image/play_icon.png"}}' class='video-controls-icon' bindtap='videoOpreation'></image>
<view class='slider-container'>
<slider bindchange="sliderChange" bindchanging="sliderChanging" step="1" value="{{sliderValue}}" backgroundColor="#A8A8A8" activeColor="#FFEE83" block-color="#FFEE83" />
</view>
</view>
data中初始化了sliderValue, updateState, playStates几个变量。
data: {
sliderValue: 0, //控制进度条slider的值,
updateState: false, //防止视频播放过程中导致的拖拽失效
playStates: true //控制播放 & 暂停按钮的显示
},
onReady: function () {
this.videoContext = wx.createVideoContext('myVideo');
this.setData({
updateState: true
})
},
videoUpdate在播放进度变化时触发,触发频率 250ms 一次。event.detail = {currentTime, duration},currentTime表示当前时间,duration表示总时长,都以秒为单位
videoUpdate(e) {
if (this.data.updateState) { //判断拖拽完成后才触发更新,避免拖拽失效
let sliderValue = e.detail.currentTime / e.detail.duration * 100;
this.setData({
sliderValue,
duration: e.detail.duration
})
}
},
进度条可拖拽并指定视频跳转到相应的位置
sliderChanging(e) {
this.setData({
updateState: false //拖拽过程中,不允许更新进度条
})
},
sliderChange(e) {
if (this.data.duration) {
this.videoContext.seek(e.detail.value / 100 * this.data.duration); //完成拖动后,计算对应时间并跳转到指定位置
this.setData({
sliderValue: e.detail.value,
updateState: true //完成拖动后允许更新滚动条
})
}
},
暂停/播放视频
videoOpreation() {
this.data.playStates ? this.videoContext.pause() : this.videoContext.play();
this.setData({
playStates: !this.data.playStates
})
}
总结:slider的最大值为100, step的值最小为1,这会导致视频或音频播放时间过长的时候,slider滑块移动速度很慢,拖拽移动的时间间隔较大,用户体验差。如果还是有不理解的地方,可以留言咨询。
本文由专业的郑州小程序开发公司燚轩科技整理发布,如需转载请注明出处。
收起阅读 »
doodoo.js配置教程
Doodoo.js -- 中文最佳实践Node.js Web快速开发框架。支持Koa.js, Express.js中间件,支持模块化,插件,钩子机制,可以直接在项目里使用 ES6/7(Generator Function, Class, Async & Await)等特性 https://www.doodooke.com
配置
doodoo配置.env 文件位于项目根目录下,作为全局默认环境配置文件。
# 应用配置
APP_ROOT=app
APP_PORT=3000
APP_HOST=127.0.0.1
# MYSQL数据库链接
MYSQL=false
MYSQL_HOST=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_DATABASE=doodoo
MYSQL_PORT=3306
MYSQL_CHARSET=utf8mb4
# MONGODB数据库链接
MONGOOSE=false
MONGOOSE_URI=mongodb://127.0.0.1:27017/doodoo
# REDIS链接
REDIS=false
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PREFIX=doodoo:
# 静态资源服务
STATIC_DIR=www
STATIC_MAXAGE=30 * 24 * 60 * 60
STATIC_DYNAMIC=true
支持根据不同环境加载不同的配置文件(自定义文件配置将覆盖全局默认环境配置)
# 创建docker.env文件
touch docker.env
# 自定义docker环境启动
NODE_ENV=docker node app.js
Doodoo.js -- 中文最佳实践Node.js Web快速开发框架。支持Koa.js, Express.js中间件,支持模块化,插件,钩子机制,可以直接在项目里使用 ES6/7(Generator Function, Class, Async & Await)等特性 https://www.doodooke.com
配置
doodoo配置.env 文件位于项目根目录下,作为全局默认环境配置文件。
# 应用配置
APP_ROOT=app
APP_PORT=3000
APP_HOST=127.0.0.1
# MYSQL数据库链接
MYSQL=false
MYSQL_HOST=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_DATABASE=doodoo
MYSQL_PORT=3306
MYSQL_CHARSET=utf8mb4
# MONGODB数据库链接
MONGOOSE=false
MONGOOSE_URI=mongodb://127.0.0.1:27017/doodoo
# REDIS链接
REDIS=false
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PREFIX=doodoo:
# 静态资源服务
STATIC_DIR=www
STATIC_MAXAGE=30 * 24 * 60 * 60
STATIC_DYNAMIC=true
支持根据不同环境加载不同的配置文件(自定义文件配置将覆盖全局默认环境配置)
# 创建docker.env文件
touch docker.env
# 自定义docker环境启动
NODE_ENV=docker node app.js
收起阅读 »