You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
343 lines
8.5 KiB
343 lines
8.5 KiB
// #ifdef APP-PLUS |
|
// 复制 |
|
function onCopy(item, shareInfo,callback) { |
|
let copyInfo = shareInfo.shareUrl || shareInfo.shareContent || shareInfo.shareImg; |
|
if (copyInfo) { |
|
uni.setClipboardData({ |
|
data: copyInfo, |
|
success:() => { |
|
uni.showToast({ |
|
title: "已复制到剪贴板", |
|
icon: "none" |
|
}); |
|
callback && callback(item); |
|
} |
|
}); |
|
} |
|
} |
|
// 更多 |
|
function onMore(item, shareInfo,callback) { |
|
plus.share.sendWithSystem({ |
|
type: "text", |
|
title: shareInfo.shareTitle || "", |
|
href: shareInfo.shareUrl || "", |
|
content: shareInfo.shareContent || "", |
|
},function(res){ |
|
callback && callback(item); |
|
},function(err){ |
|
console.log(err); |
|
}); |
|
} |
|
// 分享 |
|
function onShare(item, shareInfo,callback) { |
|
if (shareInfo.type == undefined) { |
|
shareInfo.type = item.type; |
|
} |
|
let shareObj = { |
|
provider: item.provider, |
|
type: shareInfo.type, |
|
success: (res) => { |
|
callback && callback(item); |
|
console.log("success:" + JSON.stringify(res)); |
|
}, |
|
fail: (err) => { |
|
console.log("分享失败,参数缺失 fail:" + JSON.stringify(err)); |
|
} |
|
}; |
|
if (shareInfo.shareTitle) { |
|
shareObj.title = shareInfo.shareTitle; |
|
}else if(item.provider == "qq"){ |
|
uni.showToast({ |
|
title: "缺失分享的标题", |
|
icon: "none" |
|
}); |
|
return; |
|
} |
|
if(shareInfo.type == 0 || item.provider == "qq"){ |
|
if (shareInfo.shareUrl) { |
|
shareObj.href = shareInfo.shareUrl; |
|
}else{ |
|
uni.showToast({ |
|
title: "缺失分享的地址", |
|
icon: "none" |
|
}); |
|
return; |
|
} |
|
} |
|
if([0,1,3,4].includes(shareInfo.type)){ |
|
if (shareInfo.shareContent) { |
|
shareObj.summary = shareInfo.shareContent; |
|
}else{ |
|
uni.showToast({ |
|
title: "缺失分享的描述", |
|
icon: "none" |
|
}); |
|
return; |
|
} |
|
} |
|
if([0,2,5].includes(shareInfo.type)){ |
|
if (shareInfo.shareImg) { |
|
shareObj.imageUrl = shareInfo.shareImg; |
|
}else{ |
|
uni.showToast({ |
|
title: "缺失分享的图片", |
|
icon: "none" |
|
}); |
|
return; |
|
} |
|
} |
|
if([3,4].includes(shareInfo.type)){ |
|
if (shareInfo.mediaUrl) { |
|
shareObj.mediaUrl = shareInfo.mediaUrl; |
|
}else{ |
|
uni.showToast({ |
|
title: "缺失分享的音视频地址", |
|
icon: "none" |
|
}); |
|
return; |
|
} |
|
} |
|
if(shareInfo.type == 5){ |
|
if (shareInfo.appId && shareInfo.appPath && shareInfo.appWebUrl) { |
|
shareObj.miniProgram = { |
|
id:shareInfo.appId, |
|
path:shareInfo.appPath, |
|
webUrl:shareInfo.appWebUrl, |
|
}; |
|
if(shareInfo.appType){ |
|
shareObj.miniProgram.type = shareInfo.appType; |
|
} |
|
}else{ |
|
uni.showToast({ |
|
title: "缺失分享小程序的参数", |
|
icon: "none" |
|
}); |
|
return; |
|
} |
|
} |
|
|
|
if (item.scene) { |
|
shareObj.scene = item.scene; |
|
} |
|
uni.share(shareObj); |
|
} |
|
let otherShareList = [ |
|
{ |
|
icon: "/static/share/icon_copy.png", |
|
text: "复制", |
|
provider: "copy", |
|
onClick: onCopy |
|
}, |
|
{ |
|
icon: "/static/share/icon_more.png", |
|
text: "更多", |
|
provider: "more", |
|
onClick: onMore |
|
} |
|
]; |
|
let platformShareList = []; |
|
// 获取服务商支持的分享 |
|
uni.getProvider({ |
|
service: 'share', |
|
success: function (res) { |
|
if (res.provider.includes('sinaweibo')) { |
|
platformShareList = [{ |
|
icon: "/static/share/icon_weibo.png", |
|
text: "新浪微博", |
|
onClick: onShare, |
|
provider: "sinaweibo", |
|
type: 0 |
|
}].concat(platformShareList); |
|
} |
|
if (res.provider.includes('qq')) { |
|
platformShareList = [{ |
|
icon: "/static/share/icon_qq.png", |
|
text: "QQ", |
|
onClick: onShare, |
|
provider: "qq", |
|
type: 1 |
|
}].concat(platformShareList); |
|
} |
|
if (res.provider.includes('weixin')) { |
|
platformShareList = [{ |
|
icon: "/static/share/icon_weixin.png", |
|
text: "微信好友", |
|
onClick: onShare, |
|
provider: "weixin", |
|
scene: "WXSceneSession", |
|
type: 0 |
|
}, |
|
{ |
|
icon: "/static/share/icon_pengyouquan.png", |
|
text: "朋友圈", |
|
onClick: onShare, |
|
provider: "weixin", |
|
scene: "WXSenceTimeline", |
|
type: 0 |
|
}].concat(platformShareList); |
|
} |
|
} |
|
}); |
|
// 根据type类型过滤掉不支持的平台 |
|
function platformFilter(data){ |
|
if(data.type >= 0 && data.type <= 5){ |
|
let platformList = []; |
|
let supportList = [ |
|
["weixin","sinaweibo"], |
|
["weixin","sinaweibo","qq"], |
|
["weixin","sinaweibo","qq"], |
|
["weixin","qq"], |
|
["weixin","sinaweibo"], |
|
["weixin"], |
|
]; |
|
let currentSupport = supportList[data.type]; |
|
platformShareList.forEach((item,index) => { |
|
if(currentSupport.includes(item.provider)){ |
|
if(data.type == 5){ |
|
if(item.scene == "WXSceneSession"){ |
|
platformList.push(item); |
|
} |
|
} else { |
|
platformList.push(item); |
|
} |
|
} |
|
}); |
|
return platformList.concat(otherShareList); |
|
}else{ |
|
return platformShareList.concat(otherShareList); |
|
} |
|
|
|
} |
|
// 数据处理 |
|
function dataFactory(shareInfo = {}) { |
|
let config = { |
|
...shareInfo |
|
}; |
|
config.shareUrl = shareInfo.shareUrl || ""; |
|
config.shareContent = shareInfo.shareContent || "分享的描述"; |
|
config.shareImg = shareInfo.shareImg || "分享的图片"; |
|
return config; |
|
} |
|
export default function (shareInfo, callback) { |
|
shareInfo = dataFactory(shareInfo); |
|
// 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 |
|
let screenWidth = plus.screen.resolutionWidth |
|
//以360px宽度屏幕为例,上下左右边距及2排按钮边距留25像素,图标宽度55像素,同行图标间的间距在360宽的屏幕是30px,但需要动态计算,以此原则计算4列图标分别的left位置 |
|
//图标下的按钮文字距离图标5像素,文字大小12像素 |
|
//底部取消按钮高度固定为44px |
|
//TODO 未处理横屏和pad,这些情况6个图标应该一排即可 |
|
let marginTop = 25, //上间距 |
|
marginLeft = 25, //左间距 |
|
iconWidth = 55, //图标宽宽 |
|
iconHeight = 55, //图标高度 |
|
icontextSpace = 10, //图标与文字间距 |
|
textHeight = 12 //文字大小 |
|
let left1 = marginLeft / 360 * screenWidth; |
|
let colNumber = Math.floor(screenWidth / (iconWidth + marginLeft)); |
|
let i = (screenWidth - (iconWidth + marginLeft) * colNumber - marginLeft) / (colNumber + 1); |
|
let initMargin = marginLeft + i; |
|
let itemWidth = iconWidth + initMargin; |
|
let itemHeight = iconHeight + icontextSpace + textHeight + marginTop; |
|
let textTop = iconHeight + icontextSpace; |
|
let alphaBg = new plus.nativeObj.View("alphaBg", { //先创建遮罩层 |
|
top: '0px', |
|
left: '0px', |
|
height: '100%', |
|
width: '100%', |
|
backgroundColor: 'rgba(0,0,0,0.5)' |
|
}); |
|
alphaBg.addEventListener("click", function () { //处理遮罩层点击 |
|
alphaBg.hide(); |
|
shareMenu.hide(); |
|
}); |
|
let shareList = platformFilter(shareInfo); |
|
let shareMenu = new plus.nativeObj.View("shareMenu", { //创建底部图标菜单 |
|
bottom: '0px', |
|
left: '0px', |
|
height: Math.ceil(shareList.length / colNumber) * itemHeight + marginTop + 44 + 1 + 'px', |
|
width: '100%', |
|
backgroundColor: 'rgb(255,255,255)' |
|
}); |
|
//绘制底部图标菜单的内容 |
|
shareMenu.draw([{ |
|
tag: 'rect', //菜单顶部的分割灰线 |
|
color: '#e7e7e7', |
|
position: { |
|
top: '0px', |
|
height: '1px' |
|
} |
|
}, |
|
{ |
|
tag: 'font', |
|
id: 'sharecancel', //底部取消按钮的文字 |
|
text: '取消分享', |
|
textStyles: { |
|
size: '14px' |
|
}, |
|
position: { |
|
bottom: '0px', |
|
height: '44px' |
|
} |
|
}, |
|
{ |
|
tag: 'rect', //底部取消按钮的顶部边线 |
|
color: '#e7e7e7', |
|
position: { |
|
bottom: '45px', |
|
height: '1px' |
|
} |
|
} |
|
]); |
|
shareList.map((v, k) => { |
|
let time = new Date().getTime(); |
|
let row = Math.floor(k / colNumber); |
|
let col = k % colNumber; |
|
let item = [{ |
|
src: v.icon, |
|
id: Math.random() * 1000 + time, |
|
tag: "img", |
|
position: { |
|
top: row * itemHeight + marginTop, |
|
left: col * itemWidth + initMargin, |
|
width: iconWidth, |
|
height: iconWidth |
|
} |
|
}, { |
|
text: v.text, |
|
id: Math.random() * 1000 + time, |
|
tag: "font", |
|
textStyles: { |
|
size: textHeight |
|
}, |
|
position: { |
|
top: row * itemHeight + textTop, |
|
left: col * itemWidth + initMargin, |
|
width: iconWidth, |
|
height: iconWidth |
|
} |
|
}]; |
|
shareMenu.draw(item); |
|
}); |
|
shareMenu.addEventListener("click", function (e) { //处理底部图标菜单的点击事件,根据点击位置触发不同的逻辑 |
|
if (e.screenY > plus.screen.resolutionHeight - 44) { //点击了底部取消按钮 |
|
alphaBg.hide(); |
|
shareMenu.hide(); |
|
} else if (e.clientX < 5 || e.clientX > screenWidth - 5 || e.clientY < 5) { |
|
//屏幕左右边缘5像素及菜单顶部5像素不处理点击 |
|
} else { //点击了图标按钮 |
|
let x = e.clientX; |
|
let y = e.clientY; |
|
let colIdx = Math.floor(x / itemWidth); |
|
let rowIdx = Math.floor(y / itemHeight); |
|
let tapIndex = colIdx + rowIdx * colNumber; |
|
shareList[tapIndex].onClick(shareList[tapIndex], shareInfo,callback); |
|
} |
|
}); |
|
alphaBg.show(); |
|
shareMenu.show(); |
|
return { |
|
alphaBg, |
|
shareMenu |
|
}; |
|
}; |
|
// #endif
|