展讯平台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才会真正显示出来,供用户选择切换。