2017-05-11 80 views
4

我試圖調整視圖的大小以使用ValueAnimator來適合其他視圖的大小。我使用它來代替動畫,因爲我需要之後可以點擊的視圖。使用ValueAnimator將視圖縮放到另一個視圖的大小

private Animator getHeightScaleAnimator(View target) { 
    ConstraintLayout.LayoutParams thisParams = (ConstraintLayout.LayoutParams) getLayoutParams(); 
    ConstraintLayout.LayoutParams targetParams = (ConstraintLayout.LayoutParams) target.getLayoutParams(); 

    int currentHeight = thisParams.height; 
    int desiredHeight = targetParams.height; 

    ValueAnimator animator = ValueAnimator.ofInt(currentHeight, desiredHeight); 
    animator.addUpdateListener(animation -> { 
     int newInt = (int) animation.getAnimatedValue(); 
     thisParams.width = newInt; 
     invalidate(); 
     requestLayout(); 
    }); 
    return animator; 
} 

上面的代碼示出了其中我試圖增加視圖的高度期望的視圖的高度的方法,以及我對寬度相同的方法,但與寬度而不是高度。

期望的行爲是增加它的大小,直到它像目標視圖一樣大,但由於某種奇怪的原因,視圖移動而不是調整大小。

實現類是ImageView的擴展,但ImageView沒有改變方法。


我還能做些什麼來增加視圖的大小到另一個視圖的大小以動畫方式?

+1

你是否知道[場景和轉變]的(https://developer.android.com/training/transitions/index.html)?你可以使用'android.support.transition'來支持舊設備 – pskink

+0

我看了一下,但不認爲這對我有幫助 – Kerooker

+0

或者我不明白它 – Kerooker

回答

3

只需在代碼中添加以下方法即可。

private Animator getViewScaleAnimator(View from, final View target) { 
     // height resize animation 
     AnimatorSet animatorSet = new AnimatorSet(); 
     int desiredHeight = from.getHeight(); 
     int currentHeight = target.getHeight(); 
     ValueAnimator heightAnimator = ValueAnimator.ofInt(currentHeight, desiredHeight); 
     heightAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator animation) { 
       ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) target.getLayoutParams(); 
       params.height = (int) animation.getAnimatedValue(); 
       target.setLayoutParams(params); 
      } 
     }); 
     animatorSet.play(heightAnimator); 

     // width resize animation 
     int desiredWidth = from.getWidth(); 
     int currentWidth = target.getWidth(); 
     ValueAnimator widthAnimator = ValueAnimator.ofInt(currentWidth, desiredWidth); 
     widthAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator animation) { 
       ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) target.getLayoutParams(); 
       params.width = (int) animation.getAnimatedValue(); 
       target.setLayoutParams(params); 
      } 
     }); 
     animatorSet.play(widthAnimator); 
     return animatorSet; 
    } 

並調用它的任何事件。(如點擊)

getViewScaleAnimator(fromView, targetView).setDuration(1000).start(); 

這裏是一個輸出。

enter image description here

0

我沒有試過,但還沒有代替ValueAnimator的,你可以嘗試使用ScaleAnimation:

float scaleY = (float) currentHeight/(float) desiredHeight; 
curView.animate().scaleY(scaleY); 

當然,你需要做相同的寬度是否可以正常工作,因爲與scaleY你只是在擴大身高。

此外,如果您想更改動畫持續時間,則可以致電.setDuration(1000)

相關問題