博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Material Design学习之 Camera
阅读量:5925 次
发布时间:2019-06-19

本文共 4665 字,大约阅读时间需要 15 分钟。

转载请注明出处:

年后第一篇,自从来了某司产量骤减,这里批评下自己,这一篇的素材来源于老牌Material Design控件写手的

开篇前,继续安利,你懂的: (最近把 6.0授权部分单独罗列出来了)


介绍代码之前先贴下效果图

这里写图片描述


如何使用

先是添加依赖让maven去下代码

maven部分

repositories {    jcenter()    maven { url "https://dl.bintray.com/drummer-aidan/maven" }}

然后在build.gradle里添加

compile 'com.afollestad:material-camera:0.4.4'

当然你要下源码也行,就是一个java代码和布局文件,截图如下

这里写图片描述

依赖加好,代码下好,还需要做一件事,注册Activity

需要在项目的main文件里加

用于注册library的activity

OK,配置大致就是如下


自定义设置

在使用拍摄功能前肯定,一定会有多多少少的设置,最通常的诸如,图片储存地址,图片大小,画质压缩等等,原作者也提供了强大的api,这里做下翻译。

.allowRetry(true)                        //是否显示重拍按钮.autoSubmit(false)                        //是否允许用户在录制后播放视频.saveDir(saveFolder)                    //拍摄的内容的储存地址.primaryColorAttr(R.attr.colorPrimary)  //相机配色,建议遵从app style.showPortraitWarning(true)               //如果用户按纵向方向的记录,是否显示警告.defaultToFrontFacing(false)            //是否默认为前置摄像头.allowChangeCamera(true)                //允许用户更改相机.retryExits(false)                         //如果为true,播放屏幕中的“重试”按钮将退出相机,而不是返回录音机.restartTimerOnRetry(false)                //如果为true,则当用户在播放中轻按“重试”时,倒计时器将重置为0.continueTimerInPlayback(false)         //如果为true,倒计时器将在播放过程中继续向下,而不是暂停。.videoEncodingBitRate(1024000)          //设置视频大小.audioEncodingBitRate(50000)            // 设置音频大小.videoFrameRate(24)                     //设置视频fps值.qualityProfile(MaterialCamera.QUALITY_HIGH)//设置质量配置文件,手动设置比特率或帧速率与其他设置将覆盖单个质量配置文件设置.videoPreferredHeight(720)                //设置录制视频的首选高度.videoPreferredAspect(4f / 3f)            //为录制的视频输出设置首选宽高比            .maxAllowedFileSize(1024 * 1024 * 5)    //将最大文件大小设置为5MB,如果文件达到此限制,录制将停止。请记住,FAT文件系统的文件大小限制为4GB。.iconRecord(R.drawable.mcam_action_capture)  //设置用于开始录制的按钮的自定义图标.iconStop(R.drawable.mcam_action_stop)  //为用于停止录制的按钮设置自定义图标.iconFrontCamera(R.drawable.mcam_camera_front)//设置用于切换到前置摄像头的按钮的自定义图标.iconRearCamera(R.drawable.mcam_camera_rear) //设置用于切换到后置摄像头的按钮的自定义图标.iconPlay(R.drawable.evp_action_play)   //设置用于开始播放的自定义图标.iconPause(R.drawable.evp_action_pause) // 设置用于暂停播放的自定义图标.iconRestart(R.drawable.evp_action_restart)//设置用于重新开始播放的自定义图标.labelRetry(R.string.mcam_retry)        //为用于重试记录的按钮设置自定义按钮标签(如果可用).labelConfirm(R.string.mcam_use_video)  //为用于确认/提交录音的按钮设置自定义按钮标签.autoRecordWithDelaySec(5)                 //摄像机将在5秒倒计时后自动开始录制。这将最初禁用前后摄像头之间的切换。.autoRecordWithDelayMs(5000)            //与上面相同,用毫秒而不是秒表示。.audioDisabled(false)                   //设置为true可记录没有任何音频的视频.start(CAMERA_RQ);                         //启动相机活动,结果将被发回当前活动

