Material Design学习之 Camera

转载请注明出处:王亟亟的大牛之路

年后第一篇,自从来了某司产量骤减,这里批评下自己,这一篇的素材来源于老牌Material Design控件写手afollestadhttps://github.com/afollestad/material-camera

开篇前,继续安利,你懂的:https://github.com/ddwhan0123/Useful-Open-Source-Android (最近把 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文件里加

<activity
    android:name="com.afollestad.materialcamera.CaptureActivity"
    android:theme="@style/MaterialCamera.CaptureActivity" />
<activity
    android:name="com.afollestad.materialcamera.CaptureActivity2"
    android:theme="@style/MaterialCamera.CaptureActivity" />

用于注册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 这部分开始自己实现我觉得也很方便。

项目地址:https://github.com/afollestad/material-camera

时间: 2024-10-01 21:31:21

Material Design学习之 Camera的相关文章

Material Design学习之 Button(详细分析,传说中的水滴动画)

转载请注明出处:王亟亟的大牛之路       上一篇大致介绍了Material Design的一些基本概念传送门:http://blog.csdn.net/ddwhan0123/article/details/50541561 这一片来具体学习下里面的内容,这篇分为两部分一部分是原理分析,一部分是代码分析. 先简要的介绍一些理论知识,顺便温顾下基础知识 按钮 按钮由文字和/或图标组成,文字及图标必须能让人轻易地和点击后展示的内容联系起来. 主要的按钮有三种: 悬浮响应按钮(Floating ac

Material Design学习之 Snackbars(详细分析,Toast的加强版)

转载请注明出处:王亟亟的大牛之路 昨天把Material Design Button部分的内容分析完了,不知道大家理解了他的实现没有.如果没看的话,可以看下,传送门:http://blog.csdn.net/ddwhan0123/article/details/50555958 这几篇关于Material Design文章的代码几乎都是Git上摘录的,我做的事主要是分享给大家+解释分析. 昨天有小伙伴看完后希望我像以前一样把按钮那一部分的代码单独提取出来单独打成一个包,想单独使用或者学习而不是去

Material Design学习之 CheckBox(详细分析,富有表现力)

转载请注明出处:王亟亟的大牛之路 这些天一直在讲Material Design控件的内容,今天继续,说说CheckBox(妈蛋,好冷),上一篇的传送门:http://blog.csdn.net/ddwhan0123/article/details/50560638 老规矩,两部分,第一部分理论知识,第二部分代码 选择控制器 选择控制器允许用户选择选项.有三种类型:复选框.单选框以及开/关切换.选择控制器使用主题同样的颜色.(待会的代码主要讲的是单选按钮) 复选框 单选按钮 切换开关 官方对呈现的

Material Design学习之 Switch(详细解释)

转载请注明出处:王亟亟的大牛之路 继续这一系列的Material Design之行,昨天讲的是Sliders链接如下:http://blog.csdn.net/ddwhan0123/article/details/50586510 今天讲的是Switch,本来有考虑把它和CheckBox一起做了,但是毕竟实现不同,还是分开做吧,废话不多,开始正题 开关 On/off 开关切换单一设置选择的状态.开关控制的选项以及它的状态,应该明确的展示出来并且与内部的标签相一致.开关应该单选按钮呈现相同的视觉特

Material Design学习之 EditText (功能强大,优于系统自带,感谢“扔物线”)

转载请注明出处:王亟亟的大牛之路 继续之前的Material Design历程,今天是EditText,素材来源于http://www.rengwuxian.com/post/materialedittext(那么代码解释部分大家可以看原作者的文档,我在这里把理论知识灌输下就OK了,作者做的很全面,我都不知道要讲什么了 只能6666666) 大牛的这个库已经有了广泛的认知度和认可,EditText部分就拿他的作为比较推崇的演示版本. 因为大牛已经做了Jar包的支持,所以平时的拆的工作都省了,要直

Material Design学习之 Bottom Sheets (顺便提提CoordinatorLayout)

转载请注明出处:王亟亟的大牛之路 昨天连续上了2篇介绍第三方库的文章,正直好久没提交自己写东西了,那么就补一篇之前MD系列漏的部分 Bottom Sheets Bottom Sheets–底部动作条 底部动作条(Bottom Sheets)是一个从屏幕底部边缘向上滑出的一个面板,使用这种方式向用户呈现一组功能.底部动作条呈现了简单.清晰.无需额外解释的一组操作. 在一个标准的列表样式的底部动作条(Bottom Sheets)中,每一个操作应该有一句描述和一个左对齐的 icon.如果需要的话,也可

Material Design学习之 ProgreesBar

转载奇怪注明出处:王亟亟的大牛之路 继续我们Material Design的内容,这一篇讲的是进度条,上一篇是Switch地址如下:http://blog.csdn.net/ddwhan0123/article/details/50592579 进度和动态 在用户可以查看并与内容进行交互之前,尽可能地减少视觉上的变化,尽量使应用加载过程令人愉快.每次操作只能由一个活动指示器呈现,例如,对于刷新操作,你不能即用刷新条,又用动态圆圈来指示. 指示器类型 在操作中,对于完成部分可以确定的情况下,使用确

Material Design学习之 Sliders(详细分析,悬空气球显示进度值,附带Eclipse可以jar)

转载请注明出处:王亟亟的大牛之路 Material Design系列的文章这是第五篇,今天讲滑块控件(Sliders). 之前的传送门:http://blog.csdn.net/ddwhan0123/article/details/50578348(代码实现都靠画,学好View还是很重要的) 老规矩,先说下理论部分 滑块控件(Sliders,简称滑块)可以让我们通过在连续或间断的区间内滑动锚点来选择一个合适的数值.区间最小值放在左边,对应的,最大值放在右边.滑块(Sliders)可以在滑动条的左

Material Design学习之 Dialog(顺便把前两天AppBarLayout没讲的部分提一提)

转载请注明出处:王亟亟的大牛之路 继续之前的MD系列的内容,今天说Dialog,不知道还能翻几篇,反正这一系列都说完了话就找点别的内容整整. Dialogs (提示框)用于提示用户作一些决定,或者是完成某个任务时需要的一些其它额外的信息. Dialog可以是用一种 取消/确定 的简单应答模式,也可以是自定义布局的复杂模式,比如说一些文本设置或者是文本输入 . 官方的呈现,像这样 Dialog 包含了一个标题(可选),内容 ,事件. 标题:主要是用于简单描述下选择类型.它是可选的,要需要的时候赋值