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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,116評論 25 708
  • 其實我是個很敏感的人,別人釋放的情緒我能敏銳感受到,但做不出恰當并讓人贊賞的反應,我自己歸納總結主要有以下幾個原因...
    originalme22閱讀 757評論 0 0
  • 好久沒寫點什么了 因為也沒什么可寫的了 不去想那些破事 心如死灰
    拾與叁閱讀 147評論 0 0
  • 其實我是個拖延非常嚴重的人,我這個拖延也不是一天兩天形成的,而是長年累月的積累。要一下子改好,真的是不大可能。 從...
    微光Try閱讀 180評論 0 2