2010-04-01 1 views
2

Я хотел бы получить матрицу преобразования анимации, чтобы вычислить положение анимированного представления.Получение матрицы преобразования анимации в Android

Кажется, класс Animation имеет метод getTransformation, который можно использовать для получения преобразования, применяемого к представлению.

Однако, если я использую getTransformation перед запуском анимации, я получаю идентификационную матрицу. И если я использую это так:

public void onAnimationEnd(Animation animation) { 
    Transformation t = new Transformation(); 
    animation.getTransformation(animation.getDuration(), t); 
} 

Программа входит в infite цикл, поскольку getTransformation кажется, чтобы вызвать onAnimationEnd (почему?).

Как использовать getTransformation для получения матрицы преобразования анимации? Есть ли другой способ сделать это?

ответ

0

Потому что по какой-то причине кодировка getTransformation кодируется.

http://www.netmite.com/android/mydroid/1.5/frameworks/base/core/java/android/view/animation/Animation.java

Похоже, что вы можете проверить hasEnded(), чтобы увидеть, если анимация завершена. Попробуйте что-то вроде этого:

public void onAnimationEnd(Animation animation) 
{ 
    if (animation.hasEnded()) 
     return; 

    Transformation t= new Transformation(); 
    animation.getTransformation(animation.getDuration(), t); 
} 
0

Я встретил эту проблему тоже, когда я хочу getTransformation() для следующей анимации после предыдущей анимации сделано, то бесконечный цикл причина StackOverflow.

Я проанализировал проблемы с исходным кодом Android от GrepCode с кодами ниже в getTransformation(), я никогда не найти каких-либо проблем, которые бы вызвать бесконечный цикл, так как только место вызова onAnimationEnd(), он установит mEnded в действительности. При следующем звонке getTransformation() он должен быть заблокирован if(!mEnded), но это не так.

if (expired) { 
     if (mRepeatCount == mRepeated) { 
      if (!mEnded) { 
       mEnded = true; //this is not real!!! 
       if (mListener != null) { 
        mListener.onAnimationEnd(this); 
       } 
      } 
     } else { 
      if (mRepeatCount > 0) { 
       mRepeated++; 
      } 

      if (mRepeatMode == REVERSE) { 
       mCycleFlip = !mCycleFlip; 
      } 

      mStartTime = -1; 
      mMore = true; 

      if (mListener != null) { 
       mListener.onAnimationRepeat(this); 
      } 
     } 
    } 

Он не соответствует этим сегментам кода grepcode. Истина заключается в том, что eEnded = true устанавливается после onAnimationEnd() называется:

if (!mEnded) { 
      if (mListener != null) { 
       mListener.onAnimationEnd(this); 
      } 
      //it happen after onAnimationEnd(). cancel() is also does as this 
      mEnded = true; 
     } 

Это должно объяснить, почему бесконечный цикл происходит. Даже вы проверяете animation.hasEnded() не помогли бы, так как он не мог дотянуться до установленного значения mEnded.

Пути я пробивающий с этой проблемой является:
Установить флаг в слушателе для защиты:

boolean needBlock = false; 
public void onAnimationEnd(Animation animation) 
{ 
    if (needBlock) return; 

    needBlock = true; 
    Transformation t= new Transformation(); 
    animation.getTransformation(animation.getDuration(), t); 
} 

Clear AnimationListner. При необходимости, мы можем установить обратно после

public void onAnimationEnd(Animation animation) 
{ 
    animation.setAnimationListener(null); 
    Transformation t= new Transformation(); 
    animation.getTransformation(animation.getDuration(), t); 
    animation.setAnimationListener(this); 
} 
+0

андроид код из GrepCode является version2.2.2 для андроида версии <= 2,1 'починили = true' действительно за' onAnimationEnd() '. Я разработал андроид на уровне 8, так что проблема произошла. Для последней версии Android она не должна иметь такой бесконечный цикл – Ider