0

Bir rüzgar türbininin dönen parçalarına sahip olan bir ImageView yarattık ve ona bir döndürme animasyonu uyguladıktan sonra kullanıcının boyutunu değiştirmesine izin veren bir SeekBar (kaydırıcı) ekledik. döner bıçaklar.Döndürme animasyonu sırasında ImageView boyutunu kolayca ayarlayın

Birçok farklı geçici çözüm denedik, ancak bunların hepsinde sorun var.

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) { 

     } 
    }); 

ve burada ilişkili animasyon xml (dinleyici önce part_imageView uygulanan etkindir): İşte bizim şimdiki SeekBarListener bu.

<?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> 

biz sadece onProgressChanged içinde ImageView genişliğini ve yüksekliğini değişiyordu çalıştı, ancak bu animasyonu güncelleme yoktu ve merkezde artık olan bir eksen etrafında hareketli ilk şey (benim tahminim olmasıdır pivot noktasını sürekli hesaplamak yerine sabit bir konuma dönüştürür).

Ardından, pivot noktasını Y ile aynı olan part_imageView.setPivotX(50); ile sıfırlamaya çalıştık, ancak bu, döndürme üzerinde herhangi bir etkiye sahip gibi görünmüyordu, hala eksen dışı dönüyordu.

Daha sonra, yalnızca animasyonu yeniden denedim, ancak bu, dönüşü başlangıç ​​noktasına döndürdü; bu istenmeyen bir durumdu ve spastik görünüyordu.

Sonraki, boyutu değiştirdikten sonra part_imageView.getAnimation().reset(); numaralı telefonu arayarak şu anda onProgressChanged öğesinde çalıştım. Bu, geçerli yeri rotasyonda (iyi) korudu, ancak çubuk her değiştiğinde bir kare (kötü) için rotasyonlarının başlangıcında bir bıçak görüntüsünü parladı. SeekBar oldukça sürekli olduğu için (100 ayar), görüntü neredeyse değiştiğinde, boyutu değiştirdiğimizde görüntü korkunç görünüyor.

İstediğimiz şey, çubuğu, görüntüyü bozmadan, ImageView'ın boyutunu sorunsuz bir şekilde değiştirebilmektir. Buna yaklaşmanın veya hızlı bir düzeltmenin daha iyi bir yolu var mı?

+0

kullanımını pskink ederiz 'RotateDrawable': (sizin ImageView boyutlandırma sonra sabit değildir) çizerken dinamik Pivot hesaplama kullanması – pskink

+0

ben kullanmaya çalıştı Bir RotateDrawable, ancak dönmez, sadece çekilebilir yükleme. Onu nasıl canlandıracağımı biliyor musun? Ayrıca animasyonlu döndürmeyi kullanmayı denedim, ancak bu son derece dalgalıydı (yaklaşık 8 kare/dönüş), ancak aksi halde nasıl olmasını isterdim. –

+0

hedef nesne ile bir ObjectAnimator kullanmak için bir özellik olarak "seviye" ile ve 0..10000 – pskink

cevap

0

Figured out out! Görünüm animasyonu yerine bir özellik animasyonu kullanarak, xml'de objectAnimator oluşturup animasyonu ImageView'e uygulayarak sona erdi. İşte

xml var:
<?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> 

sen :)

İlgili konular