Material Design学习之 Camera
转载请注明出处:王亟亟的大牛之路
年后第一篇,自从来了某司产量骤减,这里批评下自己,这一篇的素材来源于老牌Material Design控件写手afollestad的 https://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 这部分开始自己实现我觉得也很方便。
Material Design学习之 Camera的更多相关文章
- Material Design学习之 Button(具体分析,传说中的水滴动画)
转载请注明出处:王亟亟的大牛之路 上一篇大致介绍了Material Design的一些基本概念传送门:http://blog.csdn.net/ddwhan0123/article/details/5 ...
- Material Design学习笔记
Wiki->移动开发->Android->Material Design-原质化设计 (友情链接:http://wiki.jikexueyuan.com/project/materi ...
- Material Design学习
前言: 最为一个用习惯了bootstrap的前端小菜,今天偶然听闻material design 这个从未听闻的前端框架,带着好奇开始了新的尝试,并将bootstrap跟material design ...
- Android Material Design 学习笔记 - Matrial Theme
google在2014年 I/O大会上推出了一种新的设计设计语言—Material design,这种设计语言语言旨在为手机.平板电脑.台式机和“其他平台”提供更一致.更广泛的“外观和感觉”(附上官方 ...
- Material Design学习之 ProgreesBar
转载奇怪注明出处:王亟亟的大牛之路 继续我们Material Design的内容,这一篇讲的是进度条,上一篇是Switch地址例如以下:http://blog.csdn.net/ddwhan0123/ ...
- Material Design学习之 Bottom navigation
转载请注明出处:王亟亟的大牛之路 礼拜4一天由于事假没有去单位然后礼拜3由于生日也没写文章,今天一早上班就补一篇MD的内容.这一篇是关于颇有争议的Bottom navigation相关内容(主要是翻译 ...
- Material Design学习-----FloatingActionButton
FloatingActionButton是悬浮操作按钮,它继承自imageview,所以说它具备有imageview所有的方法和属性.与其他按钮不同的是,FloatingActionButton默认就 ...
- Material Design学习-----TextInputLayout
TextInputLayout是为EditText提供了一种新的实现和交互方式.在传统的EditText中存在一个hint属性,是说在editext中没有内容时,默认的提示信息.当想edittext中 ...
- Material Design学习-----CollapsingToolbarLayout
博客引用(http://www.open-open.com/lib/view/open1438265746378.html) CollapsingToolbarLayout为我们提供了一个很方便的顶部 ...
随机推荐
- 巨蟒python全栈开发-第11阶段 devops-git入门1
大纲 1.git命令初识 2.git reset与diff 3.git区域总结 4.git 远程仓库 5.git stash 1.git命令初识 2.git reset与diff 3.git区域总结 ...
- No such file or directory
项目-targets-build phases, 然后从copy bundle resources里面删掉红色的错误资源文件
- However, a general purpose protocol or its implementation sometimes does not scale very well.
https://netty.io/wiki/user-guide-for-4.x.html The Problem Nowadays we use general purpose applicatio ...
- ora-04021 无法锁表的解决办法
案例场景: 备库上有一张分区表,在做数据导入出了点问题,需要truncate掉重新导入,在执行truncate table时发生了04021错误. 错误分析: ora-04021的解释是等待锁定对象时 ...
- mysql5.7.22在centos7.5下的安装
1.下载,解压 把下载的文件放到 /app/programs/目录下 tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz 地址:https://d ...
- new Option() 创建一个option标签
//add() 方法用于向 <select> 添加一个 <option> 元素. //new Option() 创建一个option标签 school.add(new Opti ...
- centos 配置yum源
1.yum配置 yum的配置文件在 /etc/yum.conf [root@mini ~]# cat /etc/yum.conf [main] cachedir=/var/cache/yum/$ba ...
- PHP代码编写的优化
// $b 会新创建一个内存空间 $a = array('a'=>'aa','b'=>'bb'); $b = $a; $a['c'] = 'cc'; // $b 会引用 $a 的内存空间 ...
- 《FTL之垃圾回收、写放大和OP 》总结
来自 http://www.ssdfans.com/?p=1840: 写放大WA: 对空盘来说(未触发GC),写放大一般为1,即Host写入多少数据,SSD写入闪存也是多少数据量(这里忽略SSD内部数 ...
- macOS Sierra上ssh免密码登录linux服务器
1.生成私钥文件 在客户端终端下输入以下命令 ssh-keygen -t rsa 每次执行 ssh-keygen -t rsa 产生的私钥文件都会不同 如果文件"~/.ssh/id_rsa& ...