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)还会受影响吗?

相关推荐
用户693717500138411 小时前
曾经安卓开发人手一个的 EventBus,为什么现在没人爱用了?
android·android studio
九皇叔叔13 小时前
MySQL ORDER BY 性能优化详解:Using filesort、联合索引、ASC/DESC 与覆盖索引
android·adb
OriginCoding13 小时前
用 AI Agent 协作完成一个 Android TOTP 应用:从需求边界到 v1.0.0
android·ai编程
杉氧16 小时前
React 灵魂:深入剖析 Hooks 与副作用(Side Effects)陷阱
android·前端·react native
又见情义17 小时前
RK3568 + RTL8211F 网络唤醒(WOL)功能适配全记录
android·网络·驱动开发
用户09340777351417 小时前
HarmonyOS WPS Open SDK 实践:registerApp 鉴权与就绪门禁
android·typescript·harmonyos
jike_202617 小时前
会议离线录音APP:无网络记录能力对比
android·智能手机·语音识别
always_TT18 小时前
【Python 字符串格式化:format() 方法】
android·开发语言·python
恋猫de小郭18 小时前
AI 时代,一个优化 Flutter 的重复代码工具 Deslop
android·前端·flutter
RisunJan18 小时前
Android 面试知识点整理
android·面试·职场和发展