Trust
Trust
  • 发布:2016-07-25 20:45
  • 更新:2019-03-27 12:19
  • 阅读:16195

【示例】创建属于当前应用的相册

分类:HTML5+

图片上传,是现在许多手机应用避不开的功能。常见的图片上传,是通过手机相册,或者摄像头拍照来完成对图片的选择。
就像下面的图这样:


但是,有的应用只是单纯地想调用摄像头拍照,然后去选择那些拍摄获取的图片,并且有事没事还可以看看之前拍了哪些照片,然后直接拿去就用了,不用每次都调用摄像头。
例如这样:

这样的需求,就相当于我们要创建一个属于当前应用自己的相册,不和系统相册一起玩了。
现在我们来看下具体的实现:
一、camera.html

<!doctype html>  
<html>  

    <head>  
        <meta charset="UTF-8">  
        <title></title>  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <link href="css/mui.min.css" rel="stylesheet" />  
        <style type="text/css">  
            .img-content {  
                text-align: center;  
            }  

            #img_view {  
                width: 300px;  
                height: 300px;  
            }  
            .camera-div {  
                margin-top: 20px;  
            }  
        </style>  
    </head>  

    <body>  
        <header class="mui-bar mui-bar-nav">  
            <h1 class="mui-title">相机</h1>  
        </header>  
        <div class="mui-content">  
            <div class="img-content">  
                <!--做为预览图片的元素-->  
                <img src="img/shuijiao.jpg" id="img_view" />  
                <div><span>点击上图选择图片</span></div>  
            </div>  
            <div class="camera-div">  
                <button type="button" class="mui-btn mui-btn-yellow mui-btn-block" id="get_camera">拍照</button>  
            </div>  
        </div>  
        <script src="js/mui.min.js"></script>  
        <script type="text/javascript">  
            mui.init();  
            mui.plusReady(function() {  
                var cameraUrl = "_doc/camera/"; //拍照后图片保存的地址  
                // 调用摄像头事件  
                document.getElementById("get_camera").addEventListener("tap", function() {  
                    /**  
                     * 获取摄像头对象  
                     * http://www.html5plus.org/doc/zh_cn/camera.html#plus.camera.getCamera  
                     */  
                    var camera = plus.camera.getCamera();  
                    /**  
                     * 进行拍照操作  
                     * http://www.html5plus.org/doc/zh_cn/camera.html#plus.camera.Camera.captureImage  
                     */  
                    camera.captureImage(function(captureFile) {  
                        // 拍照完成后,进入选择照片的页面;  
                        showImages(cameraUrl);  
                    }, function(error) {  
                        console.log("拍照错误,错误编码:" + error.code);  
                        console.log("拍照错误,错误描述信息:" + error.message);  
                    }, {  
                        filename: cameraUrl  
                    });  
                });  
                var imgEl = document.getElementById("img_view"); //img元素节点  
                // 点击图片,查看对应目录下的图片;这里只是为了演示读取文件,实际开发中可以参考;  
                imgEl.addEventListener("tap", function() {  
                    showImages(cameraUrl);  
                });  
                /**  
                 * 自定义事件,预览选择好的图片;  
                 * http://dev.dcloud.net.cn/mui/event/#customevent  
                 */  
                window.addEventListener("change_image", function(event) {  
                    var imgUrl = event.detail.imgUrl;  
                    imgEl.src = imgUrl;  
                });  
            });  

            /**  
             * 展示指定目录下的图片  
             * @param {String} targetUrl 目录地址  
             */  
            function showImages(targetUrl) {  
                // 第一步,获取目标目录对象;  
                /**  
                 * 通过URL参数获取目录对象或文件对象  
                 * http://www.html5plus.org/doc/zh_cn/io.html#plus.io.resolveLocalFileSystemURL  
                 */  
                plus.io.resolveLocalFileSystemURL(targetUrl, function(entry) {  
                    // 第二步,创建读取目录的对象;  
                    /**  
                     * 创建目录读取对象  
                     * http://www.html5plus.org/doc/zh_cn/io.html#plus.io.DirectoryEntry.createReader  
                     */  
                    var reader = entry.createReader();  
                    // 第三步,读取目录下的对象;  
                    /**  
                     * 获取当前目录中的所有文件和子目录  
                     * http://www.html5plus.org/doc/zh_cn/io.html#plus.io.DirectoryReader.readEntries  
                     */  
                    reader.readEntries(function(subFiles) {  
                        var imgArr = [];  
                        // 第四步,获取目录下对象的路径;  
                        /**  
                         * 将读取到的文件的路径,添加至数组中;  
                         * http://www.html5plus.org/doc/zh_cn/io.html#plus.io.DirectoryEntry.fullPath  
                         */  
                        for(var i = 0, len = subFiles.length; i < len; i++) {  
                            imgArr.push(subFiles[i].fullPath);  
                        }  
                        // 第五步,去查看摄像头拍摄的图片;  
                        /**  
                         * 打开预览图片的页面,并将图片的地址传过去;  
                         * http://dev.dcloud.net.cn/mui/window/#openwindow  
                         */  
                        mui.openWindow({  
                            url: "camera_gallery.html",  
                            id: "camera_gallery",  
                            extras: {  
                                imgArr: imgArr  
                            }  
                        });  
                    }, function(error) {  
                        console.log("文件操作失败信息:" + error);  
                    });  
                }, function(error) {  
                    console.log("读取本地目录失败,失败信息:" + error);  
                });  
            }  
        </script>  
    </body>  

