Android R上展讯平台CameraAPP获取PictureSize的流程

展讯平台MMX客户要求添加PictureSize,因此将获取PictureSize的流程追了下,现将跟踪结果整理下来。

不多说,直接上一张在StartUml中画好的流程图
在这里插入图片描述
从DataModulePhoto请求获取PictureSize到ResolutionUtil返回从底层读到的size集合流程,在上图的可以很清晰的看到。下面来说下在得到底层配置的size集合后,上层app做了什么过滤。
在这里插入图片描述
1,分类
该方法上来第一步调用parseAvailableSizes(),可以看到该方法就是根据比例做了分类,以比例值为key,符合该比例的size作为该key下的value。比如4:3的比例,底层可能配置了好几个都是4:3的size,还可能有些size与4:3相差很小很小,在设置的误差范围内,都会将其划分为一类。

private static List<ResolutionBucket> parseAvailableSizes(List<Size> sizes, boolean isBackCamera) {
        HashMap<Float, ResolutionBucket> aspectRatioToBuckets = new HashMap<Float, ResolutionBucket>();

        for (Size size : sizes) {
            Float aspectRatio = (float) size.getWidth() / (float) size.getHeight();
            // If this aspect ratio is close to a desired Aspect Ratio,
            // fuzz it so that they are bucketed together
            aspectRatio = fuzzAspectRatio(aspectRatio);
            ResolutionBucket bucket = aspectRatioToBuckets.get(aspectRatio);
            if (bucket == null) {
                bucket = new ResolutionBucket();
                bucket.aspectRatio = aspectRatio;
                aspectRatioToBuckets.put(aspectRatio, bucket);
            }
            bucket.add(size);
        }
        if (ApiHelper.IS_NEXUS_5 && isBackCamera) {
            aspectRatioToBuckets.get(16 / 9.0f).add(NEXUS_5_LARGE_16_BY_9_SIZE);
        }
        List<ResolutionBucket> sortedBuckets = new ArrayList<ResolutionBucket>(
                aspectRatioToBuckets.values());
        Collections.sort(sortedBuckets, new Comparator<ResolutionBucket>() {
            @Override
            public int compare(ResolutionBucket resolutionBucket, ResolutionBucket resolutionBucket2) {
                return Integer.compare(resolutionBucket2.maxPixels, resolutionBucket.maxPixels);
            }
        });
        return sortedBuckets;
    }
private static float fuzzAspectRatio(float aspectRatio) {
        for (float desiredAspectRatio : sDesiredAspectRatios) {
            if ((Math.abs(aspectRatio - desiredAspectRatio)) < ASPECT_RATIO_TOLERANCE) {
                return desiredAspectRatio;
            }
        }
        return aspectRatio;
    }

2,去除sDesiredAspectRatios数组配置之外的比例
经过第一步的分类之后,我们得到了各个比例下的size值,但是不是所有的比例都是需要显示出来给用户配置的,因为需要将客户不需要的比例去除掉。

3,pickUpToThree,挑选某个比例的前3个size,多余的去除
比如4:3的比例,底层可能配置了好多个,这里会根据一定规则(tries to find one at 50% of the last chosen size for the subsequent size.)来挑选3个符合要求的比例出来

经过上述3个步骤的过滤,最终保留下来的size才会真正显示出来,供用户选择切换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值