gpt4 book ai didi

android - 自定义 View 中的 ScaleAnimation 被剪裁

转载 作者:行者123 更新时间:2023-11-30 03:29:28 24 4
gpt4 key购买 nike

我有一个自定义 View ,我在其中实现了 onDraw,它成功地绘制了背景以及右上角的小叠加图像。我通过以下操作手动为覆盖图像(带有 ScaleAnimation 和 Rotate Animation 的 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));
}
}
};
}
});

如果我这样使自定义 View 无效...

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

然后动画出现了,一切都很好,除了动画图像现在被剪裁了——因为它被放大了,超出了上边界和右边界。

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

所以...

  • 这种方法行得通吗?
  • 如果是这样,除了传递给 parent.invalidate() 的 Rect 之外,是否还有其他因素决定是否调用自定义 View 的 onDraw 方法?

最佳答案

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

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

关于android - 自定义 View 中的 ScaleAnimation 被剪裁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17711725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com