0

我們創建了一個ImageView,其中包含風力渦輪機的旋轉部分,並對其應用旋轉動畫,然後添加一個SeekBar(滑塊),允許用戶更改旋轉刀片。在旋轉動畫過程中平滑調整ImageView大小

我們嘗試了一堆不同的解決方法,但它們都有問題。下面是我們目前SeekBarListener:

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 

     // ImageView handle 
     final ImageView part_imageView = (ImageView) view_final.findViewById(R.id.part_imageView); 

     // When progress changes, change size of blades 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

      part_imageView.getLayoutParams().height = 300 + (2 * progress); 
      part_imageView.getLayoutParams().width = 300 + (2 * progress); 
      part_imageView.getAnimation().reset(); 


      seekBar_text.setText(part_name + " size : " + (progress + 1)); 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 

,這裏是相關的動畫XML(聽衆之前應用於part_imageView啓用)。

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator"> 

    <rotate 
     android:fromDegrees="0" 
     android:toDegrees="360" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:repeatCount="infinite" 
     android:duration="4000" /> 

</set> 

我們試圖只改變了onProgressChanged的ImageView的寬度和高度,但這並沒有更新的動畫和動畫它周圍的不再是在中心軸的第一件事(我的猜測是,它將樞軸點轉換爲固定位置,而不是連續計算)。

接下來,我們嘗試使用part_imageView.setPivotX(50);重置樞軸點,對Y也是如此,但這對旋轉沒有任何影響,但它仍然是離軸旋轉。

接下來我們試着重新應用動畫,但是這會將旋轉重置到其起始點,這是不理想的,並且看起來很痙攣。

接下來,我嘗試了onProgressChanged中的當前內容,更改大小後調用part_imageView.getAnimation().reset();。這使得當前位置保持旋轉狀態(良好),但是在每次條形變化時,在旋轉開始時閃爍一幀圖像(壞)。由於SeekBar非常連續(100種設置),圖像幾乎在我們改變尺寸的整個時間都閃爍,這看起來很可怕。

我們希望能夠在不中斷動畫的情況下平滑地更改ImageView的大小。有沒有更好的方法來解決這個問題或快速解決?

+0

使用'RotateDrawable':它使用動態樞紐計算繪圖時(這是不固定的調整您的ImageView後) – pskink

+0

我試圖用一個RotateDrawable,但它不旋轉,只是加載drawable。你知道我如何讓它動畫? 我也嘗試使用動畫旋轉,但這是非常波濤洶涌(約8幀/旋轉),但它否則表現我想要它。 –

+0

您需要使用ObjectAnimator並將目標對象設置爲您的可繪製對象,將「level」作爲屬性並且值介於0..10000之間 – pskink

回答

0

想通了! 使用屬性動畫而不是視圖動畫結束,在xml中創建objectAnimator並將動畫應用於ImageView。

這裏的XML:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator" 
    android:ordering="sequentially" > 

    <objectAnimator 
     android:interpolator="@android:anim/linear_interpolator" 
     android:propertyName="rotation" 
     android:repeatCount="infinite" 
     android:repeatMode="restart" 
     android:duration="4000" 
     android:valueFrom="0" 
     android:valueTo="360" 
     android:valueType="floatType" /> 

</set> 

謝謝pskink :)