超实用!Material-Animations项目扩展与自定义开发指南

超实用!Material-Animations项目扩展与自定义开发指南

【免费下载链接】Material-Animations Android Transition animations explanation with examples. 【免费下载链接】Material-Animations 项目地址: https://gitcode.com/gh_mirrors/ma/Material-Animations

你是否还在为Android应用的过渡动画效果单调而烦恼?是否想让界面切换更加流畅自然,提升用户体验?本文将带你深入探索Material-Animations项目的扩展与自定义开发,通过实例讲解如何轻松实现各种炫酷的动画效果,让你的应用脱颖而出。读完本文,你将掌握Activity过渡动画、共享元素动画、场景转换动画等多种动画效果的扩展与自定义方法,能够根据实际需求定制独特的动画效果。

项目概述

Material-Animations项目是一个专注于Android过渡动画(Transition animations)示例的开源项目,展示了如何利用Android Transition Framework实现各种精美的动画效果。该项目包含了丰富的示例代码和资源,为开发者提供了学习和参考的绝佳素材。项目的主要功能包括Activity之间的过渡动画、共享元素(Shared Element)动画、同一Activity内的场景转换动画以及圆形揭示(Circular Reveal)动画等。

项目的核心代码位于app/src/main/java/com/lgvalle/material_animations目录下,包含了多个Activity和Fragment类,分别演示不同类型的动画效果。布局文件位于app/src/main/res/layout目录,动画资源定义在app/src/main/res/transition目录。

Activity过渡动画扩展

Activity过渡动画是提升应用用户体验的重要手段,Material-Animations项目提供了Explode、Slide和Fade三种预定义的过渡动画。我们可以在此基础上进行扩展,创建更加丰富多样的过渡效果。

自定义过渡动画

要自定义Activity过渡动画,首先需要在res/transition目录下创建自定义的过渡动画XML文件。例如,我们可以创建一个结合Slide和Fade效果的过渡动画文件custom_transition.xml:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500">
    <slide android:slideEdge="start">
        <targets>
            <target android:targetId="@id/title" />
        </targets>
    </slide>
    <fade>
        <targets>
            <target android:excludeId="@id/title" />
        </targets>
    </fade>
</transitionSet>

然后在对应的Activity中,通过getWindow().setEnterTransition()getWindow().setExitTransition()方法设置自定义的过渡动画。以TransitionActivity1为例,我们可以修改其setupWindowAnimations()方法:

private void setupWindowAnimations() {
    Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.custom_transition);
    getWindow().setEnterTransition(transition);
}

控制过渡动画时长

通过设置过渡动画的duration属性,可以控制动画的播放速度。在XML文件中,可以直接添加android:duration属性:

<fade xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"/>

也可以在代码中通过setDuration()方法动态设置:

Fade fade = new Fade();
fade.setDuration(1000);
getWindow().setEnterTransition(fade);

示例效果

以下是几种不同过渡动画的效果展示:

Explode过渡效果: transition_explode

Slide过渡效果: transition_slide

Fade过渡效果: transition_fade

共享元素动画高级应用

共享元素动画可以让两个Activity或Fragment之间的指定元素平滑过渡,创造出连贯的视觉效果。Material-Animations项目中的SharedElementActivity和相关Fragment展示了基本的共享元素动画实现,我们可以在此基础上进行扩展和优化。

多个共享元素

除了单个元素的共享,我们还可以实现多个元素的同时共享。例如,在列表项点击跳转到详情页时,同时共享图片和标题文字。

首先,在两个布局文件中为需要共享的元素设置相同的android:transitionName属性:

列表项布局(row_sample.xml):

<ImageView
    android:id="@+id/image"
    android:transitionName="image_transition" />
<TextView
    android:id="@+id/title"
    android:transitionName="title_transition" />

详情页布局(activity_sharedelement.xml):

<ImageView
    android:id="@+id/detail_image"
    android:transitionName="image_transition" />
<TextView
    android:id="@+id/detail_title"
    android:transitionName="title_transition" />

然后在启动Activity时,使用ActivityOptions.makeSceneTransitionAnimation()方法传入多个共享元素对:

Intent intent = new Intent(this, SharedElementActivity.class);
Pair<View, String> imagePair = Pair.create(imageView, "image_transition");
Pair<View, String> titlePair = Pair.create(titleView, "title_transition");
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, imagePair, titlePair);
startActivity(intent, options.toBundle());

自定义共享元素动画

