Android如何自定義相機(jī)Camera實(shí)現(xiàn)手動(dòng)對(duì)焦

這篇文章主要為大家展示了“Android如何自定義相機(jī)Camera實(shí)現(xiàn)手動(dòng)對(duì)焦”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Android如何自定義相機(jī)Camera實(shí)現(xiàn)手動(dòng)對(duì)焦”這篇文章吧。

創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),寧洱網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:寧洱等地區(qū)。寧洱做網(wǎng)站價(jià)格咨詢:18980820575

目錄

手動(dòng)對(duì)焦的方法解析  實(shí)現(xiàn)用戶點(diǎn)擊屏幕后,設(shè)置對(duì)焦區(qū)域和測(cè)光區(qū)域

一、手動(dòng)對(duì)焦的方法

手動(dòng)對(duì)焦的實(shí)現(xiàn)主要通過(guò)兩個(gè)Camera方法來(lái)進(jìn)行配置:

setFocusAreas 設(shè)置對(duì)焦的區(qū)域  setMeteringAreas 設(shè)置測(cè)光的區(qū)域

他們需要傳入一個(gè)Camera.Area集合,Camera.Area如圖:

/**   * Create an area with specified rectangle and weight.   *   * @param rect the bounds of the area.   * @param weight the weight of the area.   */  public Area(Rect rect, int weight) {    this.rect = rect;              this.weight = weight;        }

第一個(gè)參數(shù)是對(duì)焦和測(cè)光的區(qū)域,范圍在[-1000,-1000]到[1000,1000],第二個(gè)參數(shù)是權(quán)重,范圍在0到1000,當(dāng)傳入多個(gè)Area時(shí),權(quán)重的大小決定著對(duì)焦或測(cè)光的優(yōu)先級(jí),如果每次只對(duì)焦一個(gè)區(qū)域,那第二個(gè)參數(shù)直接傳入1000即可,大多數(shù)開(kāi)發(fā)中也是如此。

說(shuō)到第一個(gè)參數(shù)的范圍,請(qǐng)看下圖,將更加清晰明了:

我們可以看到,和手機(jī)屏幕的分辨率不同,Area到屏幕的映射區(qū)域是從左上角的-1000,-1000到右下角的1000,1000,中心點(diǎn)是0,0,我們點(diǎn)擊屏幕后獲取到的坐標(biāo),最終就需要轉(zhuǎn)化為映射區(qū)域的坐標(biāo),這是手動(dòng)對(duì)焦最為重要的環(huán)節(jié),了解了這兩個(gè)必要的參數(shù)配置后,我們就可以開(kāi)始手動(dòng)對(duì)焦的實(shí)現(xiàn)了。

二、實(shí)現(xiàn)用戶點(diǎn)擊屏幕后,設(shè)置對(duì)焦區(qū)域和測(cè)光區(qū)域 獲取點(diǎn)擊預(yù)覽畫(huà)面的坐標(biāo)值

用戶點(diǎn)擊屏幕,實(shí)際是點(diǎn)擊的預(yù)覽畫(huà)面的區(qū)域,拍照功能大家肯定都知道,這個(gè)就不多解釋,那么我們直接通過(guò)setOnTouchListener方法對(duì)View進(jìn)行監(jiān)聽(tīng)即可

surfaceView.setOnTouchListener(new View.OnTouchListener() {      @Override      public boolean onTouch(View v, MotionEvent event) {        Log.e("MainActivity", "X坐標(biāo):" + event.getX()+",Y坐標(biāo):"+event.getY());        return false;      }    });

通過(guò)MotionEvent我們就可以獲取到用戶點(diǎn)擊屏幕時(shí),相對(duì)于View的坐標(biāo)值了

將View坐標(biāo)值轉(zhuǎn)化為Area映射區(qū)域的坐標(biāo)值

之前說(shuō)過(guò),Area映射區(qū)域是[-1000,-1000]到[1000,1000],那么通過(guò)下面的坐標(biāo)換算公式,我們就可以得到點(diǎn)擊預(yù)覽畫(huà)面時(shí),映射區(qū)域的坐標(biāo)值了

