2013-07-17 4 views
1

У меня есть пользовательский вид, где я реализую 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?

ответ

1

После долгих поисков ответ был очевиден. Мне просто нужно было установить для свойства clipChildren родителя значение false. Не нужно было аннулировать родителя, только пользовательский вид.

Это хорошо работало на планшете 4.0.3. Однако на Galaxy Nexus (4.2.2) он не только визуализировался вне границ во время анимации, но фактически очистил только фон Rect, который был отменен. Итак, когда анимация была сделана, некоторые остатки изображения все еще были видны вне Rect. Решение состояло в том, чтобы передать Rect достаточно большой, чтобы покрыть самый большой из рисованных растровых изображений во время анимации.

+0

Благодарим вас за огромное количество исследований. Здесь я вижу ту же проблему, и из того, что я могу сказать, проблема заключается в том, что для масштабированного вида Android ложно вычисляет область, которую нужно перерисовать. Android ложно зажимает что-либо между предыдущей шириной и/или высотой и масштабированной, соответственно. Установка clipChildren в false - это подход, который я бы не рекомендовал (поскольку вы видели, что он имеет побочные эффекты). Если вы решили это по-другому, сообщите мне, поскольку я в настоящее время не знаю, как это решить, если это вообще можно сделать. –

 Смежные вопросы

  • Нет связанных вопросов^_^