使用Scale动画缩放LinearLayout后内部CardView点击位置错位如何解决
问题根因
你当前使用的是Android传统**补间动画(Tween Animation)**实现缩放效果,这类动画仅修改View的渲染绘制效果,不会改变View本身的真实布局属性(包括位置、宽高、缩放系数等),因此系统的触摸点击判定逻辑仍然会沿用动画执行前的原始参数,就会出现视觉位置和点击响应区域错位的问题。
推荐解决方案:替换为属性动画
属性动画(Property Animation)会直接修改View的真实属性,缩放完成后点击区域会自动匹配当前显示的位置和大小,无需额外适配,修改成本极低。
修改步骤:
- 删掉原来
zoom_in.xml、zoom_out.xml两个补间动画文件,无需再使用 - 修改
TaxaTreeViewActivity中的缩放逻辑,替换为View属性动画实现:
// 删掉原来补间动画的加载逻辑 // zoomInAnim = AnimationUtils.loadAnimation(this, R.anim.zoom_in); // zoomOutAnim = AnimationUtils.loadAnimation(this, R.anim.zoom_out); zoomOutButton.setOnClickListener(v -> { // 对TreeView执行缩小动画,可替换为treeviewContainer实现父容器整体缩放 treeView.animate() .scaleX(0.2f) .scaleY(0.2f) .setDuration(2500) // 锚点保持中心缩放,和原来的动画效果一致 .setPivotX(treeView.getWidth() / 2f) .setPivotY(treeView.getHeight() / 2f) .start(); }); zoomInButton.setOnClickListener(v -> { treeView.animate() .scaleX(2f) .scaleY(2f) .setDuration(1000) .setPivotX(treeView.getWidth() / 2f) .setPivotY(treeView.getHeight() / 2f) .start(); });
可选兼容方案(坚持使用补间动画的场景)
如果需要保留原有补间动画实现,需要在动画结束后手动更新View的真实布局参数:给补间动画设置AnimationListener,在onAnimationEnd回调中修改treeView的LayoutParams,主动调用measure()、layout()方法更新View的真实位置和大小,同时需要自行处理触摸事件的坐标转换,实现成本较高,不推荐。
内容的提问来源于stack exchange,提问作者JonR85
相关产品推荐
相关产品推荐

