我有一个自定义视图,我在其中实现了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。
所以......
答案 0 :(得分:1)
经过大量的搜索,答案显而易见。我只需要将父级的clipChildren属性设置为false。不需要使父项无效,只需要自定义视图。
在4.0.3平板电脑上运行良好。然而,在Galaxy Nexus(4.2.2)上,它不仅在动画期间渲染到边界之外,它实际上只清除了传递给无效的Rect的背景。因此,当完成动画时,在Rect之外仍然可以看到图像的一些残余。解决方案是传递一个足够大的Rect来覆盖动画期间绘制的最大位图。