</html>

大家注意到第42行的变量cameraUrl,这个变量的值,就是我们应用自己相册的路径啦。
调用摄像头逻辑:
1、点击“拍照”按钮,创建摄像头对象;
2、摄像头拍照,在拍照方法的回调中,我们通过相册的路径访问到相册下的文件;
3、创建目录读取对象,用于读取目录下的文件及子目录;
4、获取当前目录下的文件,并将文件系统的绝对路径取出,放置在一个数组中;
5、打开新窗口,并将文件路径的数组传过去。
直接打开本应用相册逻辑:
与上面不同的地方,就是省去了打开摄像头的操作,直接根据目录路径访问即可。
二、camera_gallery.html

<!doctype html>  
<html>  

    <head>  
        <meta charset="UTF-8">  
        <title></title>  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <link href="css/mui.min.css" rel="stylesheet" />  
        <style type="text/css">  
            .mui-table-view.mui-grid-view .mui-table-view-cell .mui-media-object {  
                height: 150px;  
            }  

            .mui-grid-view.mui-grid-9 .mui-media .mui-icon {  
                position: absolute;  
                right: 15px;  
                top: 15px;  
                z-index: 1;  
                color: yellow;  
            }  

            #sure_img {  
                margin-top: 10px;  
            }  
        </style>  
    </head>  

    <body>  
        <header class="mui-bar mui-bar-nav">  
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>  
            <a class="mui-pull-right" id="sure_img">确定</a>  
            <h1 class="mui-title">相机相册</h1>  
        </header>  
        <div class="mui-content">  
            <ul class="mui-table-view mui-grid-view mui-grid-9">  
                <!--<li class="mui-table-view-cell mui-media mui-col-xs-6">  
                    <img class="mui-media-object" src="../../img/shuijiao.jpg">  
                    <span class="mui-icon mui-icon-star-filled"></span>  
                </li>-->  
            </ul>  
        </div>  
        <script src="js/mui.min.js"></script>  
        <script src="js/mui.lazyload.js"></script>  
        <script src="js/mui.lazyload.img.js"></script>  
        <script type="text/javascript">  
            mui.init();  
            mui.plusReady(function() {  
                var currentNode = null; //当前选中的元素节点对象  
                var targetImage = ""; //选中的图片路径  
                /**  
                 * 获取当前窗口对象  
                 * http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.currentWebview  
                 */  
                var self = plus.webview.currentWebview();  
                var imgArr = self.imgArr;  
                /**  
                 * 动态拼接,图文表格;  
                 * http://dcloud.io/hellomui/examples/slider-table-default.html  
                 * 使用懒加载;  
                 * http://dcloud.io/hellomui/examples/lazyload-image.html  
                 */  
                /**  
                 * 懒加载比较关键的三个点:  
                 * 1、引入mui.lazyload.js以及mui.lazyload.img.js文件;  
                 * 2、img标签中使用data-lazyload来存储实际要展示的图片路径;  
                 * 3、用mui选择器获取文档节点,进行懒加载初始化操作;  
                 */  
                var html = "";  
                for(var i = 0, len = imgArr.length; i < len; i++) {  
                    html += '<li class="mui-table-view-cell mui-media mui-col-xs-6">' +  
                        '<img class="mui-media-object" data-lazyload="' + imgArr[i] + '" /></li>';  
                }  
                // 拼接目标节点的内容  
                document.querySelector(".mui-table-view").innerHTML = html;  
                // 懒加载初始化  
                mui(document).imageLazyload({  
                    placeholder: "img/text.png"  
                });  
                /**  
                 * 添加选择图片事件  
                 */  
                mui(".mui-table-view").on("tap", ".mui-table-view-cell", function() {  
                    // 第一步,替换选中图片路径  
                    targetImage = this.querySelector(".mui-media-object").src;  
                    // 第二步,判断是否已经有图片被选中;若有,则移除之前的星星,因为此例子仅做单选;  
                    if(currentNode) {  
                        currentNode.removeChild(currentNode.querySelector("span"));  
                    }  
                    // 第三步,创建一个span元素节点,在图片右上角添加一个黄色的填充星星;  
                    var spanNode = document.createElement("span");  
                    spanNode.classList.add("mui-icon");  
                    spanNode.classList.add("mui-icon-star-filled");  
                    this.appendChild(spanNode);  
                    // 第四步,替换当前被选中节点对象;  
                    currentNode = this;  
                });  
                // 确定选择的图片  
                document.getElementById("sure_img").addEventListener("tap", function() {  
                    if(targetImage) {  
                        /**  
                         * 获取当前窗口的创建者  
                         * http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject.opener  
                         */  
                        var opener = self.opener();  
                        /**  
                         * 触发目标窗口对象的事件,替换图片;  
                         * http://dev.dcloud.net.cn/mui/event/#customevent  
                         */  
                        mui.fire(opener, "change_image", {  
                            imgUrl: targetImage  
                        });  
                        // 返回上一页  
                        mui.back();  
                    } else {  
                        mui.toast("请选择图片");  
                    }  
                });  
            });  
        </script>  
    </body>  

