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

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

正常预览显示没问题,就是手指放在预览的地方一拖动,不管是上下还是左右都会半边黑,手指离开正常,看到这,各位肯定会以为我在页面中加了触摸事件,或者有其他的逻辑,最初我也以为是有的,所以我给预览加了触摸拦截,上层View也加了触摸拦截,几乎所有的View都加了,类似于这样:返回true,不让下层View处理用户事件。

typescript 复制代码
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文档中下面有一句是这么写的

scss 复制代码
当预览视频分辨率与目标 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,感觉此时思维进入了误区,离结果很近,又很远。

scss 复制代码
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)还会受影响吗?

相关推荐
ac-er88882 小时前
Yii框架中的队列:如何实现异步操作
android·开发语言·php
流氓也是种气质 _Cookie4 小时前
uniapp 在线更新应用
android·uniapp
zhangphil6 小时前
Android ValueAnimator ImageView animate() rotation,Kotlin
android·kotlin
徊忆羽菲6 小时前
CentOS7使用源码安装PHP8教程整理
android
编程、小哥哥7 小时前
python操作mysql
android·python
Couvrir洪荒猛兽8 小时前
Android实训十 数据存储和访问
android
五味香10 小时前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
十二测试录11 小时前
【自动化测试】—— Appium使用保姆教程
android·经验分享·测试工具·程序人生·adb·appium·自动化
Couvrir洪荒猛兽12 小时前
Android实训九 数据存储和访问
android
aloneboyooo13 小时前
Android Studio安装配置
android·ide·android studio