这都是api提供的设置的方法,通俗易懂,建议写成一个工厂方法然后调用,省得每次构造一个新的MaterialCamera对象


控件调用

作者在适配方面还是做的很用心的,高低版本的Fragment和通常的Activity都有做。兼容方面我分别在 华为,nexus,小米部分机型做过测试没有明显的差异和bug出现,我们来看下具体是如何调用的。

MaterialCamera materialCamera = new MaterialCamera(this)                .saveDir(saveDir)                .showPortraitWarning(true)                .allowRetry(true)                .defaultToFrontFacing(true)                .allowRetry(true)                .autoSubmit(false)                .labelConfirm(R.string.mcam_use_video);materialCamera.stillShot() .labelConfirm(R.string.mcam_use_stillshot);materialCamera.start(CAMERA_RQ);

按钮啊或者其他地方调用下就好了,然后和使用普通相机一样在onActivityResult里找结果就行

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        // Received recording or error from MaterialCamera        if (requestCode == CAMERA_RQ) {            if (resultCode == RESULT_OK) {                final File file = new File(data.getData().getPath());                Toast.makeText(this, String.format("Saved to: %s, size: %s",                        file.getAbsolutePath(), fileSize(file)), Toast.LENGTH_LONG).show();            } else if (data != null) {                Exception e = (Exception) data.getSerializableExtra(MaterialCamera.ERROR_EXTRA);                if (e != null) {                    e.printStackTrace();                    Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();                }            }        }    }

首先判断是否是自己之前预设的requestCode值是的话去读取data里面的值

只要能读到data值那就走正常的业务逻辑就好。
整体使用体验和厂商自带的相机相机功能没有什么区别。

区别在于存储部分帮你做了,常用功能帮你封了,长得很MD,还有很强的拓展性


一些补充

1.暂时只支持android.support.v4.app.Fragment

android.app.Fragment
Activity调用相机,特殊场景的话自己得转Context

2.manifest里面加的2个Activity节点不能漏,lib裤自己没有存货的进程,都依附于调用者(我没试过不加会怎么样,八成是找不到那个类)

那为什么需要有2个呢? 兼容看看2个类的注解就知道了

@TargetApi(Build.VERSION_CODES.LOLLIPOP)public class Camera2Fragment extends BaseCameraFragment implements View.OnClickListener

以及

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)public class CameraFragment extends BaseCameraFragment implements View.OnClickListener

这个库暂时就介绍到这里,这篇没去拆源码,我对这个库的理解感觉

这是一个实用性大于教学性的开源库,类似功能的库实现都是大同小异
都是对自带的照相机外面套了层ui,套了层功能强化,当然感兴趣可以自己去读读,不是很难。

如果觉得部分功能自己需要拓展,继承BaseCameraFragment 这部分开始自己实现我觉得也很方便。

项目地址:

你可能感兴趣的文章
Stefan Tilkov:跳过单体应用,从微服务开始
查看>>
小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
查看>>
Apache HBase的现状和发展
查看>>
Linus Torvalds: 成功的项目源于99%的汗水与1%的创新
查看>>
InfoQ宣布成立CNUT容器技术俱乐部 欲连接中国容器社区
查看>>
GitHub服务中断24小时11分钟事故分析报告\n
查看>>
在微信小程序中绘制图表(part2)
查看>>
新成立的Scala中心将重点关注教育和Scala社区
查看>>
自从装了windows神器,再也不用羡慕mac了
查看>>
Next.js 7发布,构建速度提升40%
查看>>
京东Vue组件库NutUI 2.0发布:将支持跨平台!
查看>>
腾讯云副总裁答治茜:移动互联网破局要借助“三张网”
查看>>
给Web开发人员的以太坊入坑指南
查看>>
CMD、AMD、commonJs 规范的写法
查看>>
Facebook应用Moments使用C++实现跨平台代码共享
查看>>
跨域解决方案大全
查看>>
Laravel 学习笔记之 Query Builder 源码解析(下)
查看>>
3. 视图数据View Data和Balde模版 - Laravel从零开始教程
查看>>
Java泛型总结
查看>>
如何用CSS让一个容器水平垂直居中?
查看>>