今天在项目中测验提了一个特别奇怪的问题,自定义的camera预览页面左右拖动或许上下拖动时,页面预览只剩一半了,另一半黑了。。。

Android12+ ScrollView自带的阻尼动画很酷炫?小心有坑!

Android12+ ScrollView自带的阻尼动画很酷炫?小心有坑!

正常预览显现没问题,便是手指放在预览的当地一拖动,不管是上下仍是左右都会半边黑,手指脱离正常,看到这,各位肯定会认为我在页面中加了触摸事情,或许有其他的逻辑,最初我也认为是有的,所以我给预览加了触摸阻拦,上层View也加了触摸阻拦,简直所有的View都加了,类似于这样:回来true,不让基层View处理用户事情。

mCameraPreviewView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
            return true;
      }
 });

最终一点用没有,断点看了,确实给阻拦了,但是仍是半边黑,没改变。。。奇了怪了。

但是遇到问题不能老想着见了,怀揣着唯物主义思想的我,抱着怀疑一切的情绪,极力做一些尝试。

camera是放在fragment里边的,莫非跟fragment有联系?那就放到Activity里边试试看,咦嘶,没缺点,在Acitivity里边预览是正常的,真的跟fragment有联系?不能啊,这不科学,真实想不出来这有啥联系,而我那个camera又必须依靠与fragment,所以只能再想想其他方法了。

莫非是预览被揉捏了?androidx.camera.view.PreviewView上掩盖叠加一个View色块试试会不会也被揉捏到?结果:没有,色块没被揉捏。。。

那就只能是预览的问题了?预览在什么状况下会变成一半黑一半正常呢,查询谷歌仍是百度都没有遇到相同状况的,在看谷歌Camera的API文档中下面有一句是这么写的

当预览视频分辨率与方针 PreviewView 的尺寸不同时,视频内容需要通过取舍操作或增加遮幅式黑边来习惯视图(保持原始宽高比)。为此,PreviewView 提供了以下 ScaleTypes:
FIT_CENTER、FIT_START 和 FIT_END,用于增加遮幅式黑边。整个视频内容会调整(放大或缩小)为可在方针 PreviewView 中显现的最大尺寸。不过,虽然整个视频帧会完整显现,但屏幕画面中可能会出现空白部分。视频帧会与方针视图的中心、起始或完毕方位对齐,具体取决于您在上述三种缩放类型中选择了哪一种。
FILL_CENTER、FILL_START 和 FILL_END,用于进行取舍。假如视频的宽高比与 PreviewView 不匹配,画面中只会显现部分内容,但视频仍会填满整个 PreviewView。
CameraX 运用的默认缩放类型是 FILL_CENTER。您可以运用 PreviewView.setScaleType() 设置最适合具体使用的缩放类型。

莫非是因为设置了scaleType导致预览主动裁剪?可这用的便是默认的FILL_CENTER,页面怎样像是设置成了FIT_START,感觉此刻思想进入了误区,离结果很近,又很远。

mCameraPreviewView.setScaleType(PreviewView.ScaleType.FILL_CENTER)

只能从源头找原因了,一遍又一遍的滑动去感觉里边的区别,后来测验说android12+ 才会这样,其他的正常!一遍又一遍滑动过程中也注意到了不管是上下仍是左右滑动(这里的左右滑动不是肯定水平的左右滑动,也带有上下的视点偏移),都会带动一个动画回弹作用,也便是android12+才有的阻尼动画,这肯定是androidx.core.widget.NestedScrollView的问题,所以抱着尝试的心态把阻尼动画关了,android:overScrollMode="never"设置下这个,运行正常了!!!!

提问: 1.有阻尼动画为什么会导致预览画面反常呢?是因为页面显现比例发生了改变导致的? 2.当前预览设置的setTargetAspectRatio(AspectRatio.RATIO_16_9),那假如改成setTargetAspectRatio(AspectRatio.RATIO_4_3)还会受影响吗?