2013-07-17 77 views
1

我有一個自定義視圖,我實現了onDraw,並且它成功地繪製了背景以及右上角的一個小覆蓋圖像。我是動畫疊加圖像(AnimationSet與ScaleAnimation和旋轉動畫)做手工: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()時,它不會觸發自定義View的onDraw。

所以......

  • 將這種做法的工作?
  • 如果是這樣,是否有任何其他因素比Rect傳遞給parent.invalidate(),它確定是否會調用自定義Views onDraw方法?

回答

1

經過大量的搜索,答案很明顯。我只需將父級的clipChildren屬性設置爲false。不需要使父項失效,只需要自定義View。

在4.0.3平板電腦上工作正常。然而,在Galaxy Nexus(4.2.2)中,它不僅在動畫期間渲染到邊界之外,而且實際上只清除了傳遞給無效的Rect背景。所以,當動畫完成後,圖像的殘餘部分在Rect之外仍然可見。解決方案是通過一個足夠大的Rect覆蓋動畫過程中最大的繪製位圖。

+0

感謝您的大量研究。我在這裏看到同樣的問題,從我可以告訴問題是,對於縮放視圖,Android會錯誤地計算需要重繪的區域。 Android錯誤地剪切了之前的寬度和/或高度和縮放的之間的任何東西。將clipChildren設置爲false是一種我不會推薦的方法(因爲您已經看到它有副作用)。如果你以另一種方式解決了這個問題,請讓我知道,因爲我目前還不知道如何解決這個問題,如果可以完成的話。 –