2009-11-06 18 views
5

İki düğmenin konumunu değiştirmeye çalışıyorum. Benim takas kodu görünüyor:İki düğmenin animasyonlu takas konumu

private void exchangeButtons(Button btn1, Button btn2) { 
    // Create the animation set 
    AnimationSet exchangeAnimation = new AnimationSet(true); 
    TranslateAnimation translate = new TranslateAnimation(
     Animation.RELATIVE_TO_SELF, btn2.getLeft(), 
     Animation.RELATIVE_TO_SELF, btn1.getLeft(), 
     Animation.RELATIVE_TO_SELF, btn2.getRight(), 
     Animation.RELATIVE_TO_SELF, btn1.getRight()); 
    translate.setDuration(500); 
    exchangeAnimation.addAnimation(translate); 
    //int fromX = btn1.getLeft(); 
    //int fromY = btn1.getRight(); 
    //int toX = btn2.getLeft(); 
    //int toY = btn2.getRight(); 
    Log.d("ArrangeMe", 
     "view1 pos:" + btn1.getLeft() + ", 
     " +btn1.getRight() + "view2 pos:" + 
     btn2.getLeft() + ", " + btn2.getRight()); 
    AnimationSet exchangeAnimation1 = new AnimationSet(true); 
    TranslateAnimation translate1 = new TranslateAnimation( 
     Animation.RELATIVE_TO_SELF, btn1.getLeft(), 
     Animation.RELATIVE_TO_SELF, btn2.getLeft(), 
     Animation.RELATIVE_TO_SELF, btn1.getRight(), 
     Animation.RELATIVE_TO_SELF, btn2.getRight()); 
    translate1.setDuration(500); 
    exchangeAnimation1.addAnimation(translate1); 
    // EXECUTE btn1.startAnimation(exchangeAnimation); 
    btn2.startAnimation(exchangeAnimation1); 
} 

ben aşağıdaki kodu çağırır:

exchangeButtons(button1, button2); 

My düzen olarak aşağıda görünüyor: Ben kodu çalıştırmak zaman

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <Button 
     android:text="One" 
     android:id="@+id/button1" 
     android:layout_height="70px" 
     android:layout_width="70px" 
     android:layout_weight="1"> 
    </Button> 
    <Button 
     android:text="Two" 
     android:id="@+id/button2" 
     android:layout_height="70px" 
     android:layout_width="70px" 
     android:layout_weight="1"> 
    </Button> 
</LinearLayout> 

ne olur:

Konumlarını değiştiren düğmeler yerine, sadece bir süreliğine kaybolurlar [ 500 ms olabilir ve başlangıçta olduğu gibi tekrar görünebilir.

Bu sorun nasıl çözülür? Cihazda düzgün çalışacak mı?

+0

kodu koyun deneyin? –

cevap

1

Android'in TranslateAnimation, bileşenlerinizi yeniden konumlandırmaz, sadece yapmak istediğiniz geçişi canlandırır - bundan sonra, bileşeninizin düzen paramillerini değiştirmeniz size bağlıdır (bu post ürününe bakın).

P.S. Yepyeni bir animasyon seti kullanmadan doğrudan çevirme animasyonunu kullanabilirsiniz. Bir başka güzel şey, düzeniniz şişirildiğinde animasyonları oluşturmak ve yeni boyutları kullanarak yeniden oluşturmak için onSizeChanged(int, int, int, int)'u geçersiz kılmak olacaktır.

Kullandığınız düzen nedir?

3

Kullanıcı arabiriminden hiçbiri henüz ölçülmediğinden, UI ekrana çizilmediğinden, getRight değerini onCreate öğesinde alamıyorsunuz. Bu

ViewTreeObserver vto = btn1.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     btn1.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     int left = btn1.getLeft(); 
    } 
}); 

bu sorunları çözdü mü onCreate yöntemle