通过自定义Transition,可以实现更加复杂的共享元素动画效果。例如,我们可以创建一个结合缩放和旋转的动画:

ChangeBounds changeBounds = new ChangeBounds();
changeBounds.setDuration(500);
changeBounds.setInterpolator(new OvershootInterpolator());

Rotate rotate = new Rotate();
rotate.setDuration(500);

TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(changeBounds);
transitionSet.addTransition(rotate);

getWindow().setSharedElementEnterTransition(transitionSet);

共享元素动画监听器

利用TransitionListener,我们可以在共享元素动画的不同阶段执行额外的操作,例如在动画结束后加载数据或显示其他元素。

在SharedElementActivity中,可以为共享元素过渡动画添加监听器:

getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {
    @Override
    public void onTransitionEnd(Transition transition) {
        // 动画结束后执行操作,如加载详情数据
        loadDetails();
    }
    // 其他回调方法...
});

示例效果

共享元素动画效果展示: shared_element_anim

场景转换动画扩展

场景转换动画允许我们在同一个Activity中,通过定义不同的场景(Scene)来实现布局的动态切换,Material-Animations项目中的AnimationsActivity1和AnimationsActivity2演示了基本的场景转换,我们可以进一步扩展其功能。

自定义场景转换动画

除了项目中提供的默认场景转换动画,我们可以创建自定义的转换动画。例如,创建一个包含缩放和淡入淡出效果的组合动画:

custom_scene_transition.xml:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeBounds android:duration="500" />
    <scale android:duration="500" />
    <fade android:duration="300" />
</transitionSet>

然后在代码中使用该动画进行场景转换:

Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.custom_scene_transition);
TransitionManager.go(scene2, transition);

动态修改场景

我们可以在运行时动态修改场景中的视图属性,而不仅仅是切换预定义的场景。例如,通过点击按钮改变视图的颜色和大小:

public void onChangeScene(View view) {
    TransitionManager.beginDelayedTransition(sceneRoot);
    // 修改视图属性
    View square = sceneRoot.findViewById(R.id.square);
    ViewGroup.LayoutParams params = square.getLayoutParams();
    params.width = 500;
    params.height = 500;
    square.setLayoutParams(params);
    square.setBackgroundColor(getResources().getColor(R.color.red));
}

场景转换监听器

与共享元素动画类似,场景转换动画也可以添加监听器,以便在转换过程中执行额外操作:

transition.addListener(new Transition.TransitionListener() {
    @Override
    public void onTransitionStart(Transition transition) {
        // 转换开始时隐藏某些元素
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void onTransitionEnd(Transition transition) {
        // 转换结束后显示数据
        dataView.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.GONE);
    }
    // 其他回调方法...
});
TransitionManager.go(scene, transition);

示例效果

场景转换动画效果: scene-transition

圆形揭示动画创意实现

圆形揭示动画(Circular Reveal)可以从一个点扩展显示或收缩隐藏视图,Material-Animations项目中的RevealActivity展示了基本用法,我们可以在此基础上创造更多创意效果。

从不同位置揭示

除了中心位置,我们可以从视图的任意位置开始揭示动画。例如,从点击位置开始:

public void revealFromClick(View view) {
    int x = (int) view.getX() + view.getWidth() / 2;
    int y = (int) view.getY() + view.getHeight() / 2;
    animateRevealColorFromCoordinates(findViewById(R.id.reveal_root), x, y, R.color.blue);
}

结合颜色变化

在揭示动画过程中,我们还可以同时改变视图的背景颜色,创造更加丰富的视觉效果:

private void animateRevealColor(View viewRoot, int color) {
    int cx = (viewRoot.getLeft() + viewRoot.getRight()) / 2;
    int cy = (viewRoot.getTop() + viewRoot.getBottom()) / 2;
    animateRevealColorFromCoordinates(viewRoot, cx, cy, color);
}

private Animator animateRevealColorFromCoordinates(final View viewRoot, int x, int y, final int color) {
    float finalRadius = (float) Math.hypot(viewRoot.getWidth(), viewRoot.getHeight());
    Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, x, y, 0, finalRadius);
    viewRoot.setBackgroundColor(getResources().getColor(color));
    anim.start();
    return anim;
}

揭示动画与其他动画结合

我们可以将圆形揭示动画与其他动画效果结合使用,例如在揭示完成后执行视图的缩放动画:

