Android 自定義相機(前后切換维费、閃光燈果元、對焦、鏡頭縮放)

最近項目中使用相機功能犀盟,需要自定義而晒,整理下,給需要的朋友
實現(xiàn)的功能:前后鏡頭切換且蓬、閃光燈模式(三種)欣硼、對焦题翰、鏡頭手勢縮放恶阴、本地保存、彈窗預(yù)覽
實現(xiàn)邏輯:自定義View繼承自SurfaceView豹障,Activity 布局中引入冯事,在Activity中進行各種操作 拍照,對焦等等

鏡頭切換方法:

 //切換攝像頭
    private int cameraPosition = 1; //當前選用的攝像頭血公,1后置 0前置

    public void switchFrontCamera() {
        int cameraCount = Camera.getNumberOfCameras();//得到攝像頭的個數(shù)
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

        for (int i = 0; i < cameraCount; i++) {
            Camera.getCameraInfo(i, cameraInfo);//得到每一個攝像頭的信息
            if (cameraPosition == 1) {
                //現(xiàn)在是后置昵仅,變更為前置
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表攝像頭的方位谈息,CAMERA_FACING_FRONT前置      CAMERA_FACING_BACK后置
                    //重新打開
                    reStartCamera(i);
                    cameraPosition = 0;
                    break;
                }
            } else {
                //現(xiàn)在是前置弄捕, 變更為后置
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表攝像頭的方位,CAMERA_FACING_FRONT前置      CAMERA_FACING_BACK后置
                    reStartCamera(i);
                    cameraPosition = 1;
                    break;
                }
            }
        }
    }

    //重新打開預(yù)覽
    public void reStartCamera(int i) {
        if (camera != null) {
            camera.stopPreview();//停掉原來攝像頭的預(yù)覽
            camera.release();//釋放資源
            camera = null;//取消原來攝像頭
        }
        try {
            camera = Camera.open(i);//打開當前選中的攝像頭
            camera.setPreviewDisplay(holder);//通過surfaceview顯示取景畫面
//            camera.setDisplayOrientation(90);// 屏幕方向
            camera.startPreview();//開始預(yù)覽
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

閃光燈模式

camePreview.setIsOpenFlashMode(Camera.Parameters.FLASH_MODE_AUTO);//自動模式
camePreview.setIsOpenFlashMode(Camera.Parameters.FLASH_MODE_ON);//總是開啟
camePreview.setIsOpenFlashMode(Camera.Parameters.FLASH_MODE_OFF);//總是關(guān)閉

    //設(shè)置開啟閃光燈(重新預(yù)覽)
    public void setIsOpenFlashMode(String mIsOpenFlashMode) {
        Camera.Parameters mParameters = camera.getParameters();
        //設(shè)置閃光燈模式
        mParameters.setFlashMode(mIsOpenFlashMode);
        camera.setParameters(mParameters);
    }

鏡頭對焦

    // 手動對焦
    public void autoFocus() {
        camera.autoFocus(null);//自動對焦 不需要回調(diào)
    }

    //自動連續(xù)對焦
        Camera.Parameters parameters = camera.getParameters();
        if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
            parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 連續(xù)對焦模式
        }
        camera.setParameters(parameters);

手勢縮放

    //Activity中初始化
    ScaleGestureDetector gestureDetector = new ScaleGestureDetector(this, new ScaleGestureListener());

    //重寫onTouchEvent方法 獲取手勢
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //識別手勢
        gestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    //操作類
    class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener {
        float mScaleFactor;

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            if (detector.getCurrentSpan() > mScaleFactor) {
                camePreview.zoomOut();
            } else {
                camePreview.zoomIn();
            }
            mScaleFactor = detector.getCurrentSpan();
            return false;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            mScaleFactor = detector.getCurrentSpan();
            //一定要返回true才會進入onScale()這個函數(shù)
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            mScaleFactor = detector.getCurrentSpan();
        }
    }

    //自定義相機View中定義方法
    //放大
    public void zoomOut() {
        Camera.Parameters parameters = camera.getParameters();
        if (!parameters.isZoomSupported()) return;

        int zoom = parameters.getZoom() + 1;
        if (zoom < parameters.getMaxZoom()) {
            parameters.setZoom(zoom);
            camera.setParameters(parameters);
        }
    }

    //縮小
    public void zoomIn() {
        Camera.Parameters parameters = camera.getParameters();
        if (!parameters.isZoomSupported()) return;

        int zoom = parameters.getZoom() - 1;
        if (zoom >= 0) {
            parameters.setZoom(zoom);
            camera.setParameters(parameters);
        }
    }

預(yù)覽使用Dialog蛤高,還有前后攝像頭拍照方向問題

        //bitmap旋轉(zhuǎn)90度
        Matrix matrix = new Matrix();
        matrix.setRotate(90);
        Bitmap waterMarkBitmap = Bitmap.createBitmap(waterMarkBitmap, 0, 0, waterMarkBitmap.getWidth(), waterMarkBitmap.getHeight(), matrix, true);

項目源碼 https://github.com/Lrxc/CustomCamera.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垦写,一起剝皮案震驚了整個濱河市吕世,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梯投,老刑警劉巖命辖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異分蓖,居然都是意外死亡尔艇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門么鹤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來终娃,“玉大人,你說我怎么就攤上這事蒸甜〕⒍叮” “怎么了毡们?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昧辽。 經(jīng)常有香客問我衙熔,道長,這世上最難降的妖魔是什么搅荞? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任红氯,我火速辦了婚禮,結(jié)果婚禮上咕痛,老公的妹妹穿的比我還像新娘痢甘。我一直安慰自己,他們只是感情好茉贡,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布塞栅。 她就那樣靜靜地躺著,像睡著了一般腔丧。 火紅的嫁衣襯著肌膚如雪放椰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天愉粤,我揣著相機與錄音砾医,去河邊找鬼。 笑死衣厘,一個胖子當著我的面吹牛如蚜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播影暴,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼错邦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了型宙?” 一聲冷哼從身側(cè)響起撬呢,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎早歇,沒想到半個月后倾芝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡箭跳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年晨另,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谱姓。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡借尿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情路翻,我是刑警寧澤狈癞,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站茂契,受9級特大地震影響蝶桶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掉冶,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一真竖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厌小,春花似錦恢共、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至癣蟋,卻和暖如春透硝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梢薪。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工蹬铺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尝哆,地道東北人秉撇。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像秋泄,于是被迫代替她去往敵國和親琐馆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,097評論 25 707
  • Android中開發(fā)相機的兩種方式Android系統(tǒng)提供了兩種使用手機相機資源實現(xiàn)拍攝功能的方法恒序,一種是直接通過I...
    TensorFlow開發(fā)者閱讀 3,028評論 0 14
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫瘦麸、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,098評論 4 62
  • 接觸了這個理論開始于周米歧胁,自己也在好奇心還有上進心(貌似有點)最主要是周米那張嘚啵嘚啵嘚的小嘴感召下也做了測試滋饲,自...
    tonynicole閱讀 358評論 2 0
  • 剛剛我老媽給我發(fā)微信講,爸爸的錢包掉了喊巍,需要補辦身份證應(yīng)該怎樣弄屠缭?我媽只知道掉了,掉了些什么崭参,掉了多少現(xiàn)金她并不知...
    蓯蓉菟絲子閱讀 431評論 1 3