2012-10-16 12 views
5

bisogno di fare animazione successiva (su Android 2.2 e superiori):Dall'alto in basso - traduce animazione

pulsante 1.Moving dall'alto verso il basso (dopo aver cliccato su di lui),

2.Moving ritorno da dal basso verso l'alto (dopo aver cliccato di nuovo su di lui).

Prima animazione funziona bene, ma il secondo no, il btn "salta" dal basso verso l'alto e non animato.

Codice:

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; 
    } 
} 

Disposizione:

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

risposta

10

Ok, ho risolto.

ci sono pochi issuses che è necessario conoscere l'animazione:

  1. Le paremeters di animazione non sono semplici "Da (posizione fissa)" -> "A (posizione fissa)" come si dovrebbe pensare. Ci sono più come "Da (posizione attuale/0)" -> "Quanti passi fare e in quale direzione (pluso per positivo/negativo per negativo)"

  2. L'animazione non cambia la posizione reale della vista sullo schermo, quindi se si vuole interrompere l'animazione alla posizione finale, è necessario utilizzare:

    animation.setFillAfter(true); 
    
  3. Se si vuole cambiare la posizione reale della vista è necessario aggiornare i parametri di vista su "onAnimationEnd" (come sotto il codice), o calcolare la posizione e impostare manualmente la posizione Y/X (sempre su "onAnimationEnd"), ad esempio:

    animatedView.setY(stopPosition); 
    

Il Codice:

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

è davvero utile .Io voglio sapere che il modo di spostare una vista dall'alto verso il basso in modo continuo e ottenere la sua posizione ogni volta passa da ogni passaggio al passaggio successivo. Come implementarlo usando l'animazione? È disponibile un altro metodo? Il mio scopo finale è quello di rilevare la collisione tra una vista in movimento e questa vista? grazie per l'aiuto – 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

puoi semplicemente impostare onClickListener senza eseguire il cast sul pulsante –

+0

Hai appena copiato il codice dall'alto e incollato .... – Denny

Problemi correlati