anim.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationEnd(Animator animation) {
        // 揭示动画结束后执行缩放动画
        ScaleAnimation scale = new ScaleAnimation(1f, 1.2f, 1f, 1.2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        scale.setDuration(300);
        scale.setFillAfter(true);
        view.startAnimation(scale);
    }
    // 其他回调方法...
});

示例效果

不同位置的圆形揭示动画: reveal_blue reveal_green reveal_red reveal_yellow

项目扩展实战

通过对Material-Animations项目的扩展,我们可以实现更加复杂和个性化的动画效果。下面介绍两个实用的扩展案例。

案例一:列表项点击动画优化

在MainActivity的列表中,每个列表项的点击效果可以更加丰富。我们可以为列表项添加点击时的缩放和颜色变化动画,并与详情页的共享元素动画无缝衔接。

首先,修改row_sample.xml,为列表项添加点击反馈动画:

<LinearLayout
    android:id="@+id/row_container"
    android:background="?attr/selectableItemBackground"
    android:onClick="onItemClick">
    <!-- 列表项内容 -->
</LinearLayout>

然后在SamplesRecyclerAdapter的onBindViewHolder方法中,为列表项设置点击事件,准备共享元素动画:

@Override
public void onBindViewHolder(final SamplesViewHolder viewHolder, final int position) {
    final Sample sample = samples.get(position);
    viewHolder.bind(sample);
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(viewHolder.itemView.getContext(), sample.getActivityClass());
            Pair<View, String> pairImage = Pair.create((View) viewHolder.image, "image_transition");
            Pair<View, String> pairTitle = Pair.create((View) viewHolder.title, "title_transition");
            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                (Activity) viewHolder.itemView.getContext(), pairImage, pairTitle);
            viewHolder.itemView.getContext().startActivity(intent, options.toBundle());
        }
    });
}

案例二:自定义过渡动画工具类

为了方便在项目中复用各种过渡动画,我们可以创建一个自定义的过渡动画工具类TransitionHelper,封装常用的动画创建和配置方法。

public class TransitionHelper {
    // 创建Explode过渡动画
    public static Transition createExplodeTransition(int duration) {
        Explode explode = new Explode();
        explode.setDuration(duration);
        explode.setInterpolator(new DecelerateInterpolator());
        return explode;
    }

    // 创建Slide过渡动画
    public static Transition createSlideTransition(int duration, int gravity) {
        Slide slide = new Slide(gravity);
        slide.setDuration(duration);
        slide.excludeTarget(android.R.id.statusBarBackground, true);
        return slide;
    }

    // 创建共享元素过渡动画
    public static TransitionSet createSharedElementTransition() {
        TransitionSet transitionSet = new TransitionSet();
        transitionSet.addTransition(new ChangeBounds());
        transitionSet.addTransition(new ChangeTransform());
        transitionSet.addTransition(new ChangeImageTransform());
        return transitionSet;
    }

    // 为Activity设置过渡动画
    public static void setupActivityTransitions(Activity activity, Transition enterTransition, Transition exitTransition) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            activity.getWindow().setEnterTransition(enterTransition);
            activity.getWindow().setExitTransition(exitTransition);
            activity.getWindow().setAllowEnterTransitionOverlap(true);
            activity.getWindow().setAllowReturnTransitionOverlap(true);
        }
    }
}

在需要使用过渡动画的Activity中,可以直接调用该工具类的方法:

Transition enterTransition = TransitionHelper.createSlideTransition(500, Gravity.START);
Transition exitTransition = TransitionHelper.createExplodeTransition(500);
TransitionHelper.setupActivityTransitions(this, enterTransition, exitTransition);

总结与展望

通过本文的介绍,我们深入了解了Material-Animations项目的结构和核心动画实现,并学习了如何扩展和自定义各种动画效果,包括Activity过渡动画、共享元素动画、场景转换动画和圆形揭示动画等。

这些动画效果可以显著提升应用的用户体验,使界面交互更加生动和友好。在实际开发中,我们可以根据项目需求,灵活运用这些动画技术,创造出独特的视觉效果。

未来,我们还可以进一步探索动画性能优化、复杂交互场景的动画设计等高级主题,不断提升应用的视觉品质和用户体验。

希望本文对你的Android动画开发有所帮助,如果你有任何问题或创意,欢迎在项目中提交issue或Pull Request,让我们一起完善这个动画示例项目!

【免费下载链接】Material-Animations Android Transition animations explanation with examples. 【免费下载链接】Material-Animations 项目地址: https://gitcode.com/gh_mirrors/ma/Material-Animations

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值