2010-09-27 24 views
25

etrafında Aşağıdaki kod ile garip sonuçlar alıyorum:Drawable Döner merkezinde Android

iv = (ImageView) findViewById(R.id.iv); 
     iv.setImageResource(R.drawable.spinner_white_76); 

     Animation a = new RotateAnimation(0.0f, 360.0f, 
       Animation.RELATIVE_TO_SELF, iv.getDrawable() 
         .getIntrinsicWidth()/2, Animation.RELATIVE_TO_SELF, 
       iv.getDrawable().getIntrinsicHeight()/2); 
     a.setRepeatCount(-1); 
     a.setDuration(1000); 

     iv.startAnimation(a); 

nedir eksen noktası (çekilebilir merkezi) belirtmek için doğru yolu?

cevap

54

Aptal hissedin! Senin nesne (örneğin 5px sol dolguya ve 0px sağ dolgu) asimetrik dolgu varsa bu çalışmaz

Animation a = new RotateAnimation(0.0f, 360.0f, 
       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 
       0.5f); 
     a.setRepeatCount(-1); 
     a.setDuration(1000); 
+16

ekleme: İşte kod , dönüşü biraz daha yumuşak hale getirir. –

+1

180 derece döndürmek istiyorum ama tekrarlama yok. Döndükten sonra, nesne son durumunda olacak, ne demek istediğim, başlangıç ​​pozisyonunda geri gelmeyecek. Bunu nasıl yapabilirim? –

+2

@Md Omar Faroque Anik: "a.setFillAfter (true)" ifadesini ekleyin; dönüşümü kalıcı hale getirmek ve "a.setRepeatCount (0);" tekrarlama için. – Bubu

5

Not dolgu çünkü: yakından belgeleri okuyarak biraz zaman geçirdikten sonra işe Anladım nesnenin bir parçası olarak kabul edilir. Bu, hesaplanan merkezin dengeleneceği anlamına gelir.

Buna bir çözüm, mizanpaj nedenleriyle dolgu kullanıyorsanız, kenar boşluklarını dolgu yerine kullanmaktır. API'nin marjlarla ilgili olarak söylediği gibi: "Bu alan, bu görüşün sınırları dışındadır." (ViewGroup.MarginLayoutParams)

Bu, kenar boşluklarının dolgu yapacağı gibi dönmeyeceği anlamına gelir.

+0

RotateAnimation'ın Margins'i düşünmesini nasıl söyleyebilirim? –

3

Bu soruların başlığı Çizilebilir Merkezinin etrafında dönüyor (ve tam olarak araştırıyordum, bulamadım ve bunu uygulamak zorunda kaldım) çözümüm/yanıtımı göndermek istiyorum.

Herhangi bir çekilebilen ve dönmesine izin veren özel çekilebilir yazı yazdım. "A.setInterpolator (yeni LinearInterpolator());"

public class RotatableDrawable extends DrawableWrapper { 

    private float rotation; 
    private Rect bounds; 
    private ObjectAnimator animator; 
    private long defaultAnimationDuration; 

    public RotatableDrawable(Resources resources, Drawable drawable) { 
     super(vectorToBitmapDrawableIfNeeded(resources, drawable)); 
     bounds = new Rect(); 
     defaultAnimationDuration = resources.getInteger(android.R.integer.config_mediumAnimTime); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     copyBounds(bounds); 
     canvas.save(); 
     canvas.rotate(rotation, bounds.centerX(), bounds.centerY()); 
     super.draw(canvas); 
     canvas.restore(); 
    } 

    public void rotate(float degrees) { 
     rotate(degrees, defaultAnimationDuration); 
    } 

    public void rotate(float degrees, long millis) { 
     if (null != animator && animator.isStarted()) { 
      animator.end(); 
     } else if (null == animator) { 
      animator = ObjectAnimator.ofFloat(this, "rotation", 0, 0); 
      animator.setInterpolator(new AccelerateDecelerateInterpolator()); 
     } 
     animator.setFloatValues(rotation, degrees); 
     animator.setDuration(millis).start(); 
    } 

    @AnimatorSetter 
    public void setRotation(float degrees) { 
     this.rotation = degrees % 360; 
     invalidateSelf(); 
    } 

    /** 
    * Workaround for issues related to vector drawables rotation and scaling: 
    * https://code.google.com/p/android/issues/detail?id=192413 
    * https://code.google.com/p/android/issues/detail?id=208453 
    */ 
    private static Drawable vectorToBitmapDrawableIfNeeded(Resources resources, Drawable drawable) { 
     if (drawable instanceof VectorDrawable) { 
      Bitmap b = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
      Canvas c = new Canvas(b); 
      drawable.setBounds(0, 0, c.getWidth(), c.getHeight()); 
      drawable.draw(c); 
      drawable = new BitmapDrawable(resources, b); 
     } 
     return drawable; 
    } 
} 
+0

@AnimatorSetter nedir? –

+0

Oops ... Sadece benim özel ek açıklama. Bu yöntem aslında animasyon için kullanılan ProGuard ve Android stüdyoya göstermek için kullanıyorum. (ObjectAnimator.ofFloat (bu, "rotation", 0, 0); yürütme sırasında setRotation'ı çağırır) – GregoryK

+0

ProGuard ve VectorDrawable'da tutulması gereken bu sınıf, Lollipop'un önünde çökmesine neden olur, ancak vektörel drawables kullanmadığınız sürece buna gerek yoktur . –

İlgili konular