You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Scale动画缩放LinearLayout后内部CardView点击位置错位如何解决

问题根因

你当前使用的是Android传统**补间动画(Tween Animation)**实现缩放效果,这类动画仅修改View的渲染绘制效果,不会改变View本身的真实布局属性(包括位置、宽高、缩放系数等),因此系统的触摸点击判定逻辑仍然会沿用动画执行前的原始参数,就会出现视觉位置和点击响应区域错位的问题。


推荐解决方案:替换为属性动画

属性动画(Property Animation)会直接修改View的真实属性,缩放完成后点击区域会自动匹配当前显示的位置和大小,无需额外适配,修改成本极低。

修改步骤:

  1. 删掉原来zoom_in.xml、zoom_out.xml两个补间动画文件,无需再使用
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:06:09