</html>  

这就是我们应用自己的相册咯,这里仅仅做单选的示例,多选大家自己扩展咯,道理是一样的。
1、获取到上一级传过来的所有文件的地址,动态拼接出所有的图片;
2、用mui的事件绑定对图片进行批量事件绑定:在我们点击图片的时候,右上角添加一颗小星星用来标记当前图片;
3、选好图片了,点击右上角的“确认”,并利用自定义事件将选中的图片地址传到上一级页面,替换之前预览的图片;
4、之后你想对这个图片干什么,就看自己的业务需求了。
最后,附上源码,真机运行即可。

16 关注 分享
好冷 Xiao小树 lhyh 水域心诚 amourz 邵 zhangyu196 9***@qq.com 前端菜鸟哟 B丶iang 9***@qq.com l***@163.com 8***@qq.com 云端笔记 n***@qq.com 3***@qq.com

要回复文章请先登录注册

2***@qq.com

2***@qq.com

真机运行的时候本地图片都显示不了
2019-03-27 12:19
G_Pig

G_Pig

请问 能不能直接:
1,点击一个按钮跳出提示选择“相册”或“拍照”
2,选择相册就跳到相册,选择拍照就直接拍照
3,选择的相片或者拍好的相片就直接显示到页面的指定大小的区域。
2017-09-14 20:07
8***@qq.com

8***@qq.com

我的照片2M左右一张 加载速度非常慢。
2017-09-11 20:46
B丶iang

B丶iang

这个是新建了个文件路径存图片,但是我需要获取的是系统里面所有的图片那该怎么做呢?求解!!!
2017-04-11 23:18
aabbcc

aabbcc

点拍照, 没有反应,是什么问题??
2017-04-06 11:23
1***@qq.com

1***@qq.com

mark
2017-03-23 00:48
CJH

CJH

回复 1***@qq.com :
手机真机调试即可...不需要发行成app,然后再安装使用
2017-02-24 10:07
1***@qq.com

1***@qq.com

回复 CJH :
不用App真机运行,是吧
2017-02-24 09:01
CJH

CJH

回复 1***@qq.com :
亲测可用,或许是你使用是流程不对。如果首次打开应用,就立刻“点击上图选择图片”,这样的话log日志中会提示“读取本地目录失败”。原因是此时该目录还没有去创建成功(因为此地址目录是拍照成功后图片保存的地址)。正确使用流程:1.第一次打开应用,点击拍照。2.拍照完成后,如果选择选中图片并点击右上角确定按钮,此时拍摄的图片替换首页的图片;如果直接点返回,此时再点击首页的图片,会跳转到相机相册....
2017-02-23 10:58
1***@qq.com

1***@qq.com

回复 Trust :
我想问下你是怎么解决的啊 我用HBulider打开用手机运行 完全没有反应呢 必须是要App真机运行吗
2017-02-23 09:29