APICloud(二):选择一张或多张图片

静态页面和效果就拿微信的发朋友圈的界面来说吧,长按“相机”图标、或者点击“添加图片的+按钮”时假设触发的事件为addPic。

一、事件触发:addPic

/**
 *点击添加图片的图标时触发该事件,该事件用来弹出框让选择是从相册中添加数据还是拍照
 *  */
function addPic(){	
    //从底部弹出框让选择是通过相册拍照还是从相册中选择
	api.actionSheet({
	    title: '添加图片',
	    cancelTitle: '取消',
	    //destructiveTitle: '红色警告按钮',//红色警示按钮标题,一般用于做一些删除之类操作
	    buttons: ['拍摄','从相册选择']
	}, function(ret, err) {			    
	    //ret.buttonIndex:1、拍摄 2、从相册选择 3、取消
	    if(ret.buttonIndex==3){//取消
	    	return false;
	    }
	    if(ret.buttonIndex==1){//1-拍摄
	    	getPictureByCamera();
	    }else{//从相册中选择
	    	getPictureByAlbum();
	    }
	});	
}

api.actionSheet()用来从底部弹出一个框,具体弹出内容可以通过buttons来设置,具体用法和操作可以参考APICloud的官网说明。(PS:这个方法很有用)

二、通过拍照来获取图片(也就是选择一张图片)

function getPictureByCamera(){
	api.getPicture({
	    sourceType: "camera",//图片源类型,从相册、图片库或相机获取图片,可选项:camera/library/album 默认library
	    encodingType: 'png',//返回图片类型,jpg或png,默认值png
	    mediaValue: 'pic',//媒体类型,图片或视频,可选项:pic-图片 video-视频 all-图片和视频,Android不支持默认pic
	    destinationType: 'url',//返回数据类型,指定返回图片地址或图片经过base64编码后的字符串,可选项:base64/url 
	    allowEdit: false,//是否可以选择图片后进行编辑,支持iOS及部分安卓手机,默认值false
	    //quality: 50,//图片质量,只针对jpg格式图片(0-100整数)
	    targetWidth: 100,//压缩后的图片宽度,图片会按比例适配此宽度,默认值:原图宽度
	    targetHeight: 100,
	    saveToPhotoAlbum: false//拍照或录制视频后是否保存到相册,默认值false
	}, function(ret, err) {
	    if (ret) {
	        if(ret.data.length>0){//拍摄完成取消时,会返回该方法,但是ret.data为空
		        var img = "<a href='javascript:void(0);' class='add_pic' onclick='previewThePic(this);'><img src='"+ret.data+"' /></a>";
		        $("#picList").append(img);//将选择的图片显示出来
		                    
	            if($("#picList").children().length==maxImgCount){//达到显示总数了,那么+按钮隐藏
	            	$("#addPicBtn").hide();//添加图片用的+按钮隐藏
	            }  
	        }            
        }    
	});   
}

注:maxImgCount为发表一个朋友圈最多允许使用的图片数量,我这里是9张。

picList为显示图片的DIV。

addPicBtn为添加图片用的+按钮。

getPicture()方法主要用来用户单张图片,具体用法也可以参考官网。

三、从图册中选择多张图片

这个需要用到一个模块UIMediaScanner,需要在模块库中找到并添加到项目中,然后云编译一下。

添加模块之后测试就不能再使用APICloud官方的APPLoader,因为它没有带我们自己添加的模块。这时候就需要自定义loader。也很简单,在APICloud studio(或者其他APICloud开发工具)中右键项目---->编译自定义loader,它就会自己编译,等编译完成后悔返回一个二维码,扫一扫下载自定义的loader并安装到手机,就可以使用添加的模块了。

注意:自定义的loader有效期为7天,7天过后需要再次编译。而且每次添加模块都要重新编译一下,添加代码不需要重新编译,WIFI同步就能看到效果的。

自定义loader先说到这里,接着说多图片选择。

/**
 *该方法用来弹出框选择图片 * 
 *  */
function getPictureByAlbum(){	 
	//UIMediaScanner 是一个多媒体扫描器,可扫描系统的图片、视频等多媒体资源 
    var obj = api.require('UIMediaScanner');
    var imgCount = 9;//默认选9张
    //还能选择几张
    imgCount = maxImgCount-$("#picList").children().length;    
    //alert(imgCount+"\n"+(maxImgCount-imgCount));
    obj.open({
        //返回的资源种类,picture(图片),video(视频),all(图片和视频)
        type: 'picture',
        //(可选项)图片显示的列数,须大于1
        column: 3,
        max: imgCount,//一次性最多选择几张图片,默认为一次最多选择5张。
        //sort:(可选项)图片排序方式,asc(旧->新),desc(新->旧)
        sort: {
            key: 'time',//按照图片创建时间从新到旧排序
            order: 'desc'
        },
        //(可选项)模块各部分的文字内容
        texts: {
            stateText: '已选择*项',
            cancelText: '取消',
            finishText: '完成'
        },
        styles: {
            bg: '#fff',
            mark: {
                icon: '',
                //position: 'bottom_right',
                position:'top_right',
                size: 20
            },
            nav: {
                bg: '#eee',
                stateColor: '#000',
                stateSize: 18,
                cancleBg: 'rgba(0,0,0,0)',
                cancelColor: '#000',
                cancelSize: 18,
                finishBg: 'rgba(0,0,0,0)',
                finishColor: '#000',
                finishSize: 18
            }
        },
     exchange:true,//是否交换‘确定’和‘取消’按钮的位置(默认‘取消’按钮在右边,‘确定’按钮在左边),默认值false
     showPreview:true,//是否支持返回预览事件
     //是否支持打开已选图片预览效果,默认为false。当本参数为 true 时,styles-》mark-》position 参数恒为 top_right,切此时模块会为 mark 提供一个未选中时的图标。
     showBrowser:true     
    }, function(ret) { 
        // 获取图片数据并处理
        if (ret) {
        	//判断点击的是不是cancel和preview,若是那么不处理
        	//preview模式下,有取消和完成两个按钮,点击取消时会自动跳转到选择图片的界面,点击完成按钮时会提交ajax,也就是会回调到该处
        	//且会触发至少两次,一次为confirm,其他次数为preview,只处理为confirm的情况
        	if(ret.eventType=="cancel" || ret.eventType=="preview"){
        		return false;
        	}                    
            for(var i=0;i<ret.list.length;i++){
            	//alert(ret.list[i].path);   
            	//alert(JSON.stringify(ret.list[i]));
            	var img = "<a href='javascript:void(0);' class='add_pic' onclick='previewThePic(this);'><img src='"+ret.list[i].path+"' /></a>";
	        	$("#picList").append(img);//将选择的图片显示出来
            }
            if($("#picList").children().length==maxImgCount){//达到显示总数了,那么+按钮隐藏
            	$("#addPicBtn").hide();
            }           
        }
    }

注意点:在测试的时候,发现UIMediaScanner有一个问题:它会扫描出不存在的照片,如第一次扫描的时候扫描出A.png,后台把A.png删除再扫描,还是会扫描出A.png。清除UIMediaScanner的缓存、APP的缓存、甚至于卸载了APP还是会扫描出A.png,也不知道这是什么问题。

选择图片就写到这里,祝好运!

猜你喜欢

转载自1017401036.iteye.com/blog/2370666