2015-05-11 11 views
45

Ben TasarımAndroid Malzeme ile entegre etrafında farklı işlevleri gitmeye çalışıyorum ama bir görünüm böyle başka ne zaman kapladığını animasyonun bu tür yapmak için can not:Materyal Tasarımı Animasyonu ile başka bir görünüm nasıl doldurulur?

siz ya bunu nasıl biliyor musunuz Bir kütüphane/proje bunu yapan bir örnek mi?

enter image description here

+0

, "Sorular bir kitap, araç, ** yazılım kütüphanesi, öğretici veya diğer tesis dışı kaynak tavsiye veya bulmamızı isteyen * konu dışı olan * Yığın Taşması için. " – LittleBobbyTables

+0

@LittleBobbyTables yazımın sorusunu kapatmadan lütfen değiştirin. Sadece nasıl yapılacağını bilmek istiyorum ve bence birçok insan için ilginç. –

+0

Bu bir Circular Reveal. Temelleri burada (https://developer.android.com/training/material/animations.html) –

cevap

28

bunu çözüm pathInterpolator ve bu etkinin adı Kavisli Hareket olduğunu.

Materyal tasarımındaki animasyonlar, zaman enterpolasyonu için eğrilerine ve uzamsal hareket kalıplarına dayanır. Yukarıdaki Android 5.0 (API seviye 21) ve ile animasyonlar için özel zamanlama eğrilerini ve eğri hareket desenlerini tanımlayabilirsiniz. HERE GitHub'dan

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

Ve örnek:

Burada nasıl uygulamaya görebilirsiniz

enter image description here

+5

bulabilirsiniz, ancak API 21'in altında nasıl yapılır? –

+1

İyi soru, bence bu imkansız veya çok karmaşık ve çok verimli değil. –

45

Ben API 21

altında bu uygulamaya çalışmıştır

gradle dependancy eklemek

Benim aktivite xml olduğu
dependencies { 
     compile 'com.github.ozodrukh:CircularReveal:[email protected]' 
    } 

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> 

Benim Etkinlik java

olduğunu

yakın nedenlerden Başına 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

İnanılmaz teşekkür ederim. Mükemmel olmak için, yüzer düğmenizin yüksekliğini, görünümle birleştiği izlenimini vermek için değiştirebileceğinizi düşünüyorum (örnekte olduğu gibi). Sadece bir soru, CircularReveal etkisi, örnekteki veya ortasındaki açıdan mı geliyor? –

+0

, başlangıç ​​animasyonundan ve düğme animasyonunun bittiği yerden itibaren oradan ortaya çıkar. –

+1

El ile ödül verdim ve oy verdim;). –