自定义视图中的ScaleAnimation被剪裁

时间:2013-07-17 22:59:35

标签: android animation invalidation custom-view

我有一个自定义视图,我在其中实现了onDraw,它成功地绘制了背景以及右上角的小叠加图像。我通过执行以下操作手动为该叠加图像(带有ScaleAnimation和旋转动画的AnimationSet)设置动画:

final AnimationSet animationSet = new AnimationSet(false);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(rotationAnimation);
animationSet.setFillAfter(true);
post(new Runnable() {
    @Override
    public void run () {
        animationSet.start();
        new Handler().post(getAnimationRunnable(animationSet));
    }

    private Runnable getAnimationRunnable (final AnimationSet animationSet) {
        return new Runnable() {
            @Override
            public void run () {
                final Transformation outTransformation = new Transformation();
                if (animationSet.getTransformation(System.currentTimeMillis(), outTransformation)) {
                    // store matrix for applying in onDraw
                    mMatrix = outTransformation.getMatrix();
                    // THIS INVALIDATE DOESN'T WORK
                    parent.invalidate(new Rect(getParentInvalidateRect()));
                    post(getAnimationRunnable(animationSet));
                }
            }
        };
    }
});

如果我使自定义视图无效......

                    // THIS INVALIDATE DOES WORK
                    invalidate(getOverlayClientRect());

然后动画发生并且一切都很好,除了动画图像现在被剪裁 - 因为它被放大,超出了顶部和右边界。

但是当我将一个Rect传递给与自定义视图的右上角区域相交的parent.invalidate()时,它不会触发自定义视图的onDraw。

所以......

  • 这种方法会起作用吗?
  • 如果是这样,除了传递给parent.invalidate()的Rect之外还有其他因素确定它是否会调用自定义Views onDraw方法吗?

1 个答案:

答案 0 :(得分:1)

经过大量的搜索,答案显而易见。我只需要将父级的clipChildren属性设置为false。不需要使父项无效,只需要自定义视图。

在4.0.3平板电脑上运行良好。然而,在Galaxy Nexus(4.2.2)上,它不仅在动画期间渲染到边界之外,它实际上只清除了传递给无效的Rect的背景。因此,当完成动画时,在Rect之外仍然可以看到图像的一些残余。解决方案是传递一个足够大的Rect来覆盖动画期间绘制的最大位图。