У меня есть пользовательский вид, где я реализую onDraw, и он успешно рисует фон, а также небольшое оверлейное изображение в правом верхнем углу. Я живой, что изображение наложения (AnimationSet с ScaleAnimation и Rotate Animation) вручную, выполнив:ScaleAnimation в пользовательском представлении получить обрезанный
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 для пользовательского представления.
Итак ...
- будет такой подход работает?
- Если да, то есть ли какой-либо другой фактор, чем Rect, переданный parent.invalidate(), который определяет, будет ли он вызывать пользовательский метод Views onDraw?
Благодарим вас за огромное количество исследований. Здесь я вижу ту же проблему, и из того, что я могу сказать, проблема заключается в том, что для масштабированного вида Android ложно вычисляет область, которую нужно перерисовать. Android ложно зажимает что-либо между предыдущей шириной и/или высотой и масштабированной, соответственно. Установка clipChildren в false - это подход, который я бы не рекомендовал (поскольку вы видели, что он имеет побочные эффекты). Если вы решили это по-другому, сообщите мне, поскольку я в настоящее время не знаю, как это решить, если это вообще можно сделать. –