塑造Android材质设计

Sam*_*nto 5 android shapedrawable material-design android-5.0-lollipop

我想问一下如何在android材质设计中创建动画来改变形状.这是我从Android Material Design指南中获得的视频.

材料可以改变形状

谢谢.

mem*_*izr 7

这是您链接到的动画的快速实现.它CardView在支持库中使用,加上一个自定义PathInterpolator,使其更像是在视频中移动(默认情况下AccelerateDecelerateInterpolator太突然,但你在Lollipop前设备中使用它).这不是一件艺术品,但希望这可以让你了解这些纸质动画的一种可能方式.

这是演示视频https://drive.google.com/file/d/0B7TH7VeIpgSQYkx2TVlSakZidXM/view.

final int origSize = getResources().getDimensionPixelSize(R.dimen.original_size);
final int origRadius = getResources().getDimensionPixelSize(R.dimen.original_radius);
final int targetRadius1 = getResources().getDimensionPixelSize(R.dimen.target_radius_1);
final int targetRadius2 = getResources().getDimensionPixelSize(R.dimen.target_radius_2);

final int targetSize1 = origSize * 2;
final int targetSize2 = origSize * 4;

final int ANIMATION_INTERVAL_MS = 600;
final int ANIMATION_DURATION_MS = 700;

private void doMaterialAnimation() {

    ValueAnimator va1 = ObjectAnimator.ofFloat(1, 0);
    va1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            transformMaterial(origSize, targetSize1, origRadius, targetRadius1, animation);
        }
    });

    ValueAnimator va2 = ObjectAnimator.ofFloat(1, 0);
    va2.setStartDelay(ANIMATION_INTERVAL_MS);
    va2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            transformMaterial(targetSize1, targetSize2, targetRadius1, targetRadius2, animation);
        }
    });

    ValueAnimator va3 = ObjectAnimator.ofFloat(1, 0);
    va3.setStartDelay(ANIMATION_INTERVAL_MS);
    va3.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            transformMaterial(targetSize2, origSize, targetRadius2, origRadius, animation);
        }
    });

    AnimatorSet aset = new AnimatorSet();
    aset.playSequentially(va1, va2, va3);
    aset.setDuration(ANIMATION_DURATION_MS);
    aset.setInterpolator(new PathInterpolator(0.75f, 0.1f, 0.25f, 0.9f));
    aset.start();
}

private void transformMaterial(int origSize,
                               int targetSize,
                               int origRadius,
                               int targetRadius,
                               ValueAnimator animation) {

    float fraction = (float) animation.getAnimatedValue();
    cardView.setRadius(interpolate(origRadius, targetRadius, fraction));

    cardView.getLayoutParams().width = cardView.getLayoutParams().height
            = (int) ((targetSize - origSize) * (1 - fraction) + origSize);
    cardView.requestLayout();
}

private float interpolate(int from, int to, float fraction) {
    return ((from - to) * fraction) + to;
}
Run Code Online (Sandbox Code Playgroud)

这是卡,仅供参考.

<android.support.v7.widget.CardView
    android:id="@+id/card"
    android:background="@color/background_material_light"
    app:cardCornerRadius="@dimen/original_radius"
    android:layout_centerInParent="true"
    android:layout_width="@dimen/original_size"
    android:layout_height="@dimen/original_size"
    >
Run Code Online (Sandbox Code Playgroud)