surfaceView.setOnTouchListener(new View.OnTouchListener() {      @Override      public boolean onTouch(View v, MotionEvent event) {        int areaX = (int) (event.getX() / surfaceView.getWidth() * 2000) - 1000; // 獲取映射區(qū)域的X坐標(biāo)        int areaY = (int) (event.getY() / surfaceView.getWidth() * 2000) - 1000; // 獲取映射區(qū)域的Y坐標(biāo)        return false;      }    });

獲取到映射區(qū)域的坐標(biāo)后,我們就要設(shè)置一個(gè)對(duì)焦的范圍了,范圍是靈活的,我這里就創(chuàng)建一個(gè)長(zhǎng)寬是200的矩形區(qū)域

surfaceView.setOnTouchListener(new View.OnTouchListener() {      @Override      public boolean onTouch(View v, MotionEvent event) {        int areaX = (int) (event.getX() / surfaceView.getWidth() * 2000) - 1000; // 獲取映射區(qū)域的X坐標(biāo)        int areaY = (int) (event.getY() / surfaceView.getWidth() * 2000) - 1000; // 獲取映射區(qū)域的Y坐標(biāo)        // 創(chuàng)建Rect區(qū)域         Rect focusArea = new Rect();        focusArea.left = Math.max(x - 100, -1000); // 取最大或最小值,避免范圍溢出屏幕坐標(biāo)        focusArea.top = Math.max(y - 100, -1000);        focusArea.right = Math.min(x + 100, 1000);        focusArea.bottom = Math.min(y + 100, 1000);        return false;      }    });

設(shè)置對(duì)焦和測(cè)光

完成這一步,那就已經(jīng)實(shí)現(xiàn)了手動(dòng)對(duì)焦了,如下代碼:

surfaceView.setOnTouchListener(new View.OnTouchListener() {      @Override      public boolean onTouch(View v, MotionEvent event) {        int areaX = (int) (event.getX() / surfaceView.getWidth() * 2000) - 1000; // 獲取映射區(qū)域的X坐標(biāo)        int areaY = (int) (event.getY() / surfaceView.getWidth() * 2000) - 1000; // 獲取映射區(qū)域的Y坐標(biāo)        // 創(chuàng)建Rect區(qū)域         Rect focusArea = new Rect();        focusArea.left = Math.max(x - 100, -1000); // 取最大或最小值,避免范圍溢出屏幕坐標(biāo)        focusArea.top = Math.max(y - 100, -1000);        focusArea.right = Math.min(x + 100, 1000);        focusArea.bottom = Math.min(y + 100, 1000);        // 創(chuàng)建Camera.Area        Camera.Area cameraArea = new Camera.Area(focusArea, 1000);        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();        List<Camera.Area> focusAreas = new ArrayList<Camera.Area>();        if (mParameters.getMaxNumMeteringAreas() > 0) {          meteringAreas.add(cameraArea);          focusAreas.add(cameraArea);        }        mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); // 設(shè)置對(duì)焦模式        mParameters.setFocusAreas(focusAreas); // 設(shè)置對(duì)焦區(qū)域        mParameters.setMeteringAreas(meteringAreas); // 設(shè)置測(cè)光區(qū)域        try {          mCamera.cancelAutoFocus(); // 每次對(duì)焦前,需要先取消對(duì)焦          mCamera.setParameters(mParameters); // 設(shè)置相機(jī)參數(shù)          mCamera.autoFocus(mAutoFocusCallback); // 開(kāi)啟對(duì)焦        } catch (Exception e) {        }        return false;      }    });

相關(guān)注釋都在代碼中,手動(dòng)對(duì)焦其實(shí)很簡(jiǎn)單,計(jì)算好Area映射區(qū)域的坐標(biāo),為相機(jī)設(shè)置對(duì)焦和測(cè)光區(qū)域即可。

以上是“Android如何自定義相機(jī)Camera實(shí)現(xiàn)手動(dòng)對(duì)焦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享標(biāo)題:Android如何自定義相機(jī)Camera實(shí)現(xiàn)手動(dòng)對(duì)焦
標(biāo)題來(lái)源:http://muchs.cn/article8/iidoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)網(wǎng)站維護(hù)、App開(kāi)發(fā)電子商務(wù)、云服務(wù)器、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司