国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

關于自定義相機預覽界面拉伸問題

2019-11-09 17:12:28
字體:
來源:轉載
供稿:網(wǎng)友

關于自定義相機預覽界面拉伸問題

導致主要變形的原因是Camera預覽界面旋轉的角度和攝像頭掛載的角度不同導致的我們的Activity設置的方向是豎屏,這是手機的自然方向 所以寬比高短角度:所謂屏幕和攝像頭的角度,指的是相對于自然方向旋轉過的角度,根據(jù)旋轉角度即可獲知當前的方向假如說:手機是豎屏的情況下, 自然角度為0,但是Camera逆時針旋轉90度,那咱們設置順時針旋轉90度,就正常 。手機是橫屏的情況下Camera返回為0度 ,如果設置順時針旋轉90度,就回旋轉

怎么設置預覽界面與實景保持一致的方法,官方給出的文檔:

public static void setCameraDisplayOrientation(Activity activity,int cameraIo, Camera camera){Camera.CameraInfo info=new Camera.CameraInfo();Camera.getCameraInfo(cameraIo,info);int rotation=activity.getWindowManager().getDefaultDisplay().getRotation();int degress=0;switch(rotation){case Surface.ROTATION_0: degress=0; break;case Surface.ROTATION_90: degress=90; break; case Surface.ROTATION_180: degress=180; break;case Surface.ROTATION_270: degress=270; break;}int result;if(info.facing=Camera.CameraInfo.CAMERA_FACING_FRONT){ result = (info.orientation + degrees) % 360; > 就是攝像頭需要順時針轉過多少度才能恢復自然方向 result = (360 - result) % 360; } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result);switch (result) { case 0: case 180: setCameraSize(camera.getParameters(), getScreenWidth(), getScreenHeight()); break; case 90: case 270: setCameraSize(camera.getParameters(), getScreenHeight(), getScreenWidth()); break;}}public static void setCameraSize(Camera.Parameters parameters, int width, int height) { Map<String, List<Size>> allSizes = new HashMap<>(); String typePReview = "typePreview"; String typePicture = "typePicture"; allSizes.put(typePreview, parameters.getSupportedPreviewSizes()); allSizes.put(typePicture, parameters.getSupportedPictureSizes()); Iterator iterator = allSizes.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, List<Size>> entry = (Map.Entry<String, List<Size>>) iterator.next(); List<Size> sizes = entry.getValue(); if (sizes == null || sizes.isEmpty()) continue; ArrayList<WrapCameraSize> wrapCameraSizes = new ArrayList<>(sizes.size()); for (Size size : sizes) { WrapCameraSize wrapCameraSize = new WrapCameraSize(); wrapCameraSize.setWidth(size.width); wrapCameraSize.setHeight(size.height); wrapCameraSize.setD(Math.abs((size.width - width)) + Math.abs((size.height - height))); if (size.width == width && size.height == height) { if (typePreview.equals(entry.getKey())) { parameters.setPreviewSize(size.width, size.height); } else if (typePicture.equals(entry.getKey())) { parameters.setPictureSize(size.width, size.height); } Log.d(TAG, "best size: width=" + size.width + ";height=" + size.height); break; } wrapCameraSizes.add(wrapCameraSize); } Log.d(TAG, "wrapCameraSizes.size()=" + wrapCameraSizes.size()); Size resultSize = null; if (typePreview.equals(entry.getKey())) { resultSize = parameters.getPreviewSize(); } else if (typePicture.equals(entry.getKey())) { resultSize = parameters.getPictureSize(); } if (resultSize == null || (resultSize.width != width && resultSize.height != height)) { //找到相機Preview Size 和 Picture Size中最適合的大小 if(wrapCameraSizes.isEmpty()) continue; WrapCameraSize minCameraSize = Collections.min(wrapCameraSizes); while (!(minCameraSize.getWidth() >= width && minCameraSize.getHeight() >= height)) { wrapCameraSizes.remove(minCameraSize); if(wrapCameraSizes.isEmpty()) break; minCameraSize = null; minCameraSize = Collections.min(wrapCameraSizes); } Log.d(TAG, "best min size: width=" + minCameraSize.getWidth() + ";height=" + minCameraSize.getHeight()); if (typePreview.equals(entry.getKey())) { parameters.setPreviewSize(minCameraSize.getWidth(), minCameraSize.getHeight()); } else if (typePicture.equals(entry.getKey())) { parameters.setPictureSize(minCameraSize.getWidth(), minCameraSize.getHeight()); } } iterator.remove(); } }先將獲取手機支持預覽的尺寸列表通過parmeters.getSupportPreviewSize返回的是一個集合。進行屏幕方向的判斷,因為預覽的尺寸都是w>h 如果是豎屏,則需要將寬和高進行調(diào)換將預覽尺寸列表的每個元素的寬和高與SurfaceView的寬和高進行比較,如果存在寬和高尺寸SurfaceView的寬和高,相同的size,則將當前的寬高設置為預覽尺寸如果沒有找到該步驟,則將尺寸列表的比例和SUrfaceView的比例做比較,找一個相同或者相近的 。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桃江县| 临猗县| 兴化市| 无棣县| 巫山县| 岗巴县| 老河口市| 汉沽区| 昔阳县| 呼图壁县| 冀州市| 玛沁县| 兴隆县| 衡水市| 宁海县| 乌鲁木齐县| 陆良县| 韩城市| 和田县| 富顺县| 河南省| 万荣县| 大渡口区| 麟游县| 博湖县| 峨眉山市| 新和县| 平泉县| 阳西县| 东城区| 息烽县| 定州市| 淮安市| 河南省| 慈溪市| 北京市| 富民县| 长春市| 定日县| 紫阳县| 忻城县|