2012-10-16 5 views
5

(android 2.2 ve üstü üzerine) gelecek animasyon yapmak gerekiyor aşağıdan yukarıya doğru (Ona tekrar tıkladıktan sonra).Üst çevirmek animasyon

İlk animasyon iyi çalışıyor, ancak ikincisi değil, btn "yukarıdan aşağıya atlar" ve "canlandırma" değil.

Kodu:

public class MainActivity extends Activity { 

static RelativeLayout relativeLayout; 
static Button btn; 
static Boolean isUp = true; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btn = (Button) findViewById(R.id.button1); 
    relativeLayout = (RelativeLayout) findViewById(R.id.relative_layout); 

    btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      if(isUp){ 
       isUp = false; 
       v.startAnimation(MainActivity.getVerticalSlideAnimation(0,relativeLayout.getBottom() - v.getHeight(),500,0)); 
      }else{ 
       isUp = true; 
       v.startAnimation(MainActivity.getVerticalSlideAnimation(relativeLayout.getBottom() - v.getHeight(),0,500,0)); 
      } 
     } 
    }); 
} 


public static Animation getVerticalSlideAnimation(int fromYPosition, final int toYPosition, int duration, int startOffset) 
{ 
    TranslateAnimation translateAnimation = new TranslateAnimation(1, 0.0F, 1, 0.0F, 0, fromYPosition, 0, toYPosition); 
    translateAnimation.setDuration(duration); 
    translateAnimation.setInterpolator(new AccelerateInterpolator()); 
    translateAnimation.setStartOffset(startOffset); 

    //Stop animation after finishing. 
    //translateAnimation.setFillAfter(true); 

    translateAnimation.setAnimationListener(new AnimationListener() 
    { 
    public void onAnimationStart(Animation animation) { } 
    public void onAnimationRepeat(Animation animation) { } 
    public void onAnimationEnd(Animation animation) { 
     btn.setY(toYPosition);   
    } 
    }); 

    return translateAnimation; 
    } 
} 

Düzen:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/relative_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:text="Button" /> 

</RelativeLayout> 

cevap

10

Tamam, ben onu çözdüm.

Eğer animasyon hakkında bilmeniz gereken birkaç Issuses vardır:

  1. animasyon parametrelerine "(sabit pozisyon) Gönderen" basit değildir -> "(düzeltme pozisyonuna) için" gibi düşünmek gerekir. "Kimden (şu anki konum/0)" -> "Hangi yönde ve hangi yönde (pozitif/eksi negatif için işaret)"

  2. Gerçekleşme Animasyon gerçek konumu değiştirmez Eğer son konumda animasyonu durdurmak istiyorsanız ekranda bakış, Bu nedenle, kullanmalısınız:

    animation.setFillAfter(true); 
    
  3. Eğer görünüm parametrelerini güncellemek gerektiğini bakış GERÇEK konumunu değiştirmek istiyorum yoksa "onAnimationEnd" üzerinde (aşağıdaki kodda olduğu gibi) veya pozisyonu hesaplayın ve Y/X konumunu manuel olarak ayarlayın (tekrar "onAnimationEnd" de), örneğin:

    animatedView.setY(stopPosition); 
    

Kodu:

public class AnimationActivity extends Activity { 

    private boolean isUp; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ((Button) findViewById(R.id.button1)) 
      .setOnClickListener(new OnClickListener() { 

       public void onClick(final View v) { 

        final float direction = (isUp) ? -1 : 1; 
        final float yDelta = getScreenHeight() - (2 * v.getHeight()); 
        final int layoutTopOrBottomRule = (isUp) ? RelativeLayout.ALIGN_PARENT_TOP : RelativeLayout.ALIGN_PARENT_BOTTOM; 

        final Animation animation = new TranslateAnimation(0,0,0, yDelta * direction); 

        animation.setDuration(500); 

        animation.setAnimationListener(new AnimationListener() { 

         public void onAnimationStart(Animation animation) { 
         } 

         public void onAnimationRepeat(Animation animation) { 
         } 

         public void onAnimationEnd(Animation animation) { 

          // fix flicking 
          // Source : http://stackoverflow.com/questions/9387711/android-animation-flicker 
          TranslateAnimation anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f); 
          anim.setDuration(1); 
          v.startAnimation(anim); 


          //set new params 
          LayoutParams params = new LayoutParams(v.getLayoutParams()); 
          params.addRule(RelativeLayout.CENTER_HORIZONTAL); 
          params.addRule(layoutTopOrBottomRule); 
          v.setLayoutParams(params); 
         } 
        }); 

        v.startAnimation(animation); 

        //reverse direction 
        isUp = !isUp; 
       } 
      }); 
} 

private float getScreenHeight() { 

    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    return (float) displaymetrics.heightPixels; 

} 

}

+0

gerçekten yararlı .Ben ise sürekli ve konumu her zaman alma yukarıdan aşağıya doğru bir görünüm taşıma bilmesini istiyorum Her adımdan sonraki adıma geçer. Animasyon kullanarak nasıl uygulanır? Diğer yöntemleri mevcut mu? Son amacım, hareketli bir görüşle bu görüş arasındaki çarpışmayı tespit etmektir. – Ajay

-1
public class AnimationActivity extends Activity { 

    private boolean isUp; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ((Button) findViewById(R.id.button1)) 
      .setOnClickListener(new OnClickListener() { 

       public void onClick(final View v) { 

        final float direction = (isUp) ? -1 : 1; 
        final float yDelta = getScreenHeight() - (2 * v.getHeight()); 
        final int layoutTopOrBottomRule = (isUp) ? RelativeLayout.ALIGN_PARENT_TOP : RelativeLayout.ALIGN_PARENT_BOTTOM; 

        final Animation animation = new TranslateAnimation(0,0,0, yDelta * direction); 

        animation.setDuration(500); 

        animation.setAnimationListener(new AnimationListener() { 

         public void onAnimationStart(Animation animation) { 
         } 

         public void onAnimationRepeat(Animation animation) { 
         } 

         public void onAnimationEnd(Animation animation) { 

          // fix flicking 
          // Source : http://stackoverflow.com/questions/9387711/android-animation-flicker 
          TranslateAnimation anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f); 
          anim.setDuration(1); 
          v.startAnimation(anim); 


          //set new params 
          LayoutParams params = new LayoutParams(v.getLayoutParams()); 
          params.addRule(RelativeLayout.CENTER_HORIZONTAL); 
          params.addRule(layoutTopOrBottomRule); 
          v.setLayoutParams(params); 
         } 
        }); 

        v.startAnimation(animation); 

        //reverse direction 
        isUp = !isUp; 
       } 
      }); 
} 

private float getScreenHeight() { 

    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    return (float) displaymetrics.heightPixels; 

} 
+0

yardım için teşekkürler. –

+0

Düğmesine döküm yapmadan onClickListener'ı kolayca ayarlayabilirsiniz. Yukarıdaki kodu kopyalayıp yapıştırdınız. – Denny