徹底解決 Android Camera 預覽拉伸的問題

步驟1:
根據(jù) Camera 支持的尺寸和當前屏幕的尺寸選擇一個合適的預覽尺寸俭正,大概的代碼如下:

private static Camera.Size getOptimalSize(int w, int h) {
    Camera.Parameters cameraParameter = camera.getParameters();
    List<Camera.Size> sizes = cameraParameter.getSupportedPreviewSizes()
    final double ASPECT_TOLERANCE = 0.1;
    // 豎屏是 h/w, 橫屏是 w/h
    double targetRatio = (double) h / w;
    Camera.Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    for (Camera.Size size : sizes) {
      double ratio = (double) size.width / size.height;
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
      if (Math.abs(size.height - targetHeight) < minDiff) {
        optimalSize = size;
        minDiff = Math.abs(size.height - targetHeight);
      }
    }

    if (optimalSize == null) {
      minDiff = Double.MAX_VALUE;
      for (Camera.Size size : sizes) {
        if (Math.abs(size.height - targetHeight) < minDiff) {
          optimalSize = size;
          minDiff = Math.abs(size.height - targetHeight);
        }
      }
    }

    return optimalSize;
  }

步驟2:
獲取了合適的 Camera.Size 之后會發(fā)現(xiàn)部分機型胚鸯,比如小米Mix3支持的相機尺寸如下:

width:1920,height:1440
width:1920,height:1080
width:1600,height:1200
width:1280,height:960
width:1280,height:720
width:1280,height:640
width:800,height:600
width:720,height:480
width:640,height:480
width:640,height:360
width:352,height:288
width:320,height:240

但是它的屏幕尺寸是:2340 * 1080辞嗡,這樣獲取的最合適的 Camera.Size 是 1920 * 1080,這是就會發(fā)現(xiàn)預覽界面被拉長了汗侵,想象一下 1920 的高度放到 2340 的高度上肯定會被拉長忿峻,這個時候就需要對顯示預覽界面的 View 做一下縮放偏移 操作了润努,大概的代碼如下:

public Matrix calculateSurfaceHolderTransform() {
        // 預覽 View 的大小,比如 SurfaceView
        int viewHeight = configManager.getScreenResolution().y;
        int viewWidth = configManager.getScreenResolution().x;
        // 相機選擇的預覽尺寸
        int cameraHeight = configManager.getCameraResolution().x;
        int cameraWidth = configManager.getCameraResolution().y;
        // 計算出將相機的尺寸 => View 的尺寸需要的縮放倍數(shù)
        float ratioPreview = (float) cameraWidth / cameraHeight;
        float ratioView = (float) viewWidth / viewHeight;
        float scaleX, scaleY;
        if (ratioView < ratioPreview) {
            scaleX = ratioPreview / ratioView;
            scaleY = 1;
        } else {
            scaleX = 1;
            scaleY = ratioView / ratioPreview;
        }
        // 計算出 View 的偏移量
        float scaledWidth = viewWidth * scaleX;
        float scaledHeight = viewHeight * scaleY;
        float dx = (viewWidth - scaledWidth) / 2;
        float dy = (viewHeight - scaledHeight) / 2;
        
        Matrix matrix = new Matrix();
        matrix.postScale(scaleX, scaleY);
        matrix.postTranslate(dx, dy);

        return matrix;
    }    

如果你的預覽 View 是 SurfaceView:

 Matrix matrix = CameraManager.get().calculateSurfaceHolderTransform();
            float[] values = new float[9];
            matrix.getValues(values);
            surfaceView.setTranslationX(values[Matrix.MTRANS_X]);
            surfaceView.setTranslationY(values[Matrix.MTRANS_Y]);
            surfaceView.setScaleX(values[Matrix.MSCALE_X]);
            surfaceView.setScaleY(values[Matrix.MSCALE_Y]);
            surfaceView.invalidate();

如果你的預覽 View 是 TextureView 更加簡單:

Matrix matrix = CameraManager.get().calculateSurfaceHolderTransform();
textureView.setTransform(matrix);

參考:
ZxingView

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末迫淹,一起剝皮案震驚了整個濱河市秘通,隨后出現(xiàn)的幾起案子为严,更是在濱河造成了極大的恐慌敛熬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件第股,死亡現(xiàn)場離奇詭異应民,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門诲锹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來繁仁,“玉大人,你說我怎么就攤上這事归园』剖” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵庸诱,是天一觀的道長捻浦。 經常有香客問我,道長桥爽,這世上最難降的妖魔是什么朱灿? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮钠四,結果婚禮上盗扒,老公的妹妹穿的比我還像新娘。我一直安慰自己缀去,他們只是感情好侣灶,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朵耕,像睡著了一般炫隶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阎曹,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天伪阶,我揣著相機與錄音,去河邊找鬼处嫌。 笑死栅贴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的熏迹。 我是一名探鬼主播檐薯,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼注暗!你這毒婦竟也來了坛缕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捆昏,失蹤者是張志新(化名)和其女友劉穎赚楚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骗卜,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡宠页,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年左胞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片举户。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡烤宙,死狀恐怖,靈堂內的尸體忽然破棺而出俭嘁,到底是詐尸還是另有隱情躺枕,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布供填,位于F島的核電站屯远,受9級特大地震影響,放射性物質發(fā)生泄漏捕虽。R本人自食惡果不足惜慨丐,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泄私。 院中可真熱鬧房揭,春花似錦、人聲如沸晌端。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咧纠。三九已至蓬痒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漆羔,已是汗流浹背梧奢。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留演痒,地道東北人亲轨。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像鸟顺,于是被迫代替她去往敵國和親惦蚊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容