2012-12-04 85 views
2

我正在使用翻譯和縮放動畫。首先,我將幀佈局轉換到屏幕中心,並使用佈局參數將其位置參數設置到屏幕中心。這工作正常!在翻譯動畫結束時,我運行縮放動畫,我的佈局縮放爲其原始大小的2倍。其實我的框架佈局(我是動畫)由按鈕和圖像視圖組成。和android一樣,動畫不會轉換視圖,只會改變它必須繪製的位置。現在我的問題是,我無法讓我的按鈕工作。因爲他們實際上並不存在!android在縮放動畫後設置新大小

我在動畫結束後通過設置其位置參數找到了翻譯動畫的解決方案。這將視圖永久移動到新位置。

但是,在縮放動畫的情況下,我必須改變佈局的大小以及其內的孩子。但它不起作用,因爲我將原始高度寬度乘以比例因子。這裏是我的比例尺動畫代碼。

ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 2.0f, 1.0f, 
        2.0f, Animation.RELATIVE_TO_SELF, 0.5f, 
        Animation.RELATIVE_TO_SELF, 0.5f); 

      scaleAnim.setDuration(600); 
      // scaleAnim.setFillEnabled(true); 
      scaleAnim.setFillAfter(true); 

      view.setAnimation(scaleAnim); 
      view.startAnimation(scaleAnim); 

      scaleAnim.setAnimationListener(new AnimationListener() { 

       public void onAnimationStart(Animation animation) { 


       } 

       public void onAnimationRepeat(Animation animation) { 


       } 

       public void onAnimationEnd(Animation animation) { 
        FrameLayout.LayoutParams par = (FrameLayout.LayoutParams) view 
          .getLayoutParams(); 

        par.height = view.getMeasuredHeight() * 2; 
        par.width = view.getMeasuredWidth() * 2; 

        view.setLayoutParams(par); 
        view.requestLayout(); 

       } 
      }); 

p.s that setFillAfter(true)and setFillEnabled(true)are not the solution。

+0

你可以通過把你想要它是一切,當動畫結束做到這一點,然後將其動畫到該位置。確保在動畫開始之前將其隱藏並禁用按鈕,直到動畫結束。 – TofferJ

+0

問題是通過縮放動畫原始高度和寬度在縮放後不會改變。所以我的按鈕不起作用 –

+0

即使您創建它們的全尺寸,然後將它們從比例10%縮放到原始大小,也不是這樣嗎?我用翻譯和縮放動畫做了類似的事情。當動畫完成時,我可以點擊按鈕。我會盡力爲你挖掘那段代碼。 – TofferJ

回答

0

使用ObjectAnimator和AnimatorSet解決了這個問題。

+11

可以請你發佈代碼嗎?我也面臨類似的問題。 – Anukool

1

我會評論以上,但我沒有足夠的代表。文檔中的這個頁面解釋了視圖動畫系統和屬性動畫系統之間的區別。從這裏你可以創建ObjectAnimator和AnimatorSet對象,這些對象將移動按鈕並編輯實際視圖,而不僅僅是視圖的繪製。

http://developer.android.com/guide/topics/graphics/prop-animation.html#views

屬性動畫系統允許查看對象的流線型的動畫,並通過觀看動畫系統提供了一些優勢。視圖動畫系統通過改變它們被繪製的方式來轉換視圖對象。這是在每個視圖的容器中處理的,因爲視圖本身沒有可操作的屬性。這導致視圖被動畫,但在視圖對象本身中沒有改變。這導致行爲,例如對象仍然存在於其原始位置,即使它是在屏幕上的不同位置繪製的。在Android 3.0中,添加了新的屬性和相應的getter和setter方法來消除這個缺點。

屬性動畫系統可以通過更改視圖對象中的實際屬性來在屏幕上動畫視圖。另外,視圖也會自動調用invalidate()方法刷新屏幕,只要其屬性發生更改。

0
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1, 1.2f); 
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1, 1.2f); 
ObjectAnimator scaleAnimation = ObjectAnimator.ofPropertyValuesHolder(your_view, pvhX, pvhY); 

AnimatorSet setAnimation = new AnimatorSet(); 
setAnimation.play(scaleAnimation); 
setAnimation.start();