| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 | 
							- // #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
 
 
  |