J'essaie de contourner différentes fonctionnalités intégrées à Android Material Design mais je ne peux pas faire ce type d'animation quand une vue en remplit une autre comme ça:
Savez-vous comment le faire ou une bibliothèque/projet un exemple qui fait cela?
La solution pour ce faire est pathInterpolator
et le nom de cet effet est Curved Motion .
Les animations dans la conception des matériaux reposent sur des courbes pour l'interpolation temporelle et les modèles de mouvement spatial. Avec Android 5.0 (API niveau 21) et supérieur, vous pouvez définir des courbes de synchronisation personnalisées et des modèles de mouvement incurvés pour les animations.
Vous pouvez voir comment l'implémenter ici:
http://developer.Android.com/training/material/animations.html#CurvedMotion
Et échantillon sur GitHub ICI :
J'ai essayé de l'implémenter ci-dessous API 21
ajouter une dépendance gradle
dependencies {
compile 'com.github.ozodrukh:CircularReveal:1.0.6@aar'
}
Mon xml d'activité est
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>
Mon activité Java is
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));
}
}