2015-05-11 12 views
45

sto cercando di andare in giro diverse funzionalità integrate con Materiale Android design ma non posso fare questo tipo di animazione quando una vista riempire un altro genere:Come riempire una vista con un'altra con Animazione disegno materiale?

Sai come si fa o una biblioteca/progetto un esempio che fa questo?

enter image description here

+0

Per le ragioni stretti, "Domande che ci chiede di consigliare o trovare un libro, strumento, ** libreria software, tutorial o altra risorsa off-site sono off-topic * * per Stack Overflow. " – LittleBobbyTables

+0

@LittleBobbyTables si prega di cambiare la domanda del mio post senza chiuderla. Voglio solo sapere come farlo e penso che sia interessante per molte persone. –

+0

È una rivelazione circolare. Puoi trovare le basi [qui] (https://developer.android.com/training/material/animations.html) –

risposta

28

La soluzione per farlo è pathInterpolator e il nome di questo effetto è movimento curvo.

Le animazioni nel design del materiale si basano sulle curve per l'interpolazione temporale e sui modelli di spostamento spaziale. Con Android 5.0 (livello API 21) e sopra, è possibile definire curve temporali personalizzate e modelli di movimento curvi per le animazioni.

Si può vedere come implementare qui:

http://developer.android.com/training/material/animations.html#CurvedMotion

e il campione su GitHub HERE:

enter image description here

+5

ma come farlo sotto l'API 21? –

+1

Buona domanda, penso che sia impossibile o molto complicata e non molto efficiente. –

45

ho cercato di attuare questa sotto API 21

aggiungere dipendenza Gradle

dependencies { 
     compile 'com.github.ozodrukh:CircularReveal:[email protected]' 
    } 

mia attività XML è

activity_reval_anim.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".RevalAnimActivity"> 

    <ImageView 
     android:id="@+id/img_top" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" 
     android:background="@color/color_primary" 

     android:src="@drawable/ala"/> 


    <io.codetail.widget.RevealLinearLayout 

     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:layout_below="@+id/img_top" 
     android:background="@color/color_primary"> 
     <LinearLayout 
      android:visibility="invisible" 
      android:id="@+id/ll_reveal" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@color/color_accent" 
      android:orientation="horizontal" 
      ></LinearLayout> 

    </io.codetail.widget.RevealLinearLayout> 
    <ImageButton 
     android:id="@+id/img_floating_btn" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="40dp" 
     android:layout_marginTop="170dp" 
     android:background="@drawable/expand_btn"/> 
</RelativeLayout> 

La mia attività è java

RevalAnimActivity.java

public class RevalAnimActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_reval_anim); 

     final ImageButton mFloatingButton = (ImageButton) findViewById(R.id.img_floating_btn); 
     mFloatingButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       animateButton(mFloatingButton); 


      } 


     }); 

    } 

    private void animateButton(final ImageButton mFloatingButton) { 

     mFloatingButton.animate().translationXBy(0.5f).translationY(150).translationXBy(-0.9f) 
       .translationX(-150). setDuration(300).setListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 

       animateReavel((int) mFloatingButton.getX(), 150,mFloatingButton); 
      } 
     }); 

    } 

    private void animateReavel(int cx, int cy, final ImageButton mFloatingButton) { 


     final View myView = findViewById(R.id.ll_reveal); 

     // get the final radius for the clipping circle 
     float finalRadius = hypo(myView.getWidth(), myView.getHeight()); 

     SupportAnimator animator = 
       ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius); 
     animator.addListener(new SupportAnimator.AnimatorListener() { 
      @Override 
      public void onAnimationStart() { 
       mFloatingButton.setVisibility(View.INVISIBLE); 
       myView.setVisibility(View.VISIBLE); 
      } 

      @Override 
      public void onAnimationEnd() { 
       Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_LONG) 
         .show(); 
      } 

      @Override 
      public void onAnimationCancel() { 
      } 

      @Override 
      public void onAnimationRepeat() { 
      } 
     }); 
     animator.setInterpolator(new AccelerateDecelerateInterpolator()); 
     animator.setDuration(1000); 
     animator.start(); 

    } 

    static float hypo(int a, int b) { 
     return (float) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)); 
    } 


} 
+1

Incredibile grazie. Per essere perfetto, penso che puoi modificare l'altezza del tuo pulsante mobile per dare l'impressione che si unisca alla vista (esattamente come nell'esempio). Solo una domanda, l'effetto CircularReveal viene dall'angolo come nell'esempio o nel mezzo? –

+0

dall'angolo la sua animazione di inizio e dove termina l'animazione del pulsante inizia a rivelare da lì –

+1

Ho assegnato manualmente il taglia e